POST请求及异步加载的网页爬取——简书搜索页面
问题描述
我想输入一个关键词,获取简书搜索界面的每一页中每一篇文章的url链接。
分析网页
1.判断网页加载方式
1)右键查看源代码,发现想要的数据不在源代码里,初步判断网页没那么简单。
2)Google Chorme,f12进入控制台后f5刷新,找到Doc选项,预览第一个包的加载页面,发现只是加载了一些标题等无关紧要的信息,可以判断页面中有价值的东西不是静态加载出来的。
注:Doc是网站第一批请求的包,一般来讲doc中的信息都是静态的,可以直接通过requests库轻易的获取到。
2.判断网页是否为异步加载
3)我们进入XHR栏中,发现加载了一个包,经过观察分析,发现文章的重要信息放在了“entries”中,包含了文章id,标题等信息:
注:XHR是一种浏览器API,可以极大简化异步通信的过程。
再仔细观察一下,可以发现每篇文章的具体信息中包含一个“slug”标签,这正是每一篇文章的url的后半部分:
这个方向对了,网页中有价值的信息是以异步加载的方式完成的。
这一值得说明一点的是:Ajax加载也是异步加载的一种形式,而判断是否为Ajax加载的方式是,判断XHR栏中包的Request Headers中是否有以下标签:
当然,简书不是Ajax加载的,经过测试我发现CSDN的评论区是Ajax加载的,不过这是另一个问题。如果HDR中有包是Ajax加载的,而你恰好又想要这部分的数据,那么你需要在请求头中加入一对标签:
x-requested-with: XMLHttpRequest
3.判断网页请求方式
还是这个XHR包,我们观察它的Headers信息,很明显地看到它是一个POST请求:
POST请求的意思是,每一次访问网页,需要在请求的url地址后面加上要请求的参数。那么接下来我们就需要找到请求url和请求参数。
获取请求url和请求参数
显而易见,请求url就在Headers的“Requests URL”中:
请求参数在Headers的最下面,存放在“Query String Parameters”:
我们换到第二页第三页再看一下请求参数:
问题逐渐明朗了,请求参数共有4个,而其中只有“page”是跟随页面变化的,这样,我们就能构造一个