爬虫模拟登陆知乎网站并抓取首页的数据入库
以下内容仅交流学习,请勿用于非法用途
之前一直在忙毕业的事情,所以很久很久没有更新了。最近呢,鼓足勇气前往北京开始我的北漂生涯,不得不说北京还是不太好混啊。 好了,我们还是说回正题,之前一直想解决知乎的模拟登陆。奈何一直没有时间,正好最近没有面试闲的慌,我们来讲讲如何破解知乎的反爬,并且实现首页的抓取。 我们先抓包看看。 发现我们点击登陆按钮时,知乎后台会post这个(https://www.zhihu.com/api/v3/oauth/sign_in)请求出去,formdata即为下图那般模样,看见这个想都不用想,开始枯燥的js调试吧。
好的,打开chrome的全局搜索,用sign_in作为搜索的关键字,开始吧
熟悉前端的朋友可以看出,这个方法即是构造登陆验证的URL,这里的body可以看出有非常大的问题在!我们在这里打上断点,开始调试,刚接触JS反爬的朋友可能在这里会困扰很久,但是JS反爬就是要有耐心一步一步的进行调试。最终可以找到他的加密函数,即为下图所示。
OK,我们来验证一下结果是否正确,在console中打印出来如下,可以看到和我们之前抓包的formdata非常相似,
我们继续看看他传入加密函数的参数是什么
我们将他格式化出来看看,其内容基本如下
通过chrome的调试界面我们可以发现signature这个字段,熟悉加密算法的朋友可以看出这是通过sha1散列算法进行加密的, 同样我们在chrome的全局搜索中使用signature作为关键字去查找看看是在哪里生成的这个字段。
打上断点调试后
可以看到它需要的值为formdata中的[grantType],[clientId], [source],[timestamp]这四个参数,我们可以在python中使用hmac库来计算signature
ok拿到这个关键性的字段之后,我们将知乎的加密函数拷贝到nodejs中进行调试,根据{}可以找到知乎的关键加密函数。我们在nodejs中调试时会遇到很多个坑,这里要感谢以为知友,在他的文章很清楚的指出了这些坑应该如何填,具体可以看他的知乎文章 sergiojune:知乎最新版模拟登陆详解,小白也能懂 zhuanlan.zhihu.com 图标 只是我在nodejs中调试代码时是使用的jsdom的这包去渲染的window和document
OK,在将这些坑都填完之后,我们拿之前在console中给加密函数传入的参数拿到nodejs中进行调试看看,模拟加密结果是否一致
可以看出运行结果与正确结果基本一致。到这里知乎的JS反爬暂时可以告一段落,我们接着分析他的请求,其中在请求头中必须携带以下三个参数否则,知乎后端将返回错误信息
我们都知道知乎是使用python中的django框架进行开发的,而这个xsrf则是防止Xsrf 跨站攻击的一个token验证,在我们清空cookie第一次访问首页时会在response中以cookie的形式返回给我们。 通过抓包分析可以的出在进行验证码的请求与验证时,知乎发送了三个请求给知乎后端,其中第一个是获取capsion_ticket这个cookie在后续的所有请求中也将携带这个cookie,否则会返回缺少验证码票据这个错误。而第二个验证码请求是PUT请求是知乎用来覆盖之前的验证码请求以修改页面资源。第三个验证码请求是一个POST请求是用来验证码验证码是否正确的
将验证码下载下来之后是返回的是通过base64编码后的二进制数据在python中进行解码保存成文件即可。其中验证码后的lang参数为验证码的类型参数“cn”为中文倒转验证码“en”为英文和数字验证码。验证码的操作可以通过python的PIL库进行相关的操作。 以上即是知乎的模拟登陆操作。 当我们成功登陆了知乎之后,自然是要下载一些数据的。我们继续抓包以获取知乎登陆成功后的首页数据,我们分析首页的请求是发现
在进行首页请求时知乎是使用的HTTP2.0协议,我们直接使用requests库携带这个请求头会直接给我们报无法解析的错误,所以我们必须使用HTTP2.0的协议去请求,一顿百度过后发现hyperyper这个库可以请求HTTP2.0协议,其用法如下,更多用法请前往官方文档
最后我们通过lxml进行数据的解析就好了,然后将数据写入MongoDB中 结果演示
MongoDB中的数据展示
代码传送门传送 麻烦各位老哥star一下下 最后的最后感谢一下这二位大佬,前任插秧,后人乘凉。没有二位的指导,知乎的坑不知道要填多久。 戴德满:2019年最新 Python 模拟登录知乎 支持验证码 zhuanlan.zhihu.com 图标 sergiojune:知乎最新版模拟登陆详解,小白也能懂 zhuanlan.zhihu.com 图标 最后各位大佬,部门要是有坑,给个内推,感谢各位大佬!!! 如有疑问,可Email我,email:aiphalv0010@gmail.com 小弟只是一只幼年期爬虫,若有错,还望指出! 欢迎大家评论区讨论! 转载需标明出处。
版权声明:
1、该文章(资料)来源于互联网公开信息,我方只是对该内容做点评,所分享的下载地址为原作者公开地址。2、网站不提供资料下载,如需下载请到原作者页面进行下载。