美文网首页
Scrapy 模拟登录某乎

Scrapy 模拟登录某乎

作者: 风尘漓落 | 来源:发表于2020-06-01 21:14 被阅读0次

    最近看知乎的帖子太累了,所有想直接用爬虫爬取以后存入数据库再看。

    废话不多说直接行动吧

    点击www.zhihu.com发现会直接跳转到登入页面

    也就是没有登入的情况系知乎是不允许我们浏览主页的内容的

    那我们先去看看登入页面有什么必须要填的选项吧

    打开chrome浏览器的调试模式

    然后我们故意输入一个错误的账号和密码,看看会发送一些什么请求

    看到飘红的sign_in以后发现账号和密码是需要发送给他的

    打开地址看看

    需要发送的地址是https://www.zhihu.com/api/v3/oauth/sign_in,是以post的方式发送的

    我看看他发送的内容是什么

    果然又是加密的数据

    既然这样我们就在chrome里面查找一下,看看他到底请求了多少数据吧

    打开全局搜索

    看看sign_in到底在哪里

    找到了数据,我们打个断点看看,需要发送的数据有哪些

    开始尝试发送数据,然后打上断点

    现在我们知道他需要的数据有哪些了

    这里是login_data的内容

    captcha: 这个是验证码

    clientId: "c3cef7c66a1843f8b3a9e6a1e3160e20",这个是唯一id号

    grantType: "password",这个是登入类型,如果是账户密码输入的就是这个

    lang: "en",这个是验证码类型,是英文的验证码还是中文验证码

    password: "12345678",这个是密码

    refSource: "other_https://www.zhihu.com/signin?next=%2F",这个是将要跳转到哪个页面

    signature: "ea67db2a6063ea6482d27368aab27a363e276a18",这个是一个加密字符串

    source: "com.zhihu.web",这个是服务器地址

    timestamp: 1591009623259,这个是时间戳

    username: "+86123456789",这个是手机号码

    utmSource: undefined,这个暂时不知道

    我们全局搜索下,看看他用的什么加密方式

    是通过 Hmac 算法,然后对clientId,grantType,timestamp,source这四个进行加密

    那我们就来写代码来模拟这个加密过程

    这个是浏览器加密出来的,我们模拟下加密看看是不是数据一样

    signature: "ea67db2a6063ea6482d27368aab27a363e276a18",这个是一个加密字符串

    看来是一致的,证明加密方式没有错。

    然后我们需要模拟发送验证码请求

    https://www.zhihu.com/api/v3/oauth/captcha?lang=en

    然后我们把验证码数据通过post方式提交到

    https://www.zhihu.com/api/v3/oauth/captcha?lang=en里面

    然后我们需要把验证码以及账号密码更新到login_data里面

    再把时间戳,请求的验证码,以及加密以后的signature也更新到login_data

    然后我们需要在请求头里面携带上x-xsrftoken的参数

    headers.update({

    'content-type':'application/x-www-form-urlencoded',

        'x-zse-83':'3_2.0',

        'x-xsrftoken':self._get_xsrf()

    })

    这个参数是在我们访问页面的时候自动会写入到headers里面的,我们只要提取出来就好了

    然后我们需要把数据集合起来然后发送到

    https://www.zhihu.com/api/v3/oauth/sign_in里面进行登入认证

    我们先看看浏览器上面携带了哪些信息

    浏览器上加密了

    我们要找到他加密的方式

    我们搜索_encrypt发现了他是用这个加密的,我们把这段JavaScript复制下来放入到js

    我们是用的是node环境来运行js

    但是在node环境里面是没有atob这个函数的,所以我们使用Buffer.from来进行

    然后我们使用execjs这个包把需要加密的参数放入到里面去

    然后执行就可以得到加密的参数了

    然后我们使用scrapy这个框架来进行发送POST数据

    然后测试一下

    我们测试一下知乎的热榜这个栏目

    https://www.zhihu.com/hot

    这个栏目我们在没有登入的情况下,输入看看

    可以看到知乎是不让我们访问的,必须登入

    那我们利用爬虫模拟用户登入后再去访问试试

    账户密码我已经填写好啦,肯定不会让你们看到的。,我们先填写一下验证码

    我们看看html给我们返回的数据

    再看看网页里面的数据

    我们成功的获取到了知乎的热点内容,接下来我们只要访问这些页面,把所有用户的回答全部保存到我们的数据库就可以了

    至于写入数据库这个,因为我没什么需要爬取的知乎数据所以我就不写入到数据库了。

    具体的源码的话,如果有需要我会分享的。

    相关文章

      网友评论

          本文标题:Scrapy 模拟登录某乎

          本文链接:https://www.haomeiwen.com/subject/oswszhtx.html