【一起学爬虫】分析Ajax,抓取今日头条街拍美图

1,542

简介

本文通过分析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学习笔记、10T资料、100多个java项目分享


欢迎关注个人公众号【菜鸟名企梦】,公众号专注:互联网求职面经javapython爬虫大数据等技术分享**: 公众号**菜鸟名企梦后台发送“csdn”即可免费领取【csdn】和【百度文库】下载服务; 公众号菜鸟名企梦后台发送“资料”:即可领取5T精品学习资料**、java面试考点java面经总结,以及几十个java、大数据项目资料很全,你想找的几乎都有