Heim  >  Artikel  >  Backend-Entwicklung  >  Python-Crawler für Anfänger: Crawling-Witze

Python-Crawler für Anfänger: Crawling-Witze

巴扎黑
巴扎黑Original
2017-06-23 16:28:581360Durchsuche

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

1. Holen Sie sich den Webseitencode

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:

Python-Crawler für Anfänger: Crawling-Witze

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

Python-Crawler für Anfänger: Crawling-Witze

2. Regelmäßiger Abgleich, um Witze zu extrahieren

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.

Python-Crawler für Anfänger: Crawling-Witze

Sie können sehen, dass der Absatz von Tags wie 5b0fad1dab3da7dcd513889256dead2f(我们要的内容)16b28748ea4df4d9c2150843fecfba68 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&#39;<div class="j-r-list-c-desc">\s+(.*)\s+</div>&#39;)
result = re.findall(pattern, html)

Erstellen Sie Regeln über die re-Funktion der compile-Bibliothek.

  • s+ kann mit einem oder mehreren Leerzeichen übereinstimmen.

  • . entspricht allen Zeichen außer dem Zeilenumbruchzeichen n.

Da wir nun die passenden Ergebnisse haben, werfen wir einen Blick darauf.

Python-Crawler für Anfänger: Crawling-Witze

Bingo! Es wurde extrahiert, oder? !

Aber wir haben darin einige eklige Dinge gefunden df250b2156c434f3390392d09b1c9563. 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 &#39;<br />&#39; in each:# 替换成换行符并输出new_each = re.sub(r&#39;<br />&#39;, &#39;\n&#39;, each)print(new_each)# 没有就照常输出else:print(each)

Hier content ist die Liste, die wir über re.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?

3. Laden Sie Witze auf die lokale Seite herunter.

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(&#39;a.txt&#39;, &#39;w&#39;, encoding=&#39;utf-8&#39;) as f:
        text = get_content(num)# 和上面去掉<br />类似for each in text:if &#39;<br />&#39; in each:
                new_each = re.sub(r&#39;<br />&#39;, &#39;\n&#39;, each)
                f.write(new_each)else:
                f.write(str(each) + &#39;\n&#39;)

Nach dem Herunterladen in die lokale Datei ist es wie in der Abbildung unten gezeigt

Python-Crawler für Anfänger: Crawling-Witze

4 einen nach dem anderen

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(&#39;a.txt&#39;, &#39;w&#39;, encoding=&#39;utf-8&#39;) as f: text = get_content(num)# 和上面去掉<br />类似for each in text:if &#39;<br />&#39; in each: new_each = re.sub(r&#39;<br />&#39;, &#39;\n&#39;, each) f.write(new_each)else: f.write(str(each) + &#39;\n&#39;) if __name__ == '__main__':print('阅读过程中按q随时退出') number = int(input('想读几页的内容: ')) content = get_content(number + 1)for each in content:if '
' in each: new_each = re.sub(r'
', '\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.
Python-Crawler für Anfänger: Crawling-Witze

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!

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