Heim  >  Artikel  >  Backend-Entwicklung  >  Erste Schritte mit Python-Crawlern (3) – Verwenden von Anfragen zum Erstellen der Zhihu-API

Erste Schritte mit Python-Crawlern (3) – Verwenden von Anfragen zum Erstellen der Zhihu-API

零下一度
零下一度Original
2017-05-27 11:57:482002Durchsuche

Dieser Artikel führt Sie hauptsächlich in die relevanten Informationen zu Python ein, wie Sie mit Crawlern beginnen und Anfragen zum Erstellen der Zhihu-API verwenden. Der Artikel stellt es detailliert anhand von Beispielcode vor Eine große Hilfe für alle. Freunde, die es brauchen, können einen Blick darauf werfen.

Vorwort

Im Crawler-Reihenartikel „Elegante HTTP-Bibliotheksanfragen“ wird die Verwendung von Anfragen vorgestellt Wissen Zu den Funktionen der Hu-API gehören: Senden privater Nachrichten, Liken von Artikeln, Verfolgen von Benutzern usw. Da für jede Funktion, die Benutzeroperationen beinhaltet, eine Anmeldung erforderlich ist, wird empfohlen, Python zu verstehen, um die Zhihu-Anmeldung zu simulieren, bevor Sie diesen Artikel lesen. Nun wird davon ausgegangen, dass Sie bereits wissen, wie Sie Anfragen verwenden, um die Zhihu-Anmeldung zu simulieren.

Ideenanalyse

Der Vorgang des Sendens einer privaten Nachricht besteht darin, dass der Browser eine HTTP-Anfrage an den Server sendet Anfrage-URL und Anfrage-HeaderKopfer und der Anfragetext Solange diese Informationen klar sind, ist es einfach, Anfragen zu verwenden, um das Senden privater Nachrichten durch den Browser zu simulieren.

Öffnen Sie den Chrome-Browser, suchen Sie einen Benutzer, klicken Sie, um eine private Nachricht zu senden, und verfolgen Sie den Netzwerkanforderungsprozess der privaten Nachricht.

Schauen Sie sich zunächst die Informationen im Anforderungsheader an

Der Anforderungsheader enthält CookieAnmeldeinformationen. Darüber hinaus gibt es auch ein Autorisierungsfeld, das zur Benutzerauthentifizierung verwendet wird. Gleichzeitig wird dieses Feld auch in Cookies gespeichert (um zu verhindern, dass Cookie-Informationen durchsickern, habe ich ein Mosaik erstellt). wenn Anfragen gestellt werden.

Werfen wir einen Blick auf die Anfrage-URL und den Anfragetext

Die Anfrage-URL lautet www.zhihu.com/api/ v4/messages, die Anforderungsmethode ist POST, der Anforderungstext

{"type":"common","content":"你好,我是pythoner","receiver_hash":"1da75b85900e00adb072e91c56fd9149"}

Der Anforderungstext ist eine JSON-Zeichenfolge, der Typ und der Inhalt sind leicht zu verstehen, aber ich weiß nicht, was Receiver_Hash ist und was ich brauche muss noch näher bestimmt werden, aber Sie sollten es erraten können. Dies ist ein Feld, das der Benutzer-ID ähnelt.

Nun stellt sich also die Frage: Wie finde ich die Benutzer-ID über die URL der Homepage des Benutzers? Um den gesamten Prozess des privaten Versendens vollständig zu simulieren, habe ich speziell ein Zhihu-Konto registriert.

Wenn Sie keine zusätzliche Mobiltelefonnummer haben, können Sie mit Google nach „SMS online empfangen“ suchen. Es gibt viele Mobiltelefonnummern im Internet, die den kostenlosen Online-Empfang von SMS ermöglichen Homepage meines registrierten Kontos: https://www.zhihu.com/people/xiaoxiaodouzi

Versuchen Sie zunächst, dem Trompetenkonto zu folgen, und finden Sie dann das Trompetenkonto in der Liste, der ich folge, wenn ich die Maus bewege Beim Avatar des Trumpet-Kontos stelle ich fest, dass es eine HTTP-Netzwerkanfrage gibt.

Die Anforderungs-URL lautet www.zhihu.com/api/v4/members/xiaoxiaodouzi. Der hintere Teil dieser URL „xiaoxiaodouzi“ entspricht dem hinteren Teil der Trompete Homepage-URL. Diesen Teil nennen wir url_token. Die von der

-Schnittstelle zurückgegebenen Daten sind die persönlichen öffentlichen Informationen des Benutzers.

{ 
 ...
 "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
 ...
}

Wir können deutlich sehen, dass es ein ID-Feld gibt. Wie wir bereits vermutet haben, ist das Receiver_Hash-Feld in der privaten Nachricht die ID des Benutzers.

Code-Implementierung

An dieser Stelle haben wir die Idee der Privatnachrichtenfunktion geklärt, und die Code-Implementierung ist eine Selbstverständlichkeit .

Benutzerinformationen

Um das für die private Nachrichtenschnittstelle erforderliche Receiver_Hash-Wörterbuch zu erhalten, müssen wir zunächst die Benutzerinformationen abrufen enthält die ID für den Wert.


@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()

Senden Sie eine private Nachricht

@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

Die beiden oben genannten Methoden werden eingefügt einer namens Zhihu In der Klasse habe ich nur die Schlüsselcodes aufgelistet. Der beteiligte @need_login ist ein Benutzerauthentifizierungsdekorator, der darauf hinweist, dass diese Methode eine Anmeldung erfordert, bevor sie ausgeführt werden kann. Wenn Sie vorsichtig sind, stellen Sie möglicherweise fest, dass ich das Header-Feld nicht in jeder Anfrage explizit angegeben habe, da ich es in der Methode init.py initialisiert habe.

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

Aufrufen und ausführen

from zhihu import Zhihu

if name == 'main':
 zhihu = Zhihu()
 profile = zhihu.user("xiaoxiaodouzi")
 _id = profile.get("id")
 zhihu.send_message(_id, "你好,这是来自Python之禅的问候")

Nach Abschluss der Ausführung hat die Trompete die von mir gesendete private Nachricht erfolgreich empfangen.

Schließlich können wir einer ähnlichen Idee folgen, um Funktionen wie das Folgen und Liken von Benutzern zu implementieren.

[Verwandte Empfehlungen]

1. Erste Schritte mit Python-Crawlern (5) – Beispiel-Tutorial für reguläre Ausdrücke

2. Erste Schritte mit Python-Crawlern (4) – Detaillierte Erklärung der HTML-Textparsing-Bibliothek BeautifulSoup

3. Erste Schritte mit Python-Crawlern (2) – HTTP-Bibliotheksanfragen

4. Einführung in den Python-Crawler (1) – Schnelles Verständnis des HTTP-Protokolls

5. Teilen Sie ein Beispiel für die Verwendung von Python Crawler zur Simulation der Zhihu-Anmeldung

Das obige ist der detaillierte Inhalt vonErste Schritte mit Python-Crawlern (3) – Verwenden von Anfragen zum Erstellen der Zhihu-API. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn