Heim  >  Artikel  >  Backend-Entwicklung  >  Zusammenfassung der Python-Crawler-Fähigkeiten

Zusammenfassung der Python-Crawler-Fähigkeiten

高洛峰
高洛峰Original
2017-02-24 15:22:331245Durchsuche

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!

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