爬取贴吧多页图片,并保存在本地文件夹
在Windows7、eclipse环境上开发
结合Python现有库urllib、urllib2和re进行爬虫编程
相关库下载使用现有封装库Anaconda2,已包含本爬虫需要的所有库
import urllib
import urllib2
import re
# 根据url获取网页html内容
def getHtmlContent(url):
page = urllib2.Request(url)
page.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2214.111 Safari/537.36')
#加headers, 模拟浏览器agent;head中有一个user-agent每次都换不同的模拟代理
response = urllib2.urlopen(page)
html = response.read().decode('utf-8')#设置相应编码格式
return html
# 从html中解析出所有jpg图片的url
# 百度贴吧html中jpg图片的url格式为:<img ... src="XXX.jpg" pic_ext=...>
# 不同帖子的图片URL略有不同,可通过审查元素查看相应的url格式,适当调整
def getJPGs(html):
# 解析jpg图片url的正则
jpgReg = re.compile(r'<img.+?src="(.+?\.jpg)" pic_ext') # 注:这里最后加一个'pic_ext'是为了提高匹配精确度
# 解析出jpg的url列表
jpgs = re.findall(jpgReg, html)
#图片url列表
#print jpgs
return jpgs
# 用图片url下载图片并保存成制定文件名
def downloadJPG(imgUrl, fileName):
urllib.urlretrieve(imgUrl, fileName)
# 批量下载图片,保存到F盘zdl文件夹
def batchDownloadJPGs(url,amount):
# 用于给图片命名
#count = 1
path='F:/bizhi/'
amount=str(amount)
#for url in imgUrls:
aa=''.join([path, amount+'.jpg'])
downloadJPG(url, aa)
print '正在下载第'+str(amount)+'张'
#count = count + 1#考虑分页的图片名自动叠加而不是替换
def main():
l=[]
amount=0
#爬取前三页代码
for i in range(3):#for循环解决分页问题
url="https://tieba.baidu.com/p/3840085725?pn="+str(i)
html = getHtmlContent(url)
jpgs = getJPGs(html)
l+=jpgs
#download(url)
for url in l:#定义for循环,便于图片命名
amount+=1
batchDownloadJPGs(url,amount)
if __name__ == '__main__':
main()
print "下载完成"
待完善之处:(希望评论有良策)
爬取效率有待提高;
虽然增加了header模拟浏览器agent,但有时还是会被浏览器发现爬虫行为,出现socket error;(可通过设置相应检查点和抛出相关异常以及更换代理IP解决)
爬取图片时,遇到图片url存在中文编码有时会出现异常;
爬虫参考文章(感谢):
以及其他文章,找不到链接了...