Heim  >  Artikel  >  Backend-Entwicklung  >  [Python] Web Crawler (4): Einführung und praktische Anwendungen von Opener und Handler

[Python] Web Crawler (4): Einführung und praktische Anwendungen von Opener und Handler

黄舟
黄舟Original
2017-01-21 13:50:521281Durchsuche

Bevor wir mit dem folgenden Inhalt beginnen, erklären wir zunächst die beiden Methoden in urllib2: info und geturl

Das von urlopen zurückgegebene Antwortobjekt (oder die HTTPError-Instanz) verfügt über zwei sehr nützliche Methoden: info () und geturl( )

1.geturl():

Dies gibt die tatsächlich erhaltene URL zurück. Dies ist sehr nützlich, da urlopen (oder das, was das Opener-Objekt verwendet) möglicherweise Weiterleitungen enthält. Die erhaltene URL kann sich von der Anforderungs-URL unterscheiden.

Nehmen Sie als Beispiel einen Hyperlink in Renren,


Wir erstellen eine urllib2_test10.py, um die ursprüngliche URL und den umgeleiteten Link zu vergleichen:

from urllib2 import Request, urlopen, URLError, HTTPError  
  
  
old_url = 'http://rrurl.cn/b1UZuP'  
req = Request(old_url)  
response = urlopen(req)    
print 'Old url :' + old_url  
print 'Real url :' + response.geturl()

Nach dem Ausführen können Sie die URL sehen, auf die der echte Link verweist:

[Python] Web Crawler (4): Einführung und praktische Anwendungen von Opener und Handler

2.info():

Dies gibt ein Objekt zurück Ein Wörterbuchobjekt, das die erhaltene Seitensituation beschreibt. Normalerweise werden vom Server bestimmte Header gesendet. Derzeit eine Instanz von httplib.HTTPMessage.

Klassische Header umfassen „Inhaltslänge“, „Inhaltstyp“ und andere Inhalte.


Wir erstellen eine urllib2_test11.py, um die Anwendung von Informationen zu testen:

from urllib2 import Request, urlopen, URLError, HTTPError  
  
old_url = 'http://www.baidu.com'  
req = Request(old_url)  
response = urlopen(req)    
print 'Info():'  
print response.info()

Die Ergebnisse der Operation sind wie folgt, Sie kann die Seite sehen Zugehörige Informationen:

[Python] Web Crawler (4): Einführung und praktische Anwendungen von Opener und Handler

Lassen Sie uns über zwei wichtige Konzepte in urllib2 sprechen: Öffner und Handler.

1.Öffner:

Wenn Sie eine URL erhalten, verwenden Sie einen Öffner (eine Instanz von urllib2.OpenerDirector).

Normalerweise verwenden wir den Standardöffner: durch urlopen.

Aber Sie können Ihre eigenen Opener erstellen.

2.Handles:

Öffner verwenden Prozessor-Handler, und alle „schweren“ Arbeiten werden von den Handlern erledigt.

Jeder Handler weiß, wie er URLs über ein bestimmtes Protokoll öffnet oder wie er mit verschiedenen Aspekten des Öffnens einer URL umgeht.

Wie etwa HTTP-Redirect oder HTTP-Cookies.


Sie sollten einen Öffner erstellen, wenn Sie URLs mit einem bestimmten Handler abrufen möchten, beispielsweise einen Öffner, der Cookies verarbeitet, oder einen Öffner, der dies nicht tut umleiten.


Um einen Opener zu erstellen, instanziieren Sie einen OpenerDirector,

und rufen Sie dann .add_handler(some_handler_instance) auf.

In ähnlicher Weise können Sie build_opener verwenden, eine praktischere Funktion zum Erstellen von Opener-Objekten. Sie erfordert nur einen Funktionsaufruf.
build_opener fügt standardmäßig mehrere Prozessoren hinzu, bietet aber eine schnelle Möglichkeit, die Standardprozessoren hinzuzufügen oder zu aktualisieren.

Andere Handler, die Sie möglicherweise für Proxys, Validierung und andere häufige, aber eher spezielle Fälle verwenden möchten.


install_opener wird verwendet, um einen (globalen) Standardöffner zu erstellen. Das bedeutet, dass beim Aufruf von urlopen der von Ihnen installierte Opener verwendet wird.

Das Opener-Objekt verfügt über eine open-Methode.

Diese Methode kann wie die Funktion urlopen direkt zum Abrufen von URLs verwendet werden: Es ist normalerweise nicht erforderlich, install_opener aufzurufen, außer aus Bequemlichkeitsgründen.


Nachdem wir die beiden oben genannten Inhalte fertiggestellt haben, werfen wir einen Blick auf den oben genannten grundlegenden Authentifizierungsinhalt.

Basisauthentifizierung Basisauthentifizierung

Um das Erstellen und Installieren eines Handlers zu demonstrieren, verwenden wir HTTPBasicAuthHandler.

Wenn eine grundlegende Verifizierung erforderlich ist, sendet der Server einen Header (401-Fehlercode), um eine Verifizierung anzufordern. Dies gibt das Schema und einen „Bereich“ an und sieht folgendermaßen aus: Www-authenticate: SCHEME realm="REALM".

Zum Beispiel
Www-authenticate: Basic realm="cPanel Users"

Der Kunde muss eine neue Anfrage verwenden und den richtigen Namen und das richtige Passwort in den Anfrageheadern angeben.

Dies ist „Basisauthentifizierung“. Um diesen Prozess zu vereinfachen, können wir eine Instanz von HTTPBasicAuthHandler erstellen und den Opener diesen Handler verwenden lassen.


HTTPBasicAuthHandler verwendet ein Passwortverwaltungsobjekt, um URLs und Bereiche zu verarbeiten, um Benutzernamen und Passwörter zuzuordnen.

Wenn Sie wissen, welcher Realm (im vom Server gesendeten Header) ist, können Sie HTTPPasswordMgr verwenden.


Normalerweise ist es den Leuten egal, was ein Reich ist. In diesem Fall kann das praktische HTTPPasswordMgrWithDefaultRealm verwendet werden.

Dadurch werden ein Standardbenutzername und ein Standardkennwort für Ihre URL festgelegt.

Dies wird bereitgestellt, wenn Sie eine andere Kombination für einen bestimmten Bereich bereitstellen.

Wir weisen auf diese Situation hin, indem wir None für den Realm-Parameter angeben, der für add_password bereitgestellt wird.


Die URL der höchsten Ebene ist die erste, die eine Verifizierung erfordert. Tiefere URLs, die Sie an .add_password() übergeben, sind gleichermaßen geeignet.

Nachdem wir so viel Unsinn gesagt haben, wollen wir das oben Gesagte anhand eines Beispiels demonstrieren.


Wir erstellen eine urllib2_test12.py, um die Info-Anwendung zu testen:

# -*- coding: utf-8 -*-  
import urllib2  
  
# 创建一个密码管理者  
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()  
  
# 添加用户名和密码  
  
top_level_url = "http://example.com/foo/"  
  
# 如果知道 realm, 我们可以使用他代替 ``None``.  
# password_mgr.add_password(None, top_level_url, username, password)  
password_mgr.add_password(None, top_level_url,'why', '1223')  
  
# 创建了一个新的handler  
handler = urllib2.HTTPBasicAuthHandler(password_mgr)  
  
# 创建 "opener" (OpenerDirector 实例)  
opener = urllib2.build_opener(handler)  
  
a_url = 'http://www.baidu.com/'  
  
# 使用 opener 获取一个URL  
opener.open(a_url)  
  
# 安装 opener.  
# 现在所有调用 urllib2.urlopen 将用我们的 opener.  
urllib2.install_opener(opener)

Hinweis: Im obigen Beispiel stellen wir unseren HHTTPasicAuthHandler nur für build_opener bereit.

Die Standardöffner haben normale Handler: ProxyHandler, UnknownHandler, HTTPHandler, HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler, FileHandler, HTTPErrorProcessor.

Die top_level_url im Code kann tatsächlich eine vollständige URL sein (einschließlich „http:“ sowie dem Hostnamen und optionaler Portnummer).


Zum Beispiel: http://example.com/.

kann auch eine „Autorität“ sein (d. h. Hostname und optional Portnummer).

Zum Beispiel: „example.com“ oder „example.com:8080“.

Letzteres enthält die Portnummer.

Das Obige ist der Inhalt von [Python] Web Crawler (4): Einführung und Beispielanwendungen von Opener und Handler. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn). !


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