爬虫入门系列(三):用 requests 构建知乎 API
感谢关注天善智能,走好数据之路↑↑↑
欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!
对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。
作者:刘志军,6年+Python使用经验, 高级开发工程师,
目前在互联网医疗行业从事Web系统构架工作
个人公众号:Python之禅(微信ID:vttalk)
在爬虫系列文章《优雅的HTTP库requests》中介绍了 requests 的使用方式,这一次我们用 requests 构建一个知乎 API,功能包括:私信发送、文章点赞、用户关注等,因为任何涉及用户操作的功能都需要登录后才操作,所以在阅读这篇文章前建议先了解《Python模拟知乎登录》。现在假设你已经知道如何用 requests 模拟知乎登录了。
思路分析
发送私信的过程就是浏览器向服务器发送一个 HTTP 请求,请求报文包括请求 URL、请求头 Header、还有请求体 Body,只要把这些信息弄清楚,那么就很容易用 requests 来模拟浏览器发送私信了。
打开 Chrome 浏览器,随便找一个用户,点击发送私信,追踪一下私信的网络请求过程。
先看下请求头信息
![](https://img.haomeiwen.com/i3901436/5bba574edc860bcf..jpg)
请求头 Header 中有 cookies 登录信息,此外还有一个 authorization 字段,该字段是用于用户认证的,同时这个字段也存在 cookies 中(为了防止 cookie 信息泄露,我打了马赛克), requests 请求时这些信息都必须携带上。
再来看看请求的URL和请求体
![](https://img.haomeiwen.com/i3901436/fb8dc512212ece64..jpg)
请求URL是 https://www.zhihu.com/api/v4/messages ,请求方法是 POST,请求体
![](https://img.haomeiwen.com/i3901436/6d4aa3256c0e31df..png)
请求体是一个 json 字符串,type 和 content 很好理解,但 receiver_hash 是什么并不知道,需要进一步确定,不过你应该猜得出这是类似于用户 id 的字段。
那么现在问题来了,如何通过用户主页的URL找到用户的 id 呢?为了完整的模拟私信的整个流程,我特地注册了一个知乎小号。
如果你手头没有多余的手机号,可以用 Google 搜「receive sms online」,网上很多提供免费在线接收短信的手机号码,我注册的小号主页:https://www.zhihu.com/people/xiaoxiaodouzi
先尝试关注小号,然后在我关注的列表中找到该小号,把鼠标移到小号的头像处时,发现有一个 HTTP 网络请求。
![](https://img.haomeiwen.com/i3901436/8a24f854323a8bdc..jpg)
请求 url 是 https://www.zhihu.com/api/v4/members/xiaoxiaodouzi ,这个URL的后面部分「xiaoxiaodouzi」对应小号主页URL的后面部分,这部分我们称之为 url_token。
接口的返回数据是该用户的个人公开信息。
![](https://img.haomeiwen.com/i3901436/3a5001349cfbf368..png)
我们可以很清楚的看到有个id的字段,跟我们之前猜测的一样,私信里面的 receiver_hash 字段就是用户的id。
代码实现
到此我们把私信功能的思路理清楚了,代码实现就是水到渠成的事情了。
用户信息
为了得到私信接口需要的 receiver_hash 字典,我们先要获取用户信息,该信息里面含有用于的id值。
![](https://img.haomeiwen.com/i3901436/046f870772a77d77..png)
发送私信
![](https://img.haomeiwen.com/i3901436/bb06aad0e3a6c960..png)
上面两个方法放在一个叫Zhihu的类里面,我只列出了关键代码,涉及到的 @need_login 是一个用户认证的装饰器,表示该方法需要登录后才能操作。细心的你可能发现,每个请求中我并没有显示地指定 Header 字段,那时因为我把它放在 __init__.py 方法中初始化了。
![](https://img.haomeiwen.com/i3901436/80a5f60c18a316fc..png)
调用执行
![](https://img.haomeiwen.com/i3901436/68939ef2851d1a8e..png)
执行完成后,小号成功收到我发送的私信。
![](https://img.haomeiwen.com/i3901436/39884130b500e6bb..jpg)
最后,我们可以按照类似的思路把关注用户,点赞等功能实现了,欢迎 Fork 贡献代码。
源代码:https://github.com/lzjun567/zhihu-api