百度图片爬取(传统翻页版本)
一、需求分析
(1)百度图片:搜索‘天’
可以看到在最后面是页数:
(2)目的:爬取关键字搜索的所有图片,并实现翻页,最后将图片保存到本地。
二、网页图片链接提取及翻页
1.图片地址提取
(1)在百度图片的搜索结果页面右键,然后单击“查看源文件”(本人用的是搜狗浏览器),可以看到相关的网页代码。
(2)随便选一张图片,右键选择“复制图片网址”。然后转到上一步的html代码。按Ctrl+F,粘贴图片网址,可以发现:
经过打开相应的url,最后发现:“objURL”:”http://h.hiphotos.baidu.com/lvpics/h=800/sign=79fa819f8694a4c21523ea2b3ef51bac/8b82b9014a90f603dcfffcd73812b31bb151edd7.jpg“, 之中的图片效果最好。因此可以写出图片地址获取的正则表达式:
pat = '"objURL":"(.*?)",'
2.翻页实现
(1)观察地址栏的变化:
第1页:
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%A4%A9&ct=201326592&ic=0&lm=-1&width=&height=&v=flip
第2页:
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%A4%A9&pn=20&gsm=3c&ct=&ic=0&lm=-1&width=0&height=0
第3页:
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%A4%A9&pn=40&gsm=50&ct=&ic=0&lm=-1&width=0&height=0
观察其中的pn字段,可以发现翻页的规律。
(2)最后可总结出实现翻页的URL:
for k in range(0,page):
url = "https://image.baidu.com/search/flip?tn=baiduimage&word="+key+"&pn="+str(k*20)
三、代码实现
import urllib.request
import re
#浏览器伪装
def pretends():
headers = ("Uesr-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
urllib.request.install_opener(opener)
#爬取函数,参数为:搜索关键词, 页数
def crawl(keyword,page):
for k in range(0,page):
try:
key = urllib.request.quote(keyword)
url = "https://image.baidu.com/search/flip?tn=baiduimage&word="+key+"&pn="+str(k*20)
data = urllib.request.urlopen(url).read().decode('utf-8')
print(len(data))
pat = '"objURL":"(.*?)",'
rst = re.compile(pat).findall(data)
cnt = 0
for i in range(0,len(rst)):
#添加异常处理
try:
#获取图片扩展名
pat1 = '\.[^.\\/:*?"<>|\r\n]+$'
rst1 = re.compile(pat1).findall(rst[i])
#下载图片到本地
urllib.request.urlretrieve(rst[i],"F:\\Python\\Web Spider\\Crawl Data\\百度图片\\2\\"+str(k+1)+str(i)+rst1[0])
print('正在下载:%s' % rst[i])
except Exception as err:
print(err)
except Exception as err:
print("出现异常:"+str(err))
def main():
pretends()
crawl("风景",10)
if __name__ == '__main__':
main()
四、结果展示
如无特殊情况,会在相应的文件夹发现下载的图片: