当我们想在百度图片批量下载图片时,就会发现百度图片和一般网站不太一样,并不是通过翻页来实现数据的更新,而是通过Ajax动态加载技术实现数据的更新,这种网页相较于用翻页的方式,爬取难度会大一点,因为他的数据并不是一次性全部请求完的,而是随着你逐步的浏览来一步步的请求。那么应对这种网站,我们最好的办法就是找到他的Ajax接口,然后通过这个接口来请求数据,下面,我们来分析网页:
首先我们先找到你想要下载的图片(这里以唯美图片为例),然后单击鼠标右键,选择检查,再选择Network里面的XHR,然后向下滑动网站页面,就会发现Name那一栏里面多了几个请求,我们注意观察每个请求的Request URL,发现第一个的pn=30,第二个的pn=60,第三个的pn=90,第四个的pn=120,那么此时我们就知道了,网站每请求一次新的数据,他的Request URL中的pn值就会增加30。
那么接下来我们就建立Python文件,先导入所需要的requests库,然后将Request URL定义变量写入文件,将其中的pn值用format方法进行引用(这里我只爬取了3页,大家可以根据自己的需求选择爬取页数),添加请求头,打印输出页面内容:
然后我们发现所有图片的URL地址都在thumbURL里面,那么接下来我们再导入re模块,使用正则表达式匹配出我们所需要的thumbURL的内容,然后再用for循环遍历所有的thumbURL内容,再使用切片的方法将多余的部分切掉,然后再请求这些图片的URL地址,然后再使用with open的方法将所有的图片保存下来,这样,我们爬取百度图片的程序就写好了,下面是完整代码:(第17行文件夹名称显示乱码是因为软件本身的问题,大家忽略就好)
其实Ajax表面上看起来每次请求新数据时URL地址不改变,但事实上他的URL地址会改变其中的一个参数,只要我们找到了这个改变的参数,用程序去模仿参数的改变,就可以很好地解决Ajax不易爬取的问题。