简介
本文通过分析Ajax请求,然后使用requests来爬取今日头条街拍美图数据。有些网页直接请求并没有包括我们在浏览器中看到的内容,这是因为这些信息是通过Ajax加载,并且通过js渲染生成的,这时候就需要我们分析网页的请求。
本文使用的解析库是Beautifulsoup和正则表达式,请求使用的是requests
目标站点分析
今天我们要爬取的就是上图中的图片
(1)请求分析
邮件->检查->network->preserve log 重新刷新页面,查看key words请求的返回结果
对返回结果分析发现:里面都是一些js,并没有我们需要的街拍图片信息
这些数据其实是通过Ajax来加载的,如下图:
下面截图中的share_url对应的就是左边第一个结果点进去后的超链接,另外,用鼠标不断下滑页面:
随着你不断下滑浏览页面,Ajax请求也越来越多,也就是说:页面上的数据不是一次性加载的,是随着页面的滑动动态加载的更具体而言,这些请求如下:
实际上改变offset就可以获取到对应返回的json数据了,我们需要的是一个循环,改变请求链接中的offset,去请求这些地址就可以获取到对应的数据了。得到返回的就送数据后,使用json解析数据就可以了
整体搜索结果分析之后,我们进入一个具体的结果,分析每一个结果集的数据图片是通过什么方式加载的,我们点击任意一个“街拍 图集”的搜索结果:
上面这张图是片是通过什么方式加载的呢?也会是Ajax吗?请求分析:
对原始的请求分析发现:图片链接地址在js变量中:
由于gallery变量不是隐藏在html中,我们就不能使用Beautifulsoup和PyQuery等解析库去解析,比较简单的方式就是正则表达式解析。
流程框架分析
- 获取关键词‘街拍 美图’搜索结果,这部分是通过Ajax动态加载的,只需要使用requests请求即可(更改offset),每个Ajax请求返回的是多个搜索结果
- 每个搜索结果的详情数据页的图片地址在js中(如上图所示),使用正则匹配即可
实现分析
在获取“街拍 美图”的关键词搜索结果时注意参数设置
上图是搜索关键词后返回的结果,由之前分析知道,返回结果是通过Ajax动态加载的,每一个Ajax请求都有对应的参数也就是上图中红色方框中的那部分参数,不同Ajax请求只需要更改offset即可,offset每次递增20。斌并且有请求头知道,Ajax是get请求:
上述参数在代码中就是对应字典形式
然后通过url拼接和urlencode(字典参数)拼接请求地址
urlencode可以将字典参数转换成url请求参数,由urllib库提供的方法
- 使用json解析返回的data json数组,提取data数组中的share_url(文章详情链接地址)、title(标题)
源码和数据:
** 爬取的数据**
扫描下方二维码,公众号菜鸟名企梦
后台发送关键词“街拍美图”即可获取本文的完整源码和详细程序注释
公众号菜鸟名企梦
专注:互联网求职面经、java、python、爬虫、大数据等技术、海量资料分享:
公众号菜鸟名企梦
后台发送“csdn文库下载”即可免费领取【csdn】和【百度文库】下载服务;
公众号菜鸟名企梦
后台发送“资料”:即可领取5T精品学习资料、java面试考点和java面经总结,以及几十个java、大数据项目,资料很全,你想找的几乎都有
网友评论