這篇文章主要給大家介紹了關於python爬蟲入門之利用requests構建知乎API的相關資料,文中透過範例程式碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
前言
在爬蟲系列文章優雅的HTTP庫requests 中介紹了requests 的使用方式,這次我們用requests 建立一個知乎API,功能包括:私訊傳送、文章按讚、使用者追蹤等,因為任何涉及使用者操作的功能都需要登入後才可操作,所以在閱讀這篇文章前建議先了解Python模擬知乎登入。現在假設你已經知道如何用 requests 模擬知乎登入了。
思路分析
發送私訊的過程就是瀏覽器傳送一個HTTP 請求,請求封包包含請求URL、請求頭Header、還有請求體Body,只要把這些資訊弄清楚,那麼就很容易用requests 來模擬瀏覽器發送私訊了。
打開 Chrome 瀏覽器,隨便找一個用戶,點擊發送私訊,追蹤一下私訊的網路請求流程。
先看下請求頭資訊
#請求頭Header 中有cookies 登入訊息,此外還有一個authorization 字段,該字段是用於用戶認證的,同時這個字段也存在cookies 中(為了防止cookie 資訊洩露,我打了馬賽克), requests 請求時這些資訊都必須攜帶上。
再來看看請求的URL和請求體
#請求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 網路請求。
請求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":"\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之禅的问候")
執行完成後,小號成功收到我發送的私訊。
最後,我們可以按照類似的思路把關注用戶,按讚等功能實現了。
【相關推薦】
2. python爬蟲入門(4)--詳解HTML文字的解析庫BeautifulSoup
3. python爬蟲入門(2)--HTTP庫requests
以上是python爬蟲入門(3)--利用requests建構知乎API的詳細內容。更多資訊請關注PHP中文網其他相關文章!