Heim  >  Artikel  >  Backend-Entwicklung  >  Teilen Sie ein Beispiel für die Verwendung eines Python-Crawlers zur Simulation der Zhihu-Anmeldung

Teilen Sie ein Beispiel für die Verwendung eines Python-Crawlers zur Simulation der Zhihu-Anmeldung

零下一度
零下一度Original
2017-05-27 11:52:002334Durchsuche

Während des Crawling-Vorgangs ist das Crawlen einiger Seiten vor der Anmeldung verboten. Zu diesem Zeitpunkt müssen Sie die Anmeldung simulieren. Im folgenden Artikel wird hauptsächlich erläutert, wie Sie den Python-Crawler verwenden, um die Zhihu-Anmeldung zu simulieren Das Methoden-Tutorial ist im Artikel sehr detailliert. Freunde, die es benötigen, können es sich gemeinsam ansehen.

Vorwort

Wie jeder weiß, der häufig Crawler schreibt, ist das Crawlen einiger Seiten vor dem Einloggen verboten, wie z. B. die Themenseite von Zhihu Benutzer müssen sich anmelden, um darauf zuzugreifen, und „Anmelden“ ist untrennbar mit der Cookie-Technologie in HTTP verbunden.

Login-Prinzip

Das Prinzip von Cookies ist sehr einfach, da HTTP ein zustandsloses Protokoll ist, also um das zustandslose HTTP-Protokoll zu verwenden Der Sitzungsstatus wird oben beibehalten, sodass der Server weiß, mit welchem ​​Client er gerade zu tun hat. Die Cookie-Technologie entspricht einer vom Server dem Client zugewiesenen Kennung.

  • Wenn der Browser zum ersten Mal eine HTTP-Anfrage initiiert, enthält er keine Cookie-Informationen

  • Der Server verarbeitet die HTTP-Antwort zusammen mit einer Cookie-Information, die zusammen an den Browser zurückgegeben wird

  • Der Browser sendet die vom Server zurückgegebene Cookie-Information zusammen mit der zweiten Anfrage an den Server

  • Der Server empfängt die HTTP-Anfrage und stellt fest, dass sich im Anforderungsheader ein Cookie-Feld befindet, sodass er weiß, dass er sich bereits zuvor mit diesem Benutzer befasst hat.

Praktische Anwendung

Jeder, der Zhihu verwendet hat, weiß das, solange Sie Ihren Benutzernamen und angeben Passwort und Verifizierung Nach Eingabe des Codes können Sie sich anmelden. Das ist natürlich genau das, was wir sehen. Welche technischen Details sich dahinter verbergen, gilt es mithilfe eines Browsers zu entdecken. Lassen Sie uns nun Chrome verwenden, um zu sehen, was passiert, nachdem wir das Formular ausgefüllt haben.

(Wenn Sie bereits angemeldet sind, melden Sie sich zuerst ab) Rufen Sie zunächst die Zhihu-Anmeldeseite www.zhihu.com/#signin auf und öffnen Sie die Chrome-Entwicklersymbolleiste (drücken Sie F12). ) Versuchen Sie zunächst, einen falschen Bestätigungscode einzugeben und beobachten Sie, wie der Browser die Anfrage sendet.

Mehrere wichtige Informationen können der Browseranfrage entnommen werden

  • Die Login-URL-Adresse lautet https://www.zhihu. com/login/email

  • Für die Anmeldung sind 4 Formulardaten erforderlich: Benutzername (E-Mail), Passwort (Passwort), Bestätigungscode (Captcha), _xsrf.

  • Die URL-Adresse zum Erhalten des Bestätigungscodes lautet https://www.zhihu.com/captcha.gif?r=1490690391695&type=login

Was ist _xsrf? Wenn Sie mit CSRF-Angriffen (Cross-Site Request Forgery) bestens vertraut sind, müssen Sie wissen, dass xsrf eine Folge von Pseudozufallszahlen ist, die zur Verhinderung von Cross-Site Request Forgery verwendet wird. Es ist normalerweise im Formular-Tag der Webseite vorhanden, indem Sie auf der Seite nach „xsrf“ suchen. Tatsächlich befindet sich _xsrf in einem versteckten Eingabe-Tag

Nachdem Sie geklärt haben, wie Sie die für die Browser-Anmeldung erforderlichen Daten erhalten, können Sie nun mit dem Schreiben von Code beginnen, um die Browser-Anmeldung mit Python zu simulieren. Die beiden Bibliotheken von Drittanbietern, auf die beim Anmelden zurückgegriffen wird, sind Anfragen und das Modul „BeautifulSoup“ kann zur automatischen Verarbeitung von HTTP-Cookies verwendet werden die Kapselung von Cookies, die das Speichern von Cookies in Dateien und das Laden aus Dateien unterstützt. Das Sitzungsobjekt bietet Cookie-Persistenz- und Verbindungspooling-Funktionen. Anforderungen können über das Sitzungsobjekt gesendet werden.

pip install beautifulsoup4==4.5.3
pip install requests==2.13.0
Laden Sie zunächst die Cookie-Informationen aus der Datei „cookies.txt“. Beim ersten Lauf tritt eine LoadError-Ausnahme auf.

Xsrf abrufen

from http import cookiejar
session = requests.session()
session.cookies = cookiejar.LWPCookieJar(filename='cookies.txt')
try:
 session.cookies.load(ignore_discard=True)
except LoadError:
 print("load cookies failed")

Der Tag, an dem sich xsrf befindet, wurde zuvor gefunden. Sie können die Suchmethode von BeatifulSoup verwenden, um ihn abzurufen das xsrf sehr praktisch. Wert


Bestätigungscode abrufen

def get_xsrf():
 response = session.get("https://www.zhihu.com", headers=headers)
 soup = BeautifulSoup(response.content, "html.parser")
 xsrf = soup.find('input', attrs={"name": "_xsrf"}).get("value")
 return xsrf

Der Bestätigungscode wird zurückgegeben über die /captcha.gif-Schnittstelle Ja, hier laden wir das Bestätigungscode-Bild herunter und speichern es zur manuellen Identifizierung im aktuellen Verzeichnis. Natürlich können Sie eine Support-Bibliothek eines Drittanbieters verwenden, um es automatisch zu identifizieren, z. B. Pytesser.

Anmelden

def get_captcha():
 """
 把验证码图片保存到当前目录,手动识别验证码
 :return:
 """
 t = str(int(time.time() * 1000))
 captcha_url = 'https://www.zhihu.com/captcha.gif?r=' + t + "&type=login"
 r = session.get(captcha_url, headers=headers)
 with open('captcha.jpg', 'wb') as f:
  f.write(r.content)
 captcha = input("验证码:")
 return captcha

一切参数准备就绪之后,就可以请求登录接口了。

def login(email, password):
 login_url = 'www.zhihu.com/login/email'
 data = {
  'email': email,
  'password': password,
  '_xsrf': get_xsrf(),
  "captcha": get_captcha(),
  'remember_me': 'true'}
 response = session.post(login_url, data=data, headers=headers)
 login_code = response.json()
 print(login_code['msg'])
 for i in session.cookies:
  print(i)
 session.cookies.save()

请求成功后,session 会自动把 服务端的返回的cookie 信息填充到 session.cookies 对象中,下次请求时,客户端就可以自动携带这些cookie去访问那些需要登录的页面了。

auto_login.py 示例代码

# encoding: utf-8
# !/usr/bin/env python
"""
作者:liuzhijun
"""
import time
from http import cookiejar

import requests
from bs4 import BeautifulSoup

headers = {
  "Host": "www.zhihu.com",
  "Referer": "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'
}

# 使用登录cookie信息
session = requests.session()
session.cookies = cookiejar.LWPCookieJar(filename='cookies.txt')
try:
  print(session.cookies)
  session.cookies.load(ignore_discard=True)

except:
  print("还没有cookie信息")


def get_xsrf():
  response = session.get("www.zhihu.com", headers=headers)
  soup = BeautifulSoup(response.content, "html.parser")
  xsrf = soup.find('input', attrs={"name": "_xsrf"}).get("value")
  return xsrf


def get_captcha():
  """
  把验证码图片保存到当前目录,手动识别验证码
  :return:
  """
  t = str(int(time.time() * 1000))
  captcha_url = 'www.zhihu.com/captcha.gif?r=' + t + "&type=login"
  r = session.get(captcha_url, headers=headers)
  with open('captcha.jpg', 'wb') as f:
    f.write(r.content)
  captcha = input("验证码:")
  return captcha


def login(email, password):
  login_url = 'www.zhihu.com/login/email'
  data = {
    'email': email,
    'password': password,
    '_xsrf': get_xsrf(),
    "captcha": get_captcha(),
    'remember_me': 'true'}
  response = session.post(login_url, data=data, headers=headers)
  login_code = response.json()
  print(login_code['msg'])
  for i in session.cookies:
    print(i)
  session.cookies.save()


if name == 'main':
  email = "xxxx"
  password = "xxxxx"
  login(email, password)

【相关推荐】

1. python爬虫入门(4)--详解HTML文本的解析库BeautifulSoup

2. python爬虫入门(3)--利用requests构建知乎API

3. python爬虫入门(2)--HTTP库requests

4.  python爬虫入门(1)--快速理解HTTP协议

5. python爬虫入门(5)--正则表达式实例教程

Das obige ist der detaillierte Inhalt vonTeilen Sie ein Beispiel für die Verwendung eines Python-Crawlers zur Simulation der Zhihu-Anmeldung. 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