Python-Crawler: Zusammenfassung einiger häufig verwendeter Crawler-Techniken
Crawler haben während des Entwicklungsprozesses auch viele Wiederverwendungsprozesse. Fassen wir sie hier zusammen, um einige Dinge in der Zukunft zu speichern.
1. Grundlegendes Crawlen von Webseiten
get-Methode
import urllib2 url "http://www.baidu.com" respons = urllib2.urlopen(url) print response.read()
Post-Methode
import urllib import urllib2 url = "http://abcde.com" form = {'name':'abc','password':'1234'} form_data = urllib.urlencode(form) request = urllib2.Request(url,form_data) response = urllib2.urlopen(request) print response.read()
2. Proxy-IP verwenden
Im Prozess der Entwicklung von Crawlern werden IPs verwendet Im Falle einer Blockierung müssen Sie die Proxy-IP verwenden.
Im urllib2-Paket gibt es eine ProxyHandler-Klasse, über die Sie einen Proxy für den Zugriff auf die Webseite einrichten können im folgenden Codeausschnitt:
import urllib2 proxy = urllib2.ProxyHandler({'http': '127.0.0.1:8087'}) opener = urllib2.build_opener(proxy) urllib2.install_opener(opener) response = urllib2.urlopen('http://www.baidu.com') print response.read()
3. Cookies-Verarbeitung
Cookies werden lokal beim Benutzer gespeichert Um die Identität des Benutzers zu identifizieren und die Sitzungsverfolgung durchzuführen (normalerweise verschlüsselt), stellt Python das Cookielib-Modul zur Verarbeitung von Cookies bereit. Die Hauptfunktion des Cookielib-Moduls besteht darin, Objekte bereitzustellen, die Cookies speichern können kann mit dem urllib2-Modul verwendet werden, um auf Internetressourcen zuzugreifen
Code-Snippet:
import urllib2, cookielib cookie_support= urllib2.HTTPCookieProcessor(cookielib.CookieJar()) opener = urllib2.build_opener(cookie_support) urllib2.install_opener(opener) content = urllib2.urlopen('http://XXXX').read()
Der Schlüssel ist CookieJar(), das wird verwendet, um HTTP-Cookie-Werte zu verwalten, durch HTTP-Anfragen generierte Cookies zu speichern und das Cookie-Objekt zu ausgehenden HTTP-Anfragen hinzuzufügen. Das gesamte Cookie wird im Speicher gespeichert und geht nach der Speicherbereinigung der CookieJar-Instanz verloren. Alle Prozesse müssen nicht separat ausgeführt werden.
Cookies manuell hinzufügen
Code kopieren Der Code lautet wie folgt:
cookie = "PHPSESSID=91rurfqm2329bopnosfu4fvmu7 ; kmsign= 55d2c12c9b1e3; KMUID=b6Ejc1XSwPq9o756AxnBAg="
request.add_header("Cookie", cookie)
4. Als Browser tarnen
Einige Websites sind Anti-Crawler-Besuch, daher werden alle Anfragen an Crawler abgelehnt. Daher tritt häufig HTTP-Fehler 403: Verboten auf, wenn urllib2 für den direkten Zugriff auf die Website verwendet wird.
Achten Sie besonders auf einige Header.
1).User-Agent Einige Server oder Proxy prüft diesen Wert, um festzustellen, ob es sich um eine vom Browser initiierte Anfrage
handelt. 2).Content-Type Bei Verwendung der REST-Schnittstelle prüft der Server diesen Wert, um zu bestimmen, wie der Inhalt im HTTP-Body analysiert werden soll . .
Dies kann durch Ändern des Headers im http-Paket erreicht werden. Der Codeausschnitt lautet wie folgt:
import urllib2 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' } request = urllib2.Request( url = 'http://my.oschina.net/jhao104/blog?catalog=3463517', headers = headers ) print urllib2.urlopen(request).read()
5 Analyse
Das leistungsstärkste Tool zum Parsen von Seiten sind natürlich reguläre Ausdrücke. Dies ist für verschiedene Benutzer auf verschiedenen Websites unterschiedlich, daher gibt es keinen Grund, zu viel zu erklären:
Online-Test für reguläre Ausdrücke: http://tool.oschina.net/regex/
Die zweite ist die Parsing-Bibliothek. Es gibt zwei häufig verwendete: lxml und BeautifulSoup von diesen beiden. Website:
lxml: http://my.oschina.net/jhao104/blog/639448
BeautifulSoup: http://cuiqingcai.com/1319.html
Bei diesen beiden Bibliotheken handelt es sich meiner Meinung nach um HTML/XML-Verarbeitungsbibliotheken, die zwar ineffizient sind, aber praktische Funktionen haben. Beispielsweise kann sie den Quellcode eines HTML abrufen Knoten durch Ergebnissuche; lxmlC-Sprachkodierung, effizient, unterstützt Xpath
6. Verifizierungscode-Verarbeitung
Für einige einfache Verifizierungscodes kann eine einfache Identifizierung durchgeführt werden. Ich habe nur eine einfache Bestätigungscode-Erkennung durchgeführt. Einige Anti-Menschen-Verifizierungscodes, wie z. B. 12306, können jedoch manuell über die Codierungsplattform codiert werden. Dies ist natürlich kostenpflichtig.
7. Gzip-Komprimierung
Sind Sie jemals auf Webseiten gestoßen, die verstümmelt sind, egal wie sie transkodiert werden? Haha, das heißt, Sie wissen nicht, dass viele Webdienste komprimierte Daten senden können, wodurch die große Datenmenge, die über die Netzwerkleitung übertragen wird, um mehr als 60 % reduziert werden kann. Dies gilt insbesondere für XML-Webdienste, da XML-Daten sehr stark komprimiert werden können.
Im Allgemeinen sendet Ihnen der Server jedoch keine komprimierten Daten, es sei denn, Sie teilen dem Server mit, dass Sie mit komprimierten Daten umgehen können.
Sie müssen den Code also wie folgt ändern:
import urllib2, httplib request = urllib2.Request('http://xxxx.com') request.add_header('Accept-encoding', 'gzip') 1 opener = urllib2.build_opener() f = opener.open(request)
Das ist der Schlüssel: Erstellen Sie ein Request-Objekt und fügen Sie ein Accept hinzu -Encoding-Header, um dem Server mitzuteilen, ob Sie gzip-komprimierte Daten
akzeptieren und die Daten dann dekomprimieren können:
import StringIO import gzip compresseddata = f.read() compressedstream = StringIO.StringIO(compresseddata) gzipper = gzip.GzipFile(fileobj=compressedstream) print gzipper.read()
8 . Multithreaded Concurrent Crawling
Wenn ein einzelner Thread zu langsam ist, ist Multithreading erforderlich. Hier ist eine einfache Thread-Pool-Vorlage, die jedoch sichtbar ist dass es gleichzeitig ist.
Obwohl das Multithreading von Python nutzlos ist, kann es für Crawler, die häufig im Netzwerk arbeiten, dennoch bis zu einem gewissen Grad die Effizienz verbessern.
from threading import Thread from Queue import Queue from time import sleep # q是任务队列 #NUM是并发线程总数 #JOBS是有多少任务 q = Queue() NUM = 2 JOBS = 10 #具体的处理函数,负责处理单个任务 def do_somthing_using(arguments): print arguments #这个是工作进程,负责不断从队列取数据并处理 def working(): while True: arguments = q.get() do_somthing_using(arguments) sleep(1) q.task_done() #fork NUM个线程等待 alert(“Hello CSDN”); for i in range(NUM): t = Thread(target=working) t.setDaemon(True) t.start() #把JOBS排入队列 for i in range(JOBS): q.put(i) #等待所有JOBS完成 q.join()
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er zum Lernen aller beiträgt, und ich hoffe auch, dass jeder ihn unterstützt Chinesische PHP-Website.
Weitere Artikel zu Python-Crawler-Fähigkeiten finden Sie auf der chinesischen PHP-Website!