python爬虫入门教程--利用requests构建知乎API(三)


Posted in Python onMay 25, 2017

前言

在爬虫系列文章 优雅的HTTP库requests 中介绍了 requests 的使用方式,这一次我们用 requests 构建一个知乎 API,功能包括:私信发送、文章点赞、用户关注等,因为任何涉及用户操作的功能都需要登录后才操作,所以在阅读这篇文章前建议先了解Python模拟知乎登录 。现在假设你已经知道如何用 requests 模拟知乎登录了。

思路分析

发送私信的过程就是浏览器向服务器发送一个 HTTP 请求,请求报文包括请求 URL、请求头 Header、还有请求体 Body,只要把这些信息弄清楚,那么就很容易用 requests 来模拟浏览器发送私信了。

打开 Chrome 浏览器,随便找一个用户,点击发送私信,追踪一下私信的网络请求过程。

先看下请求头信息

python爬虫入门教程--利用requests构建知乎API(三)

请求头 Header 中有 cookies 登录信息,此外还有一个 authorization 字段,该字段是用于用户认证的,同时这个字段也存在 cookies 中(为了防止 cookie 信息泄露,我打了马赛克), requests 请求时这些信息都必须携带上。

再来看看请求的URL和请求体

python爬虫入门教程--利用requests构建知乎API(三)

请求URL是 https://www.zhihu.com/api/v4/messages ,请求方法是 POST,请求体

{"type":"common","content":"你好,我是pythoner","receiver_hash":"1da75b85900e00adb072e91c56fd9149"}

请求体是一个 json 字符串,type 和 content 很好理解,但 receiver_hash 是什么并不知道,需要进一步确定,不过你应该猜得出这是类似于用户 id 的字段。

那么现在问题来了,如何通过用户主页的URL找到用户的 id 呢?为了完整的模拟私信的整个流程,我特地注册了一个知乎小号。

如果你手头没有多余的手机号,可以用 Google 搜「receive sms online」,网上很多提供免费在线接收短信的手机号码,我注册的小号主页:https://www.zhihu.com/people/xiaoxiaodouzi

先尝试关注小号,然后在我关注的列表中找到该小号,把鼠标移到小号的头像处时,发现有一个 HTTP 网络请求。

python爬虫入门教程--利用requests构建知乎API(三)

请求 url 是 https://www.zhihu.com/api/v4/members/xiaoxiaodouzi ,这个URL的后面部分「xiaoxiaodouzi」对应小号主页URL的后面部分,这部分我们称之为 url_token。

接口的返回数据是该用户的个人公开信息。

{ 
 ...
 "id":"1da75b85900e00adb072e91c56fd9149",
 "favorite_count":0,
 "voteup_count":0,
 "commercial_question_count":0,
 "url_token":"xiaoxiaodouzi",
 "type":"people",
 "avatar_url":"https://pic1.zhimg.com/v2-ca13758626bd7367febde704c66249ec_is.jpg",
 "is_active":1492224390,
 "name":"\u6211\u662f\u5c0f\u53f7",
 "url":"http://www.zhihu.com/api/v4/people/1da75b85900e00adb072e91c56fd9149",
 "gender":-1
 ...
}

我们可以很清楚的看到有个id的字段,跟我们之前猜测的一样,私信里面的 receiver_hash 字段就是用户的id。

代码实现

到此我们把私信功能的思路理清楚了,代码实现就是水到渠成的事情了。

用户信息

为了得到私信接口需要的 receiver_hash 字典,我们先要获取用户信息,该信息里面含有用于的id值。

@need_login
def user(self, url_token):
 """
 获取用户信息,
 :param url_token:
 url_token 是用户主页url中后面部分
 例如: https://www.zhihu.com/people/xiaoxiaodouzi
 url_token 是 xiaoxiaodouzi
 :return:dict
 """
 response = self._session.get(URL.profile(url_token))
 return response.json()

发送私信

@need_login
def send_message(self, user_id, content):
 """
 给指定的用户发私信
 :param user_id: 用户ID
 :param content: 私信内容
 """
 data = {"type": "common", "content": content, "receiver_hash": user_id}
 response = self._session.post(URL.message(), json=data)
 data = response.json()
 if data.get("error"):
 self.logger.info("私信发送失败, %s" % data.get("error").get("message"))
 else:
 self.logger.info("发送成功")
 return data

上面两个方法放在一个叫Zhihu的类里面,我只列出了关键代码,涉及到的 @need_login 是一个用户认证的装饰器,表示该方法需要登录后才能操作。细心的你可能发现,每个请求中我并没有显示地指定 Header 字段,那时因为我把它放在 __init__.py 方法中初始化了。

def __init__(self):
 self._session = requests.session()
 self._session.verify = False
 self._session.headers = {"Host": "www.zhihu.com",
    "Referer": "https://www.zhihu.com/",
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36'
      ' (KHTML, like Gecko) Chrome/56.0.2924.87',
    }
 self._session.cookies = cookiejar.LWPCookieJar(filename=cookie_filename)
 try:
 self._session.cookies.load(ignore_discard=True)
 except:
 pass

调用执行

from zhihu import Zhihu

if __name__ == '__main__':
 zhihu = Zhihu()
 profile = zhihu.user("xiaoxiaodouzi")
 _id = profile.get("id")
 zhihu.send_message(_id, "你好,这是来自Python之禅的问候")

执行完成后,小号成功收到我发送的私信。

python爬虫入门教程--利用requests构建知乎API(三)

最后,我们可以按照类似的思路把关注用户,点赞等功能实现了。

源码地址:https://github.com/lzjun567/zhihu-api 

在线下载:http://xiazai.3water.com/201705/yuanma/zhihu-api(3water.com).rar

总结

以上就是关于这篇文章的全部内容,希望本文的内容对大家学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
一篇不错的Python入门教程
Feb 08 Python
python解决网站的反爬虫策略总结
Oct 26 Python
简单谈谈Python流程控制语句
Dec 04 Python
Python编程实现二叉树及七种遍历方法详解
Jun 02 Python
深入理解Python3 内置函数大全
Nov 23 Python
python广度优先搜索得到两点间最短路径
Jan 17 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
使用python实现多维数据降维操作
Feb 24 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 Python
基于Python的Jenkins的二次开发操作
May 12 Python
PyQt5实现登录页面
May 30 Python
Python图像处理二值化方法实例汇总
Jul 24 Python
Python正则表达式完全指南
May 25 #Python
Tensorflow简单验证码识别应用
May 25 #Python
Python 编码Basic Auth使用方法简单实例
May 25 #Python
Python 含参构造函数实例详解
May 25 #Python
Python爬虫之模拟知乎登录的方法教程
May 25 #Python
python爬虫入门教程--优雅的HTTP库requests(二)
May 25 #Python
Python操作使用MySQL数据库的实例代码
May 25 #Python
You might like
2020年4月放送!《Princess Connect Re:Dive》制作组 & 角色声优公开!
2020/03/06 日漫
php判断数组中是否存在指定键(key)的方法
2015/03/17 PHP
php在数据库抽象层简单使用PDO的方法
2015/11/03 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
[原创]网络复制内容时常用的正则+editplus
2006/11/30 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
简介JavaScript中getUTCMonth()方法的使用
2015/06/10 Javascript
JavaScript实现打字效果的方法
2015/07/10 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
JavaScript实现HTML5游戏断线自动重连的方法
2017/09/18 Javascript
vue中实现滚动加载更多的示例
2017/11/08 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
使用RN Animated做一个“添加购物车”动画的方法
2018/09/12 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
js实现类选择器和name属性选择器的示例步骤
2021/02/07 Javascript
JavaScript实现筛选数组
2021/03/02 Javascript
[01:13]DOTA2群星解读国服召集令 一起说出回归的理由
2013/07/17 DOTA
[02:38]DOTA2 夜魇暗潮2020活动介绍官方视频
2020/11/04 DOTA
[22:07]DOTA2-DPC中国联赛 正赛 iG vs Magma 选手采访
2021/03/11 DOTA
python关键字and和or用法实例
2015/05/28 Python
Python中的推导式使用详解
2015/06/03 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
django的ORM操作 删除和编辑实现详解
2019/07/24 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
人事行政主管岗位职责
2013/12/22 职场文书
技术总监管理职责范本
2014/03/06 职场文书
家庭困难证明
2014/10/12 职场文书
涨价通知
2015/04/23 职场文书
社会实践单位意见
2015/06/05 职场文书
热血教师观后感
2015/06/10 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
职场中的你,辞职信写对了吗?
2019/06/26 职场文书
南阳市白酒市场的调查报告
2019/11/08 职场文书
golang elasticsearch Client的使用详解
2021/05/05 Golang