python爬蟲入門教程--利用requests構(gòu)建知乎API(三)
前言
在爬蟲系列文章 優(yōu)雅的HTTP庫(kù)requests 中介紹了 requests 的使用方式,這一次我們用 requests 構(gòu)建一個(gè)知乎 API,功能包括:私信發(fā)送、文章點(diǎn)贊、用戶關(guān)注等,因?yàn)槿魏紊婕坝脩舨僮鞯墓δ芏夹枰卿浐蟛挪僮鳎栽陂喿x這篇文章前建議先了解Python模擬知乎登錄 ?,F(xiàn)在假設(shè)你已經(jīng)知道如何用 requests 模擬知乎登錄了。
思路分析
發(fā)送私信的過(guò)程就是瀏覽器向服務(wù)器發(fā)送一個(gè) HTTP 請(qǐng)求,請(qǐng)求報(bào)文包括請(qǐng)求 URL、請(qǐng)求頭 Header、還有請(qǐng)求體 Body,只要把這些信息弄清楚,那么就很容易用 requests 來(lái)模擬瀏覽器發(fā)送私信了。
打開 Chrome 瀏覽器,隨便找一個(gè)用戶,點(diǎn)擊發(fā)送私信,追蹤一下私信的網(wǎng)絡(luò)請(qǐng)求過(guò)程。
先看下請(qǐng)求頭信息

請(qǐng)求頭 Header 中有 cookies 登錄信息,此外還有一個(gè) authorization 字段,該字段是用于用戶認(rèn)證的,同時(shí)這個(gè)字段也存在 cookies 中(為了防止 cookie 信息泄露,我打了馬賽克), requests 請(qǐng)求時(shí)這些信息都必須攜帶上。
再來(lái)看看請(qǐng)求的URL和請(qǐng)求體

請(qǐng)求URL是 https://www.zhihu.com/api/v4/messages ,請(qǐng)求方法是 POST,請(qǐng)求體
{"type":"common","content":"你好,我是pythoner","receiver_hash":"1da75b85900e00adb072e91c56fd9149"}請(qǐng)求體是一個(gè) json 字符串,type 和 content 很好理解,但 receiver_hash 是什么并不知道,需要進(jìn)一步確定,不過(guò)你應(yīng)該猜得出這是類似于用戶 id 的字段。
那么現(xiàn)在問題來(lái)了,如何通過(guò)用戶主頁(yè)的URL找到用戶的 id 呢?為了完整的模擬私信的整個(gè)流程,我特地注冊(cè)了一個(gè)知乎小號(hào)。
如果你手頭沒有多余的手機(jī)號(hào),可以用 Google 搜「receive sms online」,網(wǎng)上很多提供免費(fèi)在線接收短信的手機(jī)號(hào)碼,我注冊(cè)的小號(hào)主頁(yè):https://www.zhihu.com/people/xiaoxiaodouzi
先嘗試關(guān)注小號(hào),然后在我關(guān)注的列表中找到該小號(hào),把鼠標(biāo)移到小號(hào)的頭像處時(shí),發(fā)現(xiàn)有一個(gè) HTTP 網(wǎng)絡(luò)請(qǐng)求。

請(qǐng)求 url 是 https://www.zhihu.com/api/v4/members/xiaoxiaodouzi ,這個(gè)URL的后面部分「xiaoxiaodouzi」對(duì)應(yīng)小號(hào)主頁(yè)URL的后面部分,這部分我們稱之為 url_token。
接口的返回?cái)?shù)據(jù)
{
...
"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
...
}我們可以很清楚的看到有個(gè)id的字段,跟我們之前猜測(cè)的一樣,私信里面的 receiver_hash 字段就是用戶的id。
代碼實(shí)現(xiàn)
到此我們把私信功能的思路理清楚了,代碼實(shí)現(xiàn)就是水到渠成的事情了。
用戶信息
為了得到私信接口需要的 receiver_hash 字典,我們先要獲取用戶信息,該信息里面含有用于的id值。
@need_login def user(self, url_token): """ 獲取用戶信息, :param url_token: url_token 是用戶主頁(yè)url中后面部分 例如: https://www.zhihu.com/people/xiaoxiaodouzi url_token 是 xiaoxiaodouzi :return:dict """ response = self._session.get(URL.profile(url_token)) return response.json()
發(fā)送私信
@need_login
def send_message(self, user_id, content):
"""
給指定的用戶發(fā)私信
:param user_id: 用戶ID
:param content: 私信內(nèi)容
"""
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("私信發(fā)送失敗, %s" % data.get("error").get("message"))
else:
self.logger.info("發(fā)送成功")
return data上面兩個(gè)方法放在一個(gè)叫Zhihu的類里面,我只列出了關(guān)鍵代碼,涉及到的 @need_login 是一個(gè)用戶認(rèn)證的裝飾器,表示該方法需要登錄后才能操作。細(xì)心的你可能發(fā)現(xiàn),每個(gè)請(qǐng)求中我并沒有顯示地指定 Header 字段,那時(shí)因?yàn)槲野阉旁?__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調(diào)用執(zhí)行
from zhihu import Zhihu
if __name__ == '__main__':
zhihu = Zhihu()
profile = zhihu.user("xiaoxiaodouzi")
_id = profile.get("id")
zhihu.send_message(_id, "你好,這是來(lái)自Python之禪的問候")執(zhí)行完成后,小號(hào)成功收到我發(fā)送的私信。

最后,我們可以按照類似的思路把關(guān)注用戶,點(diǎn)贊等功能實(shí)現(xiàn)了。
源碼地址:https://github.com/lzjun567/zhihu-api
在線下載:http://xiazai.jb51.net/201705/yuanma/zhihu-api(jb51.net).rar
總結(jié)
以上就是關(guān)于這篇文章的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家學(xué)習(xí)或者使用python能帶來(lái)一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
聊聊基于pytorch實(shí)現(xiàn)Resnet對(duì)本地?cái)?shù)據(jù)集的訓(xùn)練問題
本文項(xiàng)目是使用Resnet模型來(lái)識(shí)別螞蟻和蜜蜂,其一共有三百九十六張的數(shù)據(jù),訓(xùn)練集只有兩百多張(數(shù)據(jù)集很小),運(yùn)行十輪后,分別對(duì)訓(xùn)練集和測(cè)試集在每一輪的準(zhǔn)確率,對(duì)pytorch實(shí)現(xiàn)Resnet本地?cái)?shù)據(jù)集的訓(xùn)練感興趣的朋友一起看看吧2022-03-03
Pytest如何使用skip跳過(guò)執(zhí)行測(cè)試
這篇文章主要介紹了Pytest如何使用skip跳過(guò)執(zhí)行測(cè)試,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
基于Python的接口自動(dòng)化讀寫excel文件的方法
這篇文章主要介紹了基于Python的接口自動(dòng)化讀寫excel文件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
python實(shí)現(xiàn)批量移動(dòng)文件
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)批量移動(dòng)文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
python return實(shí)現(xiàn)匯率轉(zhuǎn)換器教程示例
這篇文章主要為大家介紹了python return實(shí)現(xiàn)匯率轉(zhuǎn)換器教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Python 結(jié)構(gòu)化字符串中提取數(shù)據(jù)詳情
這篇文章主要介紹了Python 結(jié)構(gòu)化字符串中提取數(shù)據(jù)詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08

