Python可以进行网络爬虫的故事已经不是新鲜事了,但是用爬虫开车抓图的老司机可数量不多。
这次要实现的是Python的”老司机功能”,利用了多个网络相关的模块:re正则表达式模块,用于解析html内的标签;os操作系统模块,用于管理文件;urllib网页模块,用于下载和转译html内容;urlparse网址解析模块,用于提取域名等信息。
废话不多说,驾照在此:
#coding=utf-8
import urllib
import re
import os
import urlparse
# 用于匹配正则式,返回匹配结果
# 用法regFind(表达式,文本内容)
def regFind(reg,text):
pattern = re.compile(reg)
return re.findall(pattern,text)
# 用于获取html源,返回对应文本内容
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
# 保存图片列表至对应路径
# 用法saveGraph(路径,图片url列表)
def saveGraph(readyPath,imglist):
x = 0
for imgurl in imglist:
urllib.urlretrieve(imgurl,readyPath+'\\%s.jpg' % x)
x += 1
return x
# 抽取html内的图像
def getImg(html):
imglist = regFind(r'' ,html) #解析图像列表
print "解析出图像" + str(len(imglist)) + '张'
titlelist = regFind(r'[\s\S]*([\s\S]*) [\s\S]*',html) #解析出标题
htmlTitle = titlelist[0] #从list中提取出title的字符串变量
print htmlTitle
readyPath = '.\\GraphFile\\'+htmlTitle
x = 0 # 图片计数器
if not (os.path.exists(readyPath) and len(os.listdir(readyPath)) == len(imglist) ):
# 如果不同时满足(文件夹存在和图片下载完整)则需要新下载所有内容
# 尝试创建目录
if not os.path.exists(readyPath):
try:
os.mkdir(readyPath)
except Exception,e:
print "文件夹创建异常:",htmlTitle,Exception,":",e # 防止新建文件夹异常
# 录建立后下载图片
if os.path.exists(readyPath):
x = saveGraph(readyPath,imglist)
print '获取图片' + str(x) + '张'
class Config():
def __init__(self,configFileName = 'store_html.ini'):
self.configFileName = configFileName
def LoadConfig(self):
if not os.path.exists(self.configFileName):
return ''
file_object = open(self.configFileName, 'r')
try:
fileText = file_object.read()
finally:
file_object.close()
return fileText
def SaveConfig(self,text):
file_object = open(self.configFileName, 'w')
try:
all_the_text = file_object.write(text)
finally:
file_object.close()
if __name__ == "__main__":
ConfigObj = Config()
webAddr = ConfigObj.LoadConfig()
if webAddr == '' :
print "目前没有读到上次结束的地址"
while 1:
text = input('输入一个url,退出输入exit: ')
if text == 'exit':
exit()
elif text != '':
webAddr = text
break
else:
print '输入无效'
deepth = 2 # 爬虫深度
print '本次服务将执行:' + str(deepth) + '次'
# 尝试创建子文件夹
readyPath = '.\\GraphFile'
if not os.path.exists(readyPath):
os.mkdir(readyPath)
for i in range(0, deepth):
print '--------------------分割线----------------------------'
print unicode('URL地址为 ' , "utf8")+ webAddr
htmlText = getHtml(webAddr)
getImg(htmlText)
GraspList = regFind(r'.*?',htmlText)
try :
webAddr = 'http://' + urlparse(webAddr).netloc + GraspList[1] #爬虫目标地址
except Exception,e:
print "爬虫地址异常:",Exception,":",e
webAddr = 'http://' + urlparse(webAddr).netloc + GraspList[0] #爬虫目标地址
#保存下一次的爬虫地址
ConfigObj.SaveConfig(webAddr)
初次上路,会出现下面的对话:
目前没有读到上次结束的地址
输入一个url,退出输入exit:
直接输入一个已知的目标页网址,会直接开始解析网页,至于网址嘛,为师只能指点你到这了,O(∩_∩)O~
脚本里有个设置爬虫次数的语句,可按需修改:
deepth = 2 # 爬虫深度
如果一切正常,程序会将下一次脚本的起始网址保存在文件夹下的store_html.ini内,下载的内容保存在\GraphFile目录下。
如果需求还不满足,重新执行这个脚本继续运行,and enjoy。最后祝各位,have a nice day!