Ich habe vor kurzem angefangen, Python-Crawler aus diesem Blog zu lernen, während ich Version 3.5 verwende, aber das spielt keine Rolle .
Wir möchten den Inhalt der Website filtern und nur die Teile erhalten, die uns interessieren. Sie möchten beispielsweise pornografische Bilder auf der XX-Website herausfiltern und zum Mitnehmen verpacken. Hier führen wir nur eine einfache Implementierung durch und nehmen als Beispiel den von Schwester Bai Sibu geschriebenen Witz (Klartext). Wir möchten die folgenden Funktionen implementieren:
Batch-Download mehrerer Seiten mit Absätzen in lokale Dateien
Drücken Sie eine beliebige Taste, um das Lesen zu starten Der nächste Absatz
und importieren Sie die zugehörige Bibliothek von urllib
Dies:
import urllib.requestimport urllib.parseimport re
re-Bibliothek ist ein regulärer Ausdruck (Regular Expression), der später für den Abgleich verwendet wird.
Die Scherzseite von Bai Si Bu Si url ='http://www.budejie.com/text/1'
, die Zahl 1 am Ende bedeutet hier, dass es sich um die erste Seite handelt. Der folgende Code kann den Inhalt der Webseite zurückgeben.
req = urllib.request.Request(url)# 添加headers 使之看起来像浏览器在访问req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36') response = urllib.request.urlopen(req)# 得到网页内容,注意必须使用decode()解码html = response.read().decode('utf-8')
print(html)
, der Inhalt ist wie folgt:
Kann ich mir das ansehen? Wo ist der Witz? Was ist mit dem Witz, den wir wollen? !
Ach übrigens, überprüfen Sie die Überschriften so.
Drücken Sie F12 und dann... schauen Sie sich das Bild an
Zu Filtern Sie die Übereinstimmungen heraus. Der Inhalt, den normale Leute lesen (wenn er noch HTML-Tags hat, wie kann er gelesen werden?), Die Witze werden erfolgreich extrahiert. Dazu benötigen wir einige etablierte Muster, um den gesamten Inhalt der Webseite abzugleichen. und geben Sie die Objekte zurück, die erfolgreich mit dem Muster übereinstimmen. Für den Abgleich verwenden wir leistungsstarke reguläre Ausdrücke (Regulärer Ausdruck). Die entsprechende Syntax finden Sie hier.
Nur für den Inhalt der Webseite in diesem Beispiel wollen wir zunächst sehen, welchem Inhalt der Webseite der von uns benötigte Absatz entspricht.
Sie können sehen, dass der Absatz von Tags wie <div class="j-r-list-c-desc">(我们要的内容)</div>
umgeben ist. Sie müssen nur die entsprechenden Regeln angeben, um ihn zu extrahieren! Wie aus dem Bild oben ersichtlich ist, gibt es vor und nach dem Text des -Absatzes viele Leerzeichen, die abgeglichen werden müssen.
pattern = re.compile(r'<div class="j-r-list-c-desc">\s+(.*)\s+</div>') result = re.findall(pattern, html)
Erstellen Sie Regeln über die
re
-Funktion dercompile
-Bibliothek.
s+
kann mit einem oder mehreren Leerzeichen übereinstimmen.
.
entspricht allen Zeichen außer dem Zeilenumbruchzeichenn
.
Da wir nun die passenden Ergebnisse haben, werfen wir einen Blick darauf.
Bingo! Es wurde extrahiert, oder? !
Aber wir haben darin einige eklige Dinge gefunden <br />
. Es spielt keine Rolle, schreiben Sie einfach ein paar Zeilen Code. Ich werde den entfernten Inhalt hier nicht zeigen, bilden Sie sich einfach Ihre eigene Meinung, haha.
for each in content:# 如果某个段子里有<br />if '<br />' in each:# 替换成换行符并输出new_each = re.sub(r'<br />', '\n', each)print(new_each)# 没有就照常输出else:print(each)
Hier
content
ist die Liste, die wir überre.findall()
zurückgeben.
An diesem Punkt haben wir erfolgreich die Witze bekommen, die wir sehen wollen! Was ist, wenn Sie es lokal herunterladen möchten?
Durch die Definition einer save()
-Funktion werden die num
-Parameter vom Benutzer angepasst. Es ist kein Problem, den Inhalt der letzten 100 herunterzuladen Seiten! Einige Variablen werden nicht erwähnt. Der Quellcode wird am Ende angegeben.
# num是指定网页页数def save(num):# 写方式打开一个文本,把获取的段子列表存放进去with open('a.txt', 'w', encoding='utf-8') as f: text = get_content(num)# 和上面去掉<br />类似for each in text:if '<br />' in each: new_each = re.sub(r'<br />', '\n', each) f.write(new_each)else: f.write(str(each) + '\n')
Nach dem Herunterladen in die lokale Datei ist es wie in der Abbildung unten gezeigt
Es gibt zu viele Witze und eine umwerfende Vielfalt davon. Aber wir wollen sie einfach einzeln lesen. Sie können zum nächsten Element wechseln, indem Sie eine beliebige Taste auf der Tastatur drücken, und das Programm wird erst beendet, wenn das letzte Element gelesen wurde. Sie können das Programm auch jederzeit beenden, indem Sie eine Exit-Taste festlegen, z. B. indem Sie q
festlegen Taste zum Verlassen. Der gesamte Code ist hier angegeben.
import urllib.requestimport urllib.parseimport re pattern = re.compile(r'\s+(.*)\s+')# 返回指定网页的内容def open_url(url): req = urllib.request.Request(url) req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36') response = urllib.request.urlopen(req) html = response.read().decode('utf-8')return html# num为用户自定,返回的是所有页的段子列表def get_content(num):# 存放段子的列表text_list = []for page in range(1, int(num)): address = 'http://www.budejie.com/text/' + str(page) html = open_url(address) result = re.findall(pattern, html)# 每一页的result都是一个列表,将里面的内容加入到text_listfor each in result: text_list.append(each)return text_list# num是指定网页页数def save(num):# 写方式打开一个文本,把获取的段子列表存放进去with open('a.txt', 'w', encoding='utf-8') as f: text = get_content(num)# 和上面去掉<br />类似for each in text:if '<br />' in each: new_each = re.sub(r'<br />', '\n', each) f.write(new_each)else: f.write(str(each) + '\n') if __name__ == '__main__':print('阅读过程中按q随时退出') number = int(input('想读几页的内容: ')) content = get_content(number + 1)for each in content:if '<br />' in each: new_each = re.sub(r'<br />', '\n', each)print(new_each)else:print(each)# 用户输入user_input = input()# 不区分大小写的q,输入则退出if user_input == 'q' or user_input == 'Q':break
Demonstrieren Sie es, der Effekt ist so.
Obwohl die Funktion sehr nutzlos ist, bin ich als Anfänger dennoch sehr zufrieden. Wenn Sie interessiert sind, können Sie tiefer gehen! Der Crawler ist nicht nur das, Sie werden in Zukunft noch weitere erweiterte Funktionen kennenlernen.
von @sunhaiyu
2016.8.15
Das obige ist der detaillierte Inhalt vonPython-Crawler für Anfänger: Crawling-Witze. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!