我们爬取某网站图片时总是爬取不到所有的图片,只会爬取到一页的内容,这是为什么呢?
原因就是该网页提供的html页面使用了Ajax与javascript的交互实现,因此我们爬取时有困难。
在后几篇文章中会介绍,今天我们给出某网站爬取图片的网址:
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E7%8C%AB&pn=0&gsm=50&ct=&ic=0&lm=-1&width=0&height=0
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E7%8C%AB&pn=20&gsm=3c&ct=&ic=0&lm=-1&width=0&height=0
https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E7%8C%AB&pn=40&gsm=50&ct=&ic=0&lm=-1&width=0&height=0
上面的url分别是第1页、第2页、第3页的,我们还是用老方法先得到这些url,
然后再获取每页的图片。
我们的目的不是获取某一类的图片,而是获取我们想要的任何种类,任何数量的图片,所以我们可以对url进行拼接。通过输入想要的内容达到目的。
获取我们想要的种类图片:picture = input("图片类型为:\n")
获取每页的url:pn = 20*(i-1)
把上面的两个键值对存储在字典kw里,在我们发送get请求时传入即可。
正则表达式获取我们下载图片的内容:
“objURL”:“(.*?)”
符合该表达式的内容有61个,通过分析,第一个是没用的。所以剩下的60个就是我们所需图片的内容,我们找到对应的链接,查看是否可以得到相应的图片内容,答案是肯定的。
但是我们又发现一个问题:第1、2、3;第4、5、6;……每三个objurl的链接获取到的内容一样(即步长为3),所以为了避免重复,我们只获取pn=0,pn=60,pn=120……这些链接的内容即可。
以上我们就获取到了所有我们想要每个图片的url。
import requests
import re
picture = input("图片类型为:\n")
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"