动态网页抓取(爬取百度百科的历史记录,结果在时隔四个月之后再次遇到的对手)
优采云 发布时间: 2021-11-26 16:26动态网页抓取(爬取百度百科的历史记录,结果在时隔四个月之后再次遇到的对手)
动态页面抓取
好久没写爬虫了。今天敲了一个爬虫——爬取百度百科的历史记录。结果,我四个月后再次遇到的对手,居然是动态页。),但是经过一番努力,还是达到了自己的目标,然后写了一篇像评论一样的博客。
一、概念
动态页面实际上是相对于静态页面的。面对静态页面时,直接查看响应一般是网页的全部代码,但动态页面则不然。通常,动态页面的响应与您重新打开时在网页上看到的不同。
二、 练习和练习前
因为太喜欢练了,就不讲了,练了。实践会导致真正的知识,更多的实践会让你明白。
登陆页面:万科百度百科历史版
实现环境:win32
版本:python 3.6.2
练习目标:获取万科百度百科历史版本的历史修改时间,并制作成图表或csv文件
三、流程说明
和所有爬虫一样,我们的第一步会是分析网页,因为我们的目标是选择一个动态网页,所以我们还需要跟踪json文件等等。
过程:
1、网络分析
2、查询跟踪json等文件或xhr
3、 进行文本匹配
4、画图或制作csv
四、*敏*感*词*准备
我们需要的库是(所有最新版本):
1.请求
2.重新
(下面的库对于爬虫来说不是必须的,但是这次是我需要的)
3.matplotlib(用于可视化)
4.datetime(按时操作)
5.Pandas(python强大的数据处理库)
6.os(操作系统)
(我更喜欢原来的re库,当然这里用正则表达式可以解决所有问题)
你需要知道的:
1.Python 语法基础
2.正则表达式匹配规则
(以下对于爬虫来说不是必须的)
3.datetime的一些基本功能
4. Matplotlib 可视化操作(虽然这对于爬虫来说不是必须的,但是很多情况下数据可视化会让数据更直观,更容易让人做出判断)
5.pandas库的基本使用(爬虫不需要此项,但数据分析需要)
五、网络分析
首先我们打开我们的目标页面→万科百度百科历史版。
看起来一切正常,然后我们查看url,也有前面提到的规则,但是真的一切正常吗?
如果你把这个网页当成一个静态页面,那就完蛋了,因为我一开始就是这么做的。当你查询第一页的代码时,你会发现一切正常,但是当你查询第二页的代码时,有时你会发现你看到的第二页的代码是一样的,甚至高达最后一页。你认为它违反常识吗?
六、跟踪
事实上,这很正常。很多页面会动态化,使用json或者其他文件传输数据(不准确,可能是使用java、JavaScript等代码调用端口等)。这更安全。
这时候很多人会选择使用fiddle等第三方软件来抓包,这样比较方便,但是笔者这里比较吃力。
经过一番搜索,我们锁定了我们需要的几个文件和 xhr 文件。
很多网页的数据都会隐藏在json中,会不会也是这个?当然,检查后失败了,然后我们在xhr中看到,发现这个非常熟悉的领域(当然对我来说可能更熟悉)
显而易见的答案在这里,简单解释一下
get historylist,获取历史数据
我猜tk是万科的quantio句子(不知道这个词是不是拼错了,我真的用的比较少,搞前后端的朋友可能都知道)
lemmald,这不是百度的万科数量吗?
from是第七页一目了然
大小显示 25 条消息
这个发现很棒,解决了很多问题。
七、伪装
作为一个爬虫,了解反爬虫的套路是非常有必要的。如果你对xhr进行正常的爬取,你会发现返回的是{error:xxxxx}。这个时候,你应该保持警惕。这证明你的机器人的身份被百度查到了,拒绝给你数据,所以我们需要做一些简单的伪装。我之前讲过更改标题,但这次我会讲得更多。
1.headers 伪装,服务器用这个来判断你使用的浏览器,当有这个时,服务器会认为是浏览器的正常请求。
2.Referer:浏览器使用它来确定您从哪个网页重定向。
3.ip伪装,这个只要ip池建好就没有问题,建议去Xspur代理查一些需求
4.Cookie 伪装。服务器使用 Cookie 来识别您的当前状态。例如,您已经登录等,每次向服务器请求cookie时,都会相应更新。
最常用的就是上面这些。以上是从上到下越来越难。面对百度,光是改header显然是不行的,所以加了Referer和cookie代码(关键是两个月前创建的IP池已经取消了,懒得调整了)。
好了,这样做之后,我们发现可以正常获取数据了。
八、文本匹配
不得不说,解决了以上问题之后,文本匹配就成了最简单的事情了。
其实这是一种类似字典的格式,但是懒得去想的作者决定使用简单粗暴的正则表达式。
九、 转换时间戳
这时候,我们就会发现,给creattime的时间到底是什么鬼?
但是仔细想想,你会发现这是一个时间戳
Python时间戳:从1970年1月1日凌晨12:00到现在的秒数
不是崩溃吗?
但幸运的是,只需要几段简短的代码就可以解决这个问题。
输入时间戳,OK,问题解决。
十、画图,制作csv
图片
文件
十一、总结及代码
感觉这个爬虫还可以,两个多月后想起来不容易