前言
同样的,我们在写一个爬虫前要明确自己想要爬取的东西是什么,明确下载目标数据在浏览器的操作如何
对于动态网页的爬取,在网页地址不变的情况下,我们首先要明确如何获取AJAX请求
首先我们看看这个网站pexel
打开页面后再Chrome浏览器中选择“更多工具”→“开发者工具”→“Network”→XHR
1、看到Name那一栏中,找到每一次鼠标下滑浏览器发出的请求,任意点开一个请求;
2、在右侧的Headers下拉
3、找到Query String Parameter这一栏,记住这里的数据
等下用于构造请求
接下来,在脑海里明确一下下载图片的步骤
我们首先点开一张图(要获得这个图的地址)→选择下载图片→获得一个.jpeg结尾或者.png结尾的网页,最后保存图片
查看网页源代码可以发现在每一次动态生成的页面中我们就可以直接获取图的下载地址
找到它,发现前缀是"https://images.pexels.com/photos/"+jpeg或者png
这时候我们可以考虑到,首先我们先获得页面的代码
然后通过正则表达式去搜索符合条件的图片
但是后面可能会有重复的地方,在获取的list中最后再用set筛选一下即可。
明确上述思路后,接下来我们开始构建爬虫
①初始化Headers☆
这一步非常重要,不构造headers会被禁止访问= =
headers初始化代码如下,用于将爬虫伪装成浏览器请求,而请求用于出发特定的AJAX内容
②构造动态AJAX请求
根据上述截图中保存的Query String Parameter参数,我们构造request请求的时候捎上Params内容
把获取的下载图片的link保存到一个list中
③元素的筛选
一开始调试程序的时候发现获取的link中还有以png形式结尾的link,这里需要再对list进行二次筛选,保留可以下载图片的link
最后还别忘了使用set把list中重复的元素删去哦
④最后对于保存了每一张图片的下载地址的list使用urllib.request.urlretrieve把图片保存到指定路径就可以啦
*pexel一开始还对每个图片的下载地址整了反爬虫机制,所以下载也要再构造一次headers模拟浏览器^_^
这一步可以单独写成一个函数,不过我贪方便就没这么写
最后贴两张运行结果图
控制台的输出:
下载到本地的壁纸
完整代码如下:
①为了调试程序中间加了一些输出语句
②如果要粘去直接用,记得通过打开页面查看query string parameter修改23行代码的seed内容!不然可能会爬不到东西