首頁  >  文章  >  後端開發  >  python爬蟲入門(3)--利用requests建構知乎API

python爬蟲入門(3)--利用requests建構知乎API

零下一度
零下一度原創
2017-05-27 11:57:481989瀏覽

這篇文章主要給大家介紹了關於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之禅的问候")

執行完成後,小號成功收到我發送的私訊。

最後,我們可以按照類似的思路把關注用戶,按讚等功能實現了。

【相關推薦】

1. python爬蟲入門(5)--正規表示式實例教學

2. python爬蟲入門(4)--詳解HTML文字的解析庫BeautifulSoup

3. python爬蟲入門(2)--HTTP庫requests

4. python爬蟲入門(1)--快速理解HTTP協定

5. 分享一個利用Python爬蟲模擬知乎登入的實例

以上是python爬蟲入門(3)--利用requests建構知乎API的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn