Heim  >  Artikel  >  Backend-Entwicklung  >  [Python] Webcrawler (2): Verwenden Sie urllib2, um Webinhalte über die angegebene URL zu crawlen

[Python] Webcrawler (2): Verwenden Sie urllib2, um Webinhalte über die angegebene URL zu crawlen

黄舟
黄舟Original
2017-01-21 13:47:431629Durchsuche

Versionsnummer: Python2.7.5, Python3 hat große Änderungen, bitte suchen Sie nach einem anderen Tutorial.

Beim sogenannten Webseiten-Crawling werden die in der URL-Adresse angegebenen Netzwerkressourcen aus dem Netzwerk-Stream gelesen und lokal gespeichert.
Ähnlich wie bei der Verwendung eines Programms zur Simulation der Funktion des IE-Browsers wird die URL als Inhalt der HTTP-Anfrage an den Server gesendet und anschließend die Antwortressourcen des Servers gelesen.


In Python verwenden wir die urllib2-Komponente zum Crawlen von Webseiten.
urllib2 ist eine Komponente von Python, die URLs (Uniform Resource Locators) erhält.

Es bietet eine sehr einfache Schnittstelle in Form der Urlopen-Funktion.

Der einfachste urllib2-Anwendungscode erfordert nur vier Zeilen.

Erstellen wir eine neue Datei urllib2_test01.py, um die Rolle von urllib2 kennenzulernen:

import urllib2  
response = urllib2.urlopen('http://www.baidu.com/')  
html = response.read()  
print html

Drücken Sie F5, um die Ergebnisse des Vorgangs anzuzeigen:

[Python] Webcrawler (2): Verwenden Sie urllib2, um Webinhalte über die angegebene URL zu crawlen


Wir können die Baidu-Homepage öffnen, mit der rechten Maustaste klicken und Quellcode anzeigen (entweder Firefox oder Google Chrome) auswählen, und Sie werden feststellen, dass die Der Inhalt ist genau derselbe.

Mit anderen Worten, die obigen vier Codezeilen geben alle Codes aus, die der Browser erhält, wenn wir Baidu besuchen.

Dies ist das einfachste Beispiel von urllib2.


Zusätzlich zu „http:“ kann die URL auch durch „ftp:“, „file:“ usw. ersetzt werden.

HTTP basiert auf dem Anfrage- und Antwortmechanismus:

Der Client stellt eine Anfrage und der Server stellt eine Antwort bereit.


urllib2 verwendet ein Request-Objekt, um die von Ihnen gestellte HTTP-Anfrage abzubilden.

In der einfachsten Form der Verwendung erstellen Sie ein Request-Objekt mit der Adresse, die Sie anfordern möchten.

Durch den Aufruf von urlopen und die Übergabe des Request-Objekts wird ein zugehöriges Request-Response-Objekt zurückgegeben .

Dieses Antwortobjekt ist wie ein Dateiobjekt, daher können Sie .read() in Response aufrufen.

Lassen Sie uns eine neue Datei urllib2_test02.py erstellen, um es zu erleben:

import urllib2    
req = urllib2.Request('http://www.baidu.com')    
response = urllib2.urlopen(req)    
the_page = response.read()    
print the_page

Sie können sehen, dass der Ausgabeinhalt derselbe ist wie test01.

urllib2 verwendet dieselbe Schnittstelle, um alle URL-Header zu verarbeiten. Sie können beispielsweise eine FTP-Anfrage wie unten erstellen.

req = urllib2.Request('ftp://example.com/')

Ermöglicht Ihnen, zwei zusätzliche Dinge zu tun, wenn Sie HTTP-Anfragen stellen.


1. Datenformulardaten senden

Ich glaube, dieser Inhalt wird jedem bekannt sein, der im Internet gearbeitet hat.

Manchmal Sie möchten einige Daten an eine URL senden (normalerweise ist die URL in ein CGI-Skript [Common Gateway Interface] oder eine andere WEB-Anwendung eingebunden).

In HTTP wird dies häufig über die bekannte POST-Anfrage gesendet.

Dies wird normalerweise von Ihrem Browser durchgeführt, wenn Sie ein HTML-Formular absenden.

Nicht alle POSTs stammen aus Formularen. Sie können POST verwenden, um beliebige Daten an Ihr eigenes Programm zu übermitteln.

Für allgemeine HTML-Formulare müssen Daten in ein Standardformular kodiert werden. Übergeben Sie es dann als Datenparameter an das Request-Objekt.

Die Kodierung funktioniert mit urllib-Funktionen anstelle von urllib2.

Erstellen wir eine neue Datei urllib2_test03.py, um ein Gefühl dafür zu bekommen:

import urllib    
import urllib2    
  
url = 'http://www.someserver.com/register.cgi'    
    
values = {'name' : 'WHY',    
          'location' : 'SDU',    
          'language' : 'Python' }    
  
data = urllib.urlencode(values) # 编码工作  
req = urllib2.Request(url, data)  # 发送请求同时传data表单  
response = urllib2.urlopen(req)  #接受反馈的信息  
the_page = response.read()  #读取反馈的内容


Wenn der Datenparameter nicht gesendet wird, urllib2 verwendet die GET-Anforderungsmethode.

Der Unterschied zwischen GET- und POST-Anfragen besteht darin, dass POST-Anfragen normalerweise „Nebenwirkungen“ haben.

Sie ändern den Zustand des Systems auf irgendeine Weise (z. B. indem sie haufenweise Müll an Sie senden). Tür).

Daten können auch durch Codierung in der Get-Request-URL selbst gesendet werden.

import urllib2    
import urllib  
  
data = {}  
  
data['name'] = 'WHY'    
data['location'] = 'SDU'    
data['language'] = 'Python'  
  
url_values = urllib.urlencode(data)    
print url_values  
  
name=Somebody+Here&language=Python&location=Northampton    
url = 'http://www.example.com/example.cgi'    
full_url = url + '?' + url_values  
  
data = urllib2.open(full_url)

Auf diese Weise wird die Get-Übertragung von Datendaten realisiert.



2. Header auf HTTP-Anfrage setzen

Einige Websites möchten nicht von Programmen aufgerufen werden (nicht- menschlicher Zugriff) oder senden Sie unterschiedliche Versionen von Inhalten an verschiedene Browser.

Die Standard-urllib2 identifiziert sich selbst als „Python-urllib/x.y“ (x und y sind die Haupt- und Nebenversionsnummern von Python, z. B. Python-urllib/2.7),

Diese Identität kann sein Machen Sie die Website verwirrend oder funktionieren Sie einfach nicht.

Der Browser bestätigt seine Identität durch den User-Agent-Header. Wenn Sie ein Anforderungsobjekt erstellen, können Sie ihm ein Wörterbuch mit Header-Daten geben.

Das folgende Beispiel sendet den gleichen Inhalt wie oben, simuliert sich jedoch als Internet Explorer.

(Vielen Dank für die Erinnerung, diese Demo ist nicht mehr verfügbar, aber das Prinzip ist immer noch dasselbe.)

import urllib    
import urllib2    
  
url = 'http://www.someserver.com/cgi-bin/register.cgi'  
  
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'    
values = {'name' : 'WHY',    
          'location' : 'SDU',    
          'language' : 'Python' }    
  
headers = { 'User-Agent' : user_agent }    
data = urllib.urlencode(values)    
req = urllib2.Request(url, data, headers)    
response = urllib2.urlopen(req)    
the_page = response.read()

Das Obige ist der [Python]-Webcrawler (2): Verwenden Sie urllib2, um Webinhalte über die angegebene URL zu crawlen. 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