最近看知乎的帖子太累了,所有想直接用爬虫爬取以后存入数据库再看。
废话不多说直接行动吧
点击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给我们返回的数据
再看看网页里面的数据
我们成功的获取到了知乎的热点内容,接下来我们只要访问这些页面,把所有用户的回答全部保存到我们的数据库就可以了
至于写入数据库这个,因为我没什么需要爬取的知乎数据所以我就不写入到数据库了。
具体的源码的话,如果有需要我会分享的。