Heim >Backend-Entwicklung >Python-Tutorial >Python3, um einen lustigen Seitencrawler zu erstellen
Die meisten Python-Tutorials im Internet sind Version 2.X. Viele Bibliotheken werden anders verwendet . Beispiel
0x01
Ich hatte während des Frühlingsfestes nichts zu tun (wie frei ich bin), also habe ich ein einfaches Programm geschrieben, um ein paar Witze zu machen und den Prozess des Programmschreibens aufzuzeichnen. Das erste Mal, dass ich mit Crawlern in Kontakt kam, war, als ich einen Beitrag wie diesen sah. Es war ein lustiger Beitrag über das Crawlen von Fotos von Mädchen auf Omelette. Also habe ich einfach selbst Fotos von Katzen und Tigern gemacht.
Technologie inspiriert die Zukunft. Wie kann man als Programmierer so etwas besser machen?
0x02
Bevor wir die Ärmel hochkrempeln und loslegen, wollen wir etwas theoretisches Wissen bekannt machen.
Um es einfach auszudrücken: Wir müssen den Inhalt an einer bestimmten Stelle auf der Webseite herunterziehen. Wie müssen wir zuerst die Webseite analysieren, um zu sehen, welchen Inhalt wir haben? brauchen. Diesmal haben wir beispielsweise die Witze auf der urkomischen Website gecrawlt. Wenn wir die Witzeseite auf der urkomischen Website öffnen, können wir viele Witze sehen. Kommen Sie zurück und beruhigen Sie sich, nachdem Sie es gelesen haben. Wenn Sie so weiter lachen, können wir keinen Code schreiben. In Chrome öffnen wir Inspect Element und erweitern dann die HTML-Tags Ebene für Ebene oder klicken mit der kleinen Maus, um das benötigte Element zu finden.
Schließlich können wir feststellen, dass der Inhalt in
der Witz ist, den wir brauchen . Wir können also alle
auf dieser Webseite finden und dann den darin enthaltenen Inhalt extrahieren, und schon sind wir fertig.
0x03
Okay, jetzt, da wir unser Ziel kennen, können wir die Ärmel hochkrempeln und loslegen. Ich verwende hier Python3. Über die Wahl von Python2 und Python3 kann jeder selbst entscheiden. Beide Funktionen können implementiert werden, es gibt jedoch einige geringfügige Unterschiede. Es wird jedoch weiterhin empfohlen, Python3 zu verwenden.
Wir möchten zuerst den Inhalt dieser Webseite abrufen gesamte Webseite.
Zuerst importieren wir urllib
Code kopieren Der Code lautet wie folgt:
urllib.request als Anfrage importieren
Dann können wir die Anfrage verwenden, um die Webseite abzurufen,
Kopieren Sie den Code Der Code lautet wie folgt:
def getHTML(url):
return request.urlopen(url).read()
Das Leben ist kurz, ich benutze Python, eine Codezeile, lade Webseiten herunter, hast du gesagt, da Es gibt keinen Grund, Python nicht zu verwenden.
Nach dem Herunterladen der Webseite müssen wir die Webseite analysieren, um die Elemente zu erhalten, die wir benötigen. Um Elemente zu analysieren, müssen wir ein anderes Tool namens Beautiful Soup verwenden. Damit können wir HTML und XML schnell analysieren und die benötigten Elemente abrufen.
Code kopieren Der Code lautet wie folgt:
soup = BeautifulSoup(getHTML("http://www.pengfu. com/xiaohua_1 .html"))
Die Verwendung von BeautifulSoup zum Parsen von Webseiten ist nur ein Satz, aber wenn Sie den Code ausführen, wird eine Warnung angezeigt, die Sie auffordert, einen Parser anzugeben. Andernfalls funktioniert es möglicherweise nicht auf anderen Plattformen oder Es wird ein Fehler im System gemeldet.
Code kopieren Der Code lautet wie folgt:
/Library/Frameworks/Python.framework/Versions/3.5/lib/ python3.5 /site-packages/bs4/__init__.py:181: UserWarning: Es wurde kein Parser explizit angegeben, daher verwende ich den besten verfügbaren HTML-Parser für dieses System („lxml“). Dies ist normalerweise kein Problem , aber wenn Sie diesen Code auf einem anderen System oder in einer anderen virtuellen Umgebung ausführen, verwendet er möglicherweise einen anderen Parser und verhält sich anders.
Der Code, der diese Warnung verursacht hat, befindet sich in Zeile 64 der Datei joke.py . Um diese Warnung zu entfernen, ändern Sie den Code, der so aussieht:
BeautifulSoup([Ihr Markup])
in diesen:
BeautifulSoup([Ihr Markup], "lxml" )
markup_type=markup_type))
Die Arten von Parsern und die Unterschiede zwischen verschiedenen Parsern werden in offiziellen Dokumenten ausführlich erläutert. Derzeit ist die Verwendung von lxml-Parsing zuverlässiger .
Nach der Änderung
Kopieren Sie den Code Der Code lautet wie folgt:
soup = BeautifulSoup(getHTML("http: //www. pengfu.com/xiaohua_1.html", 'lxml'))
Auf diese Weise entfällt die obige Warnung.
Code kopieren Der Code lautet wie folgt:
p_array = supple.find_all('p', {'class': "content- img clearfix pt10 relative"})
Verwenden Sie die Funktion find_all, um alle p-Tags der Klasse = content-img clearfix pt10 relative zu finden und dann dieses Array zu durchlaufen
Code kopieren Der Code lautet wie folgt:
für x in p_array: content = x.string
Auf diese Weise erhalten wir den Inhalt des Ziels P. An diesem Punkt haben wir unser Ziel erreicht und sind zu unserem Witz aufgestiegen.
Aber beim Crawlen auf die gleiche Weise wird ein solcher Fehler gemeldet
Kopieren Sie den Code Der Code lautet wie folgt:
Raise RemoteDisconnected("Remote-Ende geschlossene Verbindung ohne" http.client.RemoteDisconnected: Remote-Ende geschlossene Verbindung ohne Antwort
Es heißt, dass das Remote-Ende nicht antwortet, die Verbindung geschlossen und das Netzwerk überprüft hat und Es gibt kein Problem. Ist meine Haltung falsch? Es gibt keine Reaktion, wenn ich Charles öffne, um das Paket zu erfassen mit UA? Nachdem ich mir Charles angesehen hatte, stellte ich fest, dass der UA-Standard für mit urllib initiierte Anfragen Python-urllib/3.5 ist und beim Zugriff auf UA in Chrome User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3). ) AppleWebKit/537.36 (KHTML, wie Gecko) Chrome/56.0.2924.87 Safari/537.36, könnte es daran liegen, dass der Server den auf UA basierenden Python-Crawler ablehnt? Versuchen wir es unter einem Deckmantel und sehen, ob es funktioniert
Code kopieren Der Code lautet wie folgt:
def getHTML(url): headers = {'User-Agent': 'User-Agent :Mozilla /5.0 (Macintosh; Intel Mac OS .urlopen(req).read()
Auf diese Weise wird Python als Chrome getarnt, um die Webseite von Qibai abzurufen, und die Daten können reibungslos abgerufen werden.
# -*- coding: utf-8 -*- import sys import urllib.request as request from bs4 import BeautifulSoup def getHTML(url): headers = {'User-Agent': 'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'} req = request.Request(url, headers=headers) return request.urlopen(req).read() def get_pengfu_results(url): soup = BeautifulSoup(getHTML(url), 'lxml') return soup.find_all('p', {'class':"content-img clearfix pt10 relative"}) def get_pengfu_joke(): for x in range(1, 2): url = 'http://www.pengfu.com/xiaohua_%d.html' % x for x in get_pengfu_results(url): content = x.string try: string = content.lstrip() print(string + '\n\n') except: continue return def get_qiubai_results(url): soup = BeautifulSoup(getHTML(url), 'lxml') contents = soup.find_all('p', {'class':'content'}) restlus = [] for x in contents: str = x.find('span').getText('\n','<br/>') restlus.append(str) return restlus def get_qiubai_joke(): for x in range(1, 2): url = 'http://www.qiushibaike.com/8hr/page/%d/?s=4952526' % x for x in get_qiubai_results(url): print(x + '\n\n') return if __name__ == '__main__': get_pengfu_joke() get_qiubai_joke()Weitere Python3-Produktionen für lustige Webseiten-Crawler und verwandte Artikel finden Sie auf der chinesischen PHP-Website!