python爬蟲(chóng)入門(mén)教程--利用requests構(gòu)建知乎API(三)
前言
在爬蟲(chóng)系列文章 優(yōu)雅的HTTP庫(kù)requests 中介紹了 requests 的使用方式,這一次我們用 requests 構(gòu)建一個(gè)知乎 API,功能包括:私信發(fā)送、文章點(diǎn)贊、用戶(hù)關(guān)注等,因?yàn)槿魏紊婕坝脩?hù)操作的功能都需要登錄后才操作,所以在閱讀這篇文章前建議先了解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ā)送私信了。
打開(kāi) Chrome 瀏覽器,隨便找一個(gè)用戶(hù),點(diǎn)擊發(fā)送私信,追蹤一下私信的網(wǎng)絡(luò)請(qǐng)求過(guò)程。
先看下請(qǐng)求頭信息
請(qǐng)求頭 Header 中有 cookies 登錄信息,此外還有一個(gè) authorization 字段,該字段是用于用戶(hù)認(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)該猜得出這是類(lèi)似于用戶(hù) id 的字段。
那么現(xiàn)在問(wèn)題來(lái)了,如何通過(guò)用戶(hù)主頁(yè)的URL找到用戶(hù)的 id 呢?為了完整的模擬私信的整個(gè)流程,我特地注冊(cè)了一個(gè)知乎小號(hào)。
如果你手頭沒(méi)有多余的手機(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的后面部分,這部分我們稱(chēng)之為 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 字段就是用戶(hù)的id。
代碼實(shí)現(xiàn)
到此我們把私信功能的思路理清楚了,代碼實(shí)現(xiàn)就是水到渠成的事情了。
用戶(hù)信息
為了得到私信接口需要的 receiver_hash 字典,我們先要獲取用戶(hù)信息,該信息里面含有用于的id值。
@need_login def user(self, url_token): """ 獲取用戶(hù)信息, :param url_token: url_token 是用戶(hù)主頁(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): """ 給指定的用戶(hù)發(fā)私信 :param user_id: 用戶(hù)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的類(lèi)里面,我只列出了關(guān)鍵代碼,涉及到的 @need_login 是一個(gè)用戶(hù)認(rèn)證的裝飾器,表示該方法需要登錄后才能操作。細(xì)心的你可能發(fā)現(xiàn),每個(gè)請(qǐng)求中我并沒(méi)有顯示地指定 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之禪的問(wèn)候")
執(zhí)行完成后,小號(hào)成功收到我發(fā)送的私信。
最后,我們可以按照類(lèi)似的思路把關(guān)注用戶(hù),點(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)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Python?Pytorch學(xué)習(xí)之圖像檢索實(shí)踐
隨著電子商務(wù)和在線網(wǎng)站的出現(xiàn),圖像檢索在我們的日常生活中的應(yīng)用一直在增加。圖像檢索的基本本質(zhì)是根據(jù)查詢(xún)圖像的特征從集合或數(shù)據(jù)庫(kù)中查找圖像。本文將利用Pytorch實(shí)現(xiàn)圖像檢索,需要的可以參考一下2022-04-04本地部署Python?Flask并搭建web問(wèn)答應(yīng)用程序框架實(shí)現(xiàn)遠(yuǎn)程訪問(wèn)的操作方法
Flask是一個(gè)Python編寫(xiě)的Web微框架,使用Python語(yǔ)言快速實(shí)現(xiàn)一個(gè)網(wǎng)站或Web服務(wù),本期教程我們使用Python Flask搭建一個(gè)web問(wèn)答應(yīng)用程序框架,并結(jié)合cpolar內(nèi)網(wǎng)穿透工具將我們的應(yīng)用程序發(fā)布到公共網(wǎng)絡(luò)上,實(shí)現(xiàn)可多人遠(yuǎn)程進(jìn)入到該web應(yīng)用程序訪問(wèn),需要的朋友可以參考下2023-12-12Python數(shù)據(jù)分析之?Pandas?Dataframe條件篩選遍歷詳情
這篇文章主要介紹了Python數(shù)據(jù)分析之?Pandas?Dataframe條件篩選遍歷詳情,查詢(xún)Pandas?Dataframe數(shù)據(jù)時(shí),經(jīng)常會(huì)篩選出符合條件的數(shù)據(jù),關(guān)于其使用方式,需要的小伙伴可以參考一下下面文章內(nèi)容2022-05-05在Python中處理日期和時(shí)間的基本知識(shí)點(diǎn)整理匯總
這篇文章主要介紹了在Python中處理日期和時(shí)間的基本知識(shí)點(diǎn)整理匯總,是Python入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05python實(shí)現(xiàn)庫(kù)存商品管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)庫(kù)存商品管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02在pycharm中文件取消用 pytest模式打開(kāi)的操作
這篇文章主要介紹了在pycharm中文件取消用 pytest模式打開(kāi)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09python下對(duì)hsv顏色空間進(jìn)行量化操作
這篇文章主要介紹了python下對(duì)hsv顏色空間進(jìn)行量化操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06