python爬虫入门(3)–利用requests构建知乎API

这篇文章主要给大家介绍了关于python爬虫入门之利用requests构建知乎api的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。

前言

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

思路分析

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

立即学习“Python免费学习笔记(深入)”;

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

先看下请求头信息

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

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

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

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

请求URL是 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爬虫入门(3)--利用requests构建知乎API

请求 url 是 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":"u6211u662fu5c0fu53f7", "url":"http://www.zhihu.com/api/v4/people/1da75b85900e00adb072e91c56fd9149", "gender":-1 ...}

登录后复制

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

代码实现

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

用户信息

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

@need_logindef 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_logindef 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 Zhihuif name == 'main': zhihu = Zhihu() profile = zhihu.user("xiaoxiaodouzi") _id = profile.get("id") zhihu.send_message(_id, "你好,这是来自Python之禅的问候")

登录后复制

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

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

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

【相关推荐】

1. python爬虫入门(5)–正则表达式实例教程

2. python爬虫入门(4)–详解HTML文本的解析库BeautifulSoup

3. python爬虫入门(2)–HTTP库requests

4. python爬虫入门(1)–快速理解HTTP协议

5. 分享一个利用Python爬虫模拟知乎登录的实例

以上就是python爬虫入门(3)–利用requests构建知乎API的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2272231.html

(0)
上一篇 2025年2月27日 12:44:05
下一篇 2025年2月27日 06:30:04

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python爬虫入门(1)–快速理解HTTP协议

    http协议是互联网里面最重要,最基础的协议之一,我们的爬虫需要经常和http协议打交道。下面这篇文章主要给大家介绍了关于python爬虫入门之快速理解http协议的相关资料,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。 …

    2025年2月27日
    200
  • python函数参数的不同

    在运用python的过程中,发现当函数参数为list的时候,在函数内部调用list.append()会改变形参,与c/c++的不太一样,查阅相关资料,在这里记录一下。 python中id可以获取对象的内存地址 >>> nu…

    编程技术 2025年2月27日
    200
  • python发送邮件

    python发送邮件 准备 python中发送邮件主要用的是smtplib和email两个模块,下面主要对这两个模块进行讲解 在讲解之前需要准备至少两个测试的邮箱,其中要在邮箱的设置中开启smtplib协议才可以进行发送和接受 smtpli…

    编程技术 2025年2月27日
    200
  • Python客户端与服务端的简单网络编程示例

    这篇文章主要介绍了python简单网络编程,详细介绍了客户端与服务端的具体实现技巧与相关注意事项,需要的朋友可以参考下 本文实例讲述了Python简单网络编程。分享给大家供大家参考,具体如下: 内容目录 1. 客户端(client.py)2…

    编程技术 2025年2月27日
    200
  • 如何利用Python在运算后得到浮点数值的方法详解

    在python中进行两个整数相除的时候,在默认情况下都是只能够得到整数的值,而在需要进行对除所得的结果进行精确地求值时,想在运算后即得到浮点值,那么如何进行处理呢? 1、修改被除数的值为带小数点的形式即可得到浮点值,这种方法在被除数事先知道…

    编程技术 2025年2月27日
    200
  • python多进程快还是多线程快?

    下面小编就为大家带来一篇python多进程和多线程究竟谁更快(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 python3.6 threading和multiprocessing 四核+三星250G-…

    2025年2月27日
    200
  • 关于Python安装官方whl包和tar.gz包的方法详解(收藏)

    下面小编就为大家带来一篇python安装官方whl包和tar.gz包的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 Windows环境:   安装whl包:pip install wheel  …

    编程技术 2025年2月27日
    200
  • Python递归函数的定义与用法的实例分析

    这篇文章主要介绍了python递归函数定义与用法,结合具体实例形式分析了python递归函数的原理、实现技巧与相关注意事项,需要的朋友可以参考下 本文实例讲述了Python递归函数定义与用法。分享给大家供大家参考,具体如下: 递归函数 在函…

    编程技术 2025年2月27日
    200
  • 基于http请求与响应实现的网页源码读取的相关操作技巧

    这篇文章主要介绍了python实现的下载网页源码功能,涉及python基于http请求与响应实现的网页源码读取功能相关操作技巧,需要的朋友可以参考下 本文实例讲述了Python实现的下载网页源码功能。分享给大家供大家参考,具体如下: #!/…

    2025年2月27日
    200
  • 分享python中鸭子类和多态实例

    下面小编就为大家带来一篇老生常谈python之鸭子类和多态。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 一、 什么是多态 一种类型具有多种类型的能力允许不同的对象对同一消息做出灵活的反应以一种通用的方式对待…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论