Heim > Artikel > Backend-Entwicklung > [Python] Web Crawler (5): Nutzungsdetails von urllib2 und Website-Crawling-Techniken
Ich habe vorhin eine einfache Einführung in urllib2 erwähnt, und hier sind einige Details zur Verwendung von urllib2.
1. Proxy-Einstellungen
urllib2 verwendet standardmäßig die Umgebungsvariable http_proxy, um den HTTP-Proxy festzulegen.
Wenn Sie den Proxy in Ihrem Programm explizit steuern möchten, ohne von Umgebungsvariablen beeinflusst zu werden, können Sie einen Proxy verwenden.
Erstellen Sie einen neuen Test14, um eine einfache Proxy-Demo zu implementieren:
import urllib2 enable_proxy = True proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'}) null_proxy_handler = urllib2.ProxyHandler({}) if enable_proxy: opener = urllib2.build_opener(proxy_handler) else: opener = urllib2.build_opener(null_proxy_handler) urllib2.install_opener(opener)
Ein hier zu beachtendes Detail ist, dass durch die Verwendung von urllib2.install_opener() der globale Öffner von urllib2 festgelegt wird.
Dies ist für die spätere Verwendung sehr praktisch, bietet jedoch keine detailliertere Steuerung, z. B. den Wunsch, zwei verschiedene Proxy-Einstellungen im Programm zu verwenden.
Ein besserer Ansatz besteht darin, nicht install_opener zum Ändern der globalen Einstellungen zu verwenden, sondern direkt die open-Methode des Openers anstelle der globalen urlopen-Methode aufzurufen.
2. Timeout-Einstellung
In alten Versionen von Python (vor Python 2.6) stellt die API von urllib2 die Timeout-Einstellung nicht zur Verfügung. Um den Timeout-Wert festzulegen, können Sie nur den globalen Wert ändern Zeitüberschreitung des Socket-Werts.
import urllib2 import socket socket.setdefaulttimeout(10) # 10 秒钟后超时 urllib2.socket.setdefaulttimeout(10) # 另一种方式
Nach Python 2.6 kann das Timeout direkt über den Timeout-Parameter von urllib2.urlopen() eingestellt werden.
import urllib2 response = urllib2.urlopen('http://www.google.com', timeout=10)
3. Fügen Sie der HTTP-Anfrage einen bestimmten Header hinzu
Um einen Header hinzuzufügen, müssen Sie das Request-Objekt verwenden:
import urllib2 request = urllib2.Request('http://www.baidu.com/') request.add_header('User-Agent', 'fake-client') response = urllib2.urlopen(request) print response.read()
Achten Sie bei einigen Headern besonders darauf, dass der Server diese Header überprüft
User-Agent: Einige Server oder Proxys verwenden diesen Wert, um zu bestimmen, ob die Anfrage vom Browser erfolgt
Content-Type: Bei Verwendung Die REST-Schnittstelle prüft der Server. Dieser Wert wird verwendet, um zu bestimmen, wie der Inhalt im HTTP-Body analysiert werden soll. Allgemeine Werte sind:
application/xml: Verwenden Sie
application/json, wenn Sie XML RPC aufrufen, z. B. RESTful/SOAP: Verwenden Sie
application/x-www-form-urlencoded, wenn Sie JSON RPC aufrufen: Verwenden Sie
Wenn der Browser ein Webformular sendet, wenn der vom Server bereitgestellte RESTful- oder SOAP-Dienst verwendet wird, führt eine falsche Inhaltstypeinstellung dazu, dass der Server den Dienst verweigert
4.Redirect
urllib2 leitet standardmäßig automatisch für HTTP 3XX-Rückgabecodes um, ohne manuelle Konfiguration. Um festzustellen, ob eine Umleitungsaktion stattgefunden hat, prüfen Sie einfach, ob die URL der Antwort und die URL der Anfrage konsistent sind.
import urllib2 my_url = 'http://www.google.cn' response = urllib2.urlopen(my_url) redirected = response.geturl() == my_url print redirected my_url = 'http://rrurl.cn/b1UZuP' response = urllib2.urlopen(my_url) redirected = response.geturl() == my_url print redirected
Wenn Sie nicht automatisch umleiten möchten, können Sie zusätzlich zur Verwendung der untergeordneten httplib-Bibliothek auch die HTTPRedirectHandler-Klasse anpassen.
import urllib2 class RedirectHandler(urllib2.HTTPRedirectHandler): def http_error_301(self, req, fp, code, msg, headers): print "301" pass def http_error_302(self, req, fp, code, msg, headers): print "303" pass opener = urllib2.build_opener(RedirectHandler) opener.open('http://rrurl.cn/b1UZuP')
5. Cookie
urllib2 verarbeitet Cookies auch automatisch. Wenn Sie den Wert eines Cookie-Elements ermitteln müssen, können Sie Folgendes tun:
import urllib2 import cookielib cookie = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) response = opener.open('http://www.baidu.com') for item in cookie: print 'Name = '+item.name print 'Value = '+item.value
Nach dem Ausführen wird der Cookie-Wert für den Besuch von Baidu ausgegeben:
6 .Verwenden Sie HTTP PUT- und DELETE-Methoden
urllib2 unterstützt nur HTTP GET- und POST-Methoden. Wenn Sie HTTP PUT und DELETE verwenden möchten, können Sie nur die untergeordnete httplib-Bibliothek verwenden. Trotzdem können wir urllib2 weiterhin aktivieren, um PUT- oder DELETE-Anfragen auf folgende Weise auszugeben:
import urllib2 request = urllib2.Request(uri, data=data) request.get_method = lambda: 'PUT' # or 'DELETE' response = urllib2.urlopen(request)
7. Holen Sie sich den HTTP-Rückgabecode
Für 200 OK, solange Sie können Rufen Sie den HTTP-Rückgabecode mit der Methode getcode() des von urlopen zurückgegebenen Antwortobjekts ab. Bei anderen Rückkehrcodes löst urlopen jedoch eine Ausnahme aus. Zu diesem Zeitpunkt ist es notwendig, das Codeattribut des Ausnahmeobjekts zu überprüfen:
import urllib2 try: response = urllib2.urlopen('http://bbs.csdn.net/why') except urllib2.HTTPError, e: print e.code
8. Debug-Protokoll
Bei Verwendung von urllib2 können Sie das Debug-Protokoll mit der folgenden Methode öffnen , damit Sie Pakete senden und empfangen können. Der Inhalt wird auf dem Bildschirm gedruckt, was zum Debuggen praktisch ist. Manchmal können Sie die Arbeit der Paketerfassung sparen
import urllib2 httpHandler = urllib2.HTTPHandler(debuglevel=1) httpsHandler = urllib2.HTTPSHandler(debuglevel=1) opener = urllib2.build_opener(httpHandler, httpsHandler) urllib2.install_opener(opener) response = urllib2.urlopen('http://www.google.com')
Auf diese Weise können Sie die sehen Inhalt des übertragenen Datenpakets:
9. Formularverarbeitung
Das Ausfüllen des Formulars ist erforderlich Anmelden. Wie fülle ich das Formular aus?
Erfassen Sie zunächst mit dem Tool den Inhalt des auszufüllenden Formulars.
Zum Beispiel verwende ich normalerweise das Firefox+httpfox-Plugin, um zu sehen, welche Pakete ich gesendet habe.
Nehmen Sie verycd als Beispiel. Suchen Sie zunächst die von Ihnen gesendete POST-Anfrage und die POST-Formularelemente.
Sie können sehen, dass Sie für verycd Benutzername, Passwort, continueURI, fk und login_submit eingeben müssen. Unter anderem wird fk zufällig generiert (eigentlich nicht zu zufällig, es sieht so aus, als würde es einfach durch Codieren der Epochenzeit generiert). ). Es muss von der Webseite abgerufen werden, was bedeutet, dass Sie zuerst die Webseite besuchen und Tools wie reguläre Ausdrücke verwenden müssen, um das fk-Element in den zurückgegebenen Daten abzufangen. Wie der Name schon sagt, kann continueURI beiläufig geschrieben werden, während login_submit fest ist, was aus dem Quellcode ersichtlich ist. Es gibt auch Benutzernamen und Passwörter, die offensichtlich sind:
# -*- coding: utf-8 -*- import urllib import urllib2 postdata=urllib.urlencode({ 'username':'汪小光', 'password':'why888', 'continueURI':'http://www.verycd.com/', 'fk':'', 'login_submit':'登录' }) req = urllib2.Request( url = 'http://secure.verycd.com/signin', data = postdata ) result = urllib2.urlopen(req) print result.read()
10 Als Browser getarnt, um darauf zuzugreifen
Einige Websites sind vom Besuch von Crawlern abgeneigt und lehnen Anfragen von Crawlern ab
Zu diesem Zeitpunkt müssen wir uns als Browser tarnen, was durch Ändern des Headers im http-Paket erreicht werden kann
#… headers = { 'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6' } req = urllib2.Request( url = 'http://secure.verycd.com/signin/*/http://www.verycd.com/', data = postdata, headers = headers ) #...
Umgang mit „Anti-Hotlinking“
Einige Websites haben so- sogenannte Anti-Hotlinking-Einstellungen. Um es ganz klar auszudrücken:
ist es, im Header der Anfrage zu überprüfen, ob es sich um seine eigene handelt Sie haben gesendet.
Wir müssen also nur die Überschriften wie folgt einfügen: Nehmen Sie einfach den Verweis auf die Website:
#... headers = { 'Referer':'http://www.cnbeta.com/articles' } #...
Header ist eine Diktatdatenstruktur. Sie können einen beliebigen Header einfügen.
Einige Websites lesen beispielsweise gerne das X-Forwarde-For im Header, um ihre tatsächliche IP zu sehen. Sie können das X-Forwarde-For direkt ändern.
Das Obige ist [Python] Web Crawler (5): Nutzungsdetails von urllib2 und Website-Crawling-Techniken. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!