Scrapy 模拟登录某乎

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

废话不多说直接行动吧

点击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 模拟登录某乎)