动态网页抓取(爬取百度百科的历史记录,结果在时隔四个月之后再次遇到的对手)

优采云 发布时间: 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

  图片

  

  文件

  

  十一、总结及代码

  感觉这个爬虫还可以,两个多月后想起来不容易

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线