Der Python-Learning-Webcrawler ist hauptsächlich in drei Hauptabschnitte unterteilt: Crawling , Analyse und Speicherung
Darüber hinaus wird hier am Ende das häufiger verwendete Crawler-Framework Scrapy ausführlich vorgestellt.
Lassen Sie uns zunächst die relevanten Artikel auflisten, die ich zusammengefasst habe und die die grundlegenden Konzepte und Fähigkeiten abdecken, die für den Einstieg in Webcrawler erforderlich sind: Ning Ge’s Small Station – Web Crawler
Was passiert im Hintergrund, wenn wir eine URL in den Browser eingeben und die Eingabetaste drücken? Wenn Sie beispielsweise http://www.lining0806.com/ eingeben, wird die Startseite der Website von Bruder Ning angezeigt.
Vereinfacht gesagt läuft dieser Prozess in den folgenden vier Schritten ab:
Vereinfacht gesagt muss ein Webcrawler die Funktionen eines Browsers implementieren. Durch die Angabe der URL werden die vom Benutzer benötigten Daten direkt zurückgegeben, ohne dass der Browser manuell manipuliert werden muss, um sie Schritt für Schritt abzurufen.
In diesem Schritt müssen Sie klären, welche Inhalte Sie erhalten möchten. Handelt es sich um HTML-Quellcode oder einen String im Json-Format usw.
Bei den meisten Crawling-Fällen handelt es sich um Get-Anfragen, bei denen Daten direkt vom Server der anderen Partei abgerufen werden.
Erstens verfügt Python über zwei Module, urllib und urllib2, die grundsätzlich das allgemeine Seiten-Crawling erfüllen können. Darüber hinaus ist Requests auch ein sehr nützliches Paket, ähnlich wie httplib2 und so weiter.
Requests:
import requests
response = requests.get(url)
content = requests.get(url).content
print "response headers:", response.headers
print "content:", content
Urllib2:
import urllib2
response = urllib2.urlopen(url)
content = urllib2.urlopen(url).read()
print "response headers:", response.headers
print "content:", content
Httplib2:
import httplib2
http = httplib2.Http()
response_headers, content = http.request(url, 'GET')
print "response headers:", response_headers
print "content:", content
Darüber hinaus hängen Get-Anfragen bei URLs mit Abfragefeldern im Allgemeinen die angeforderten Daten an die URL an, um die URL aufzuteilen und Daten zu übertragen. Mehrere Parameter sind mit & verbunden.
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.get(url=url, params=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
full_url = url+'?'+data
response = urllib2.urlopen(full_url)
Verwandte Referenz: Überprüfung des NetEase News Ranking Crawl
Referenzprojekt: Der grundlegendste Crawler unter den Webcrawlern: Crawlen von NetEase-Nachrichtenrankings
2.1 Anmeldung per Formular
In dieser Situation handelt es sich um eine Post-Anfrage, das heißt, die Formulardaten werden zuerst an den Server gesendet und der Server speichert dann das zurückgegebene Cookie lokal.
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.post(url=url, data=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
req = urllib2.Request(url=url, data=data)
response = urllib2.urlopen(req)
2.2 Anmeldung mit Cookies
Durch die Verwendung von Cookies für die Anmeldung geht der Server davon aus, dass Sie ein angemeldeter Benutzer sind, und gibt Ihnen daher angemeldete Inhalte zurück. Wenn daher ein Bestätigungscode erforderlich ist, können Sie sich mithilfe eines Cookies mit einem Bestätigungscode anmelden.
import requests
requests_session = requests.session()
response = requests_session.post(url=url_login, data=data)
Wenn ein Bestätigungscode vorhanden ist, ist die Verwendung von „response = request_session.post(url=url_login, data=data)“ derzeit nicht möglich. Die Methode sollte wie folgt lauten:
response_captcha = requests_session.get(url=url_login, cookies=cookies)
response1 = requests.get(url_login) # 未登陆
response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie!
response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie!
Zugehörige Referenz: Anmeldung mit Web-Crawler-Bestätigungscode
Referenzprojekt: Webcrawler-Benutzername, Passwort und Bestätigungscode-Anmeldung: Crawling der Zhihu-Website
3.1 Verwendung eines Proxys
Anwendbare Situation: Durch die Beschränkung von IP-Adressen kann auch das Problem gelöst werden, dass aufgrund „häufiger Klicks“ zum Anmelden ein Bestätigungscode eingegeben werden muss.
In diesem Fall ist es am besten, einen Proxy-IP-Pool zu unterhalten. Es gibt viele kostenlose Proxy-IPs im Internet, und es gibt viele gute und schlechte, die durch Screening verwendet werden können. Bei „häufigen Klicks“ können wir eine Sperrung durch die Website auch vermeiden, indem wir die Häufigkeit der Crawler, die die Website besuchen, begrenzen.
proxies = {'http':'http://XX.XX.XX.XX:XXXX'}
Requests:
import requests
response = requests.get(url=url, proxies=proxies)
Urllib2:
import urllib2
proxy_support = urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener) # 安装opener,此后调用urlopen()时都会使用安装过的opener对象
response = urllib2.urlopen(url)
3.2 Zeiteinstellung
Anwendbare Situation: Situation mit begrenzter Frequenz.
Sowohl Requests als auch Urllib2 können die Funktion „sleep()“ der Zeitbibliothek verwenden:
import time
time.sleep(1)
3.3 Als Browser tarnen oder gegen „Anti-Hotlinking“ vorgehen
Einige Websites prüfen, ob Sie tatsächlich über einen Browser darauf zugreifen oder ob der Zugriff automatisch von einer Maschine erfolgt. In diesem Fall plus User-Agent zeigt es, dass Sie über einen Browser zugreifen. Manchmal wird auch überprüft, ob die Empfehlungsinformationen enthalten sind und ob Ihr Empfehlungsgeber legal ist, in der Regel zusätzlich zum Empfehlungsgeber.
headers = {'User-Agent':'XXXXX'} # 伪装成浏览器访问,适用于拒绝爬虫的网站
headers = {'Referer':'XXXXX'}
headers = {'User-Agent':'XXXXX', 'Referer':'XXXXX'}
Requests:
response = requests.get(url=url, headers=headers)
Urllib2:
import urllib, urllib2
req = urllib2.Request(url=url, headers=headers)
response = urllib2.urlopen(req)
Es gibt nicht viel zu sagen.
def multi_session(session, *arg):
retryTimes = 20
while retryTimes>0:
try:
return session.post(*arg)
except:
print '.',
retryTimes -= 1
oder
def multi_open(opener, *arg):
retryTimes = 20
while retryTimes>0:
try:
return opener.open(*arg)
except:
print '.',
retryTimes -= 1
Auf diese Weise können wir multi_session oder multi_open verwenden, um die vom Crawler erfasste Sitzung oder den Öffner aufrechtzuerhalten.
Hier ist ein experimenteller Vergleich des parallelen Crawlings für Wall Street News: Python-Multiprozess-Crawling und Java-Single-Thread- und Multi-Thread-Crawling
Verwandte Referenz: Vergleich von Multiprozess- und Multithread-Rechenmethoden in Python und Java
Für den Fall „mehr laden“ verwenden Sie Ajax, um viele Daten zu übertragen.
Die Funktionsweise ist: Nach dem Laden des Quellcodes der Webseite von der URL der Webseite wird das JavaScript-Programm im Browser ausgeführt. Diese Programme laden mehr Inhalte und „füllen“ die Webseite. Aus diesem Grund finden Sie den eigentlichen Inhalt der Seite nicht, wenn Sie direkt zum Crawlen der URL der Webseite selbst gehen.
Wenn Sie hier Google Chrome verwenden, um den Link zu analysieren, der „Anfrage“ entspricht (Methode: Rechtsklick → Element prüfen → Netzwerk → Löschen, klicken Sie auf „Mehr laden“, der entsprechende GET-Link wird angezeigt und Sie suchen nach dem Texttyp/ html, klicken Sie, um die Get-Parameter anzuzeigen, oder kopieren Sie die Anforderungs-URL), Schleifenprozess.
Selenium ist ein automatisiertes Testtool. Es kann den Browser steuern, einschließlich Zeichenfüllung, Mausklicks, Elementerfassung, Seitenwechsel und einer Reihe von Vorgängen. Kurz gesagt, Selenium kann alles, was ein Browser kann.
Hier ist der Code aufgeführt, der Selenium verwendet, um nach einer bestimmten Städteliste dynamisch Tarifinformationen von Qunar.com abzurufen.
Referenzprojekt: Webcrawler Selenium verwendet Proxy-Login: Crawlen Sie die Qunar-Website
Für den Fall, dass die Website über einen Bestätigungscode verfügt, haben wir drei Methoden:
Die Verwendung eines Proxys und die Verwendung von Cookies zum Anmelden wurden bereits besprochen. Lassen Sie uns nun über die Identifizierung des Bestätigungscodes sprechen.
Sie können das Open-Source-System Tesseract-OCR verwenden, um Verifizierungscodebilder herunterzuladen und zu erkennen und die erkannten Zeichen zur simulierten Anmeldung an das Crawler-System zu übertragen. Natürlich können Sie das Bild des Verifizierungscodes zur Identifizierung auch auf die Codierungsplattform hochladen. Wenn dies nicht gelingt, können Sie die Bestätigungscode-Identifikation erneut aktualisieren, bis der Vorgang erfolgreich ist.
Referenzprojekt: Verifizierungscode-Identifizierungsprojekt Version 1: Captcha1
Beim Crawlen müssen zwei Punkte beachtet werden:
Nach dem Crawlen wird der gecrawlte Inhalt analysiert. Welchen Inhalt Sie auch immer benötigen, Sie können den relevanten Inhalt daraus extrahieren.
Zu den gängigen Analysetools gehören reguläre Ausdrücke, BeautifulSoup, lxml usw.
Nachdem wir analysiert haben, was wir brauchen, besteht der nächste Schritt darin, es zu speichern.
Wir können wählen, ob wir es in einer Textdatei oder in einer MySQL- oder MongoDB-Datenbank usw. speichern möchten.
Bei der Lagerung müssen zwei Punkte beachtet werden:
Scrapy ist ein Open-Source-Python-Crawler-Framework, das auf Twisted basiert und in der Industrie weit verbreitet ist.
Für verwandte Inhalte können Sie sich auf die Erstellung eines auf Scrapy basierenden Webcrawlers beziehen. Gleichzeitig dient der in diesem Artikel vorgestellte WeChat-Such-Crawling-Projektcode als Lernreferenz.
Referenzprojekt: Verwenden Sie Scrapy oder Requests, um WeChat-Suchergebnisse rekursiv zu crawlen
Ein guter Webcrawler muss zunächst dem Robots-Protokoll entsprechen. Der vollständige Name des Robots-Protokolls (auch bekannt als Crawler-Protokoll, Robot-Protokoll usw.) lautet „Robots-Ausschlussprotokoll“. Websites verwenden das Robots-Protokoll, um Suchmaschinen mitzuteilen, welche Seiten gecrawlt werden können und welche nicht.
Platzieren Sie eine robots.txt-Textdatei (z. B. https://www.taobao.com/robots.txt) im Stammverzeichnis der Website. Darin können Sie die Seiten angeben, auf die verschiedene Webcrawler zugreifen können Der Zugriff auf die angegebenen Seiten wird durch reguläre Ausdrucksdarstellungen bestimmt. Bevor der Webcrawler diese Website erfasst, ruft er zunächst die Textdatei robots.txt ab, analysiert dann die darin enthaltenen Regeln und erfasst dann die Websitedaten gemäß den Regeln.
User-agent: 指定对哪些爬虫生效
Disallow: 指定不允许访问的网址
Allow: 指定允许访问的网址
Hinweis: Ein englisches Wort muss groß geschrieben werden. Nach dem Doppelpunkt steht ein Leerzeichen.
禁止所有机器人访问
User-agent: *
Disallow: /
允许所有机器人访问
User-agent: *
Disallow:
禁止特定机器人访问
User-agent: BadBot
Disallow: /
允许特定机器人访问
User-agent: GoodBot
Disallow:
禁止访问特定目录
User-agent: *
Disallow: /images/
仅允许访问特定目录
User-agent: *
Allow: /images/
Disallow: /
禁止访问特定文件
User-agent: *
Disallow: /*.html$
仅允许访问特定文件
User-agent: *
Allow: /*.html$
Disallow: /