Web -Scraping mit Python Scrapy -Modul

Web -Scraping mit Python Scrapy -Modul
Die Fähigkeit des Web -Scabings ist heute golden geworden. Lassen Sie uns also erfahren, wie wir die erforderlichen Daten von Webseiten erhalten können. In diesem Artikel sprechen wir über die Scrapy Python Library, was sie tun kann und wie man sie benutzt. Lass uns anfangen.

Warum Scrapy?

Scrapy ist eine robuste Web -Scraping -Bibliothek, die die Möglichkeit bietet, Webseiten, Bilder und Daten herunterzuladen, an die Sie sich bei Blitzgeschwindigkeit vorstellen können. Die Geschwindigkeit ist bei der Berechnung von großer Bedeutung, und Scrapy funktioniert daran, indem sie asynchron auf Websites besucht und eine Menge Hintergrundarbeit erledigt, was die gesamte Aufgabe einfach aussieht.

Es sollte gesagt werden, dass Python andere Bibliotheken hat, mit denen Daten von Websites abgeschrocknet werden können, aber keiner ist vergleichbar mit Scrapy, wenn es um Effizienz geht.

Installation

Schauen wir uns einen kurzen Blick darauf an, wie diese leistungsstarke Bibliothek auf Ihrem Computer installiert werden kann.

Wie bei den meisten Python -Bibliotheken können Sie Scrapy mit dem PIP -Modul installieren:

PIP Installieren Sie Scrapy

Sie können überprüfen, ob die Installation erfolgreich war, indem Sie Scrapy in Pythons interaktiver Shell importieren.

$ python
Python 3.5.2 (Standard, 14. September 2017, 22:51:06)
[GCC 5.4.0 20160609] unter Linux

Geben Sie "Hilfe", "Copyright", "Credits" oder "Lizenz" für weitere Informationen ein.

>>> Scrapy importieren

Jetzt, da wir mit der Installation fertig sind, lassen Sie uns mitten in die Dinge einsteigen.

Erstellen eines Web -Scraping -Projekts

Während der Installation wurde das Scrapy -Schlüsselwort zu Pfad hinzugefügt, damit wir das Schlüsselwort direkt über die Befehlszeile verwenden können. Wir würden dies während unserer gesamten Nutzung der Bibliothek ausnutzen.

Führen Sie aus dem Verzeichnis Ihrer Wahl den folgenden Befehl aus:

Scrapy StartProject Webcraper

Dies würde ein Verzeichnis namens erstellen Webcraper im aktuellen Verzeichnis und im Scrapy.CFG -Datei. Im Webcraper Verzeichnis hätte __drin__.Py, Gegenstände.Py, Middlewares.PY, Pipelines.PY, Einstellungen.py Dateien und ein Verzeichnis aufgerufen Spinnen.

Unsere Spinnendateien i.e. Das Skript, das für uns das Webcraping macht, wird in der gespeichert Spinnen Verzeichnis.

Schreiben Sie unsere Spinne

Bevor wir unsere Spinne schreiben, wird erwartet, dass wir bereits wissen, welche Website wir kratzen möchten. Für den Zweck dieses Artikels kratzen wir eine Beispiel -Web -Craping -Website: http: // Beispiel.Webcraping.com.

Diese Website hat nur Ländernamen und ihre Flaggen mit verschiedenen Seiten und wir werden drei der Seiten verschrotten. Die drei Seiten, an denen wir arbeiten würden, sind:

http: // Beispiel.Webcraping.com/places/default/index/0
http: // Beispiel.Webcraping.com/places/default/index/1
http: // Beispiel.Webcraping.com/places/default/index/2

Zurück zu unserer Spinne werden wir einen Sample_spider erstellen.PY im Spinnenverzeichnis. Vom Terminal ein einfaches Berühren Sie sample_spider.py Der Befehl würde helfen, eine neue Datei zu erstellen.

Nach dem Erstellen der Datei würden wir sie mit den folgenden Codezeilen bevölkern:

Scrapy importieren
Klassenprobenplespider (Scrapy.Spinne):
name = "sample" "
start_urls = [
"http: // Beispiel.Webcraping.com/places/default/index/0 ",
"http: // Beispiel.Webcraping.com/places/default/index/1 ",
"http: // Beispiel.Webcraping.com/places/default/index/2 "
]
Def Parse (Selbst, Antwort):
Page_Number = Antwort.URL.split ('/') [-1]
Datei_name = "Seite .html ".Format (page_number)
mit öffnen (Datei_Name, 'WB') als Datei:
Datei.Schreiben Sie (Antwort.Körper)

Führen Sie den folgenden Befehl aus der oberen Ebene des Projektverzeichnisses aus:

Scrawy Crawl -Probe

Erinnern Sie sich, dass wir unseren gegeben haben Samplespider Klasse a Name Attribut Probe.

Nachdem Sie diesen Befehl ausgeführt haben, würden Sie feststellen, dass drei Dateien mit dem Namen Page0 mit dem Namen.HTML, Seite1.HTML, Seite 2.HTML werden im Verzeichnis gespeichert.

Schauen wir uns an, was mit dem Code passiert:

Scrapy importieren

Zuerst importieren wir die Bibliothek in unseren Namespace.

Klassenprobenplespider (Scrapy.Spinne):
name = "sample" "

Dann erstellen wir eine Spinnenklasse, die wir nennen Samplespider. Unsere Spinne erbt von Scrapy.Spinne. Alle unsere Spinnen müssen von Scrapy erben.Spinne. Nach dem Erstellen der Klasse geben wir unserer Spinne a Name Attribut, dies Name Das Attribut wird verwendet, um die Spinne aus dem Terminal zu beschwören. Wenn Sie sich erinnern, haben wir das geleitet Scrawy Crawl -Probe Befehl, unseren Code auszuführen.

start_urls = [
"http: // Beispiel.Webcraping.com/places/default/index/0 ",
"http: // Beispiel.Webcraping.com/places/default/index/1 ",
"http: // Beispiel.Webcraping.com/places/default/index/2 "
]

Wir haben auch eine Liste von URLs, die die Spinne besuchen kann. Die Liste muss aufgerufen werden start_urls. Wenn Sie der Liste einen anderen Namen geben möchten, müssten wir a definieren start_requests Funktion, die uns mehr Funktionen gibt. Um mehr zu erfahren, können Sie sich die Scrapy -Dokumentation ansehen.

Vergessen Sie nicht, die http: // oder https: // für Ihre Links einzuschließen.

Def Parse (Selbst, Antwort):

Wir deklarieren dann eine Parse -Funktion und geben ihr einen Antwortparameter. Wenn der Code ausgeführt wird, wird die Parse -Funktion evoziert und das Antwortobjekt wird gesendet, in dem alle Informationen der besuchten Webseite enthält.

Page_Number = Antwort.URL.split ('/') [-1]
Datei_name = "Seite .html ".Format (page_number)

Was wir mit diesem Code gemacht haben, ist, die Zeichenfolge zu teilen, die die Adresse enthält und die Seitennummer allein in a speichert Seitennummer Variable. Dann erstellen wir eine Dateinamen Variable, die das Einfügen des Seitennummer In der Zeichenfolge, die der Dateiname der Dateien wäre, die wir erstellen würden.

mit öffnen (Datei_Name, 'WB') als Datei:
Datei.Schreiben Sie (Antwort.Körper)

Wir haben jetzt die Datei erstellt und schreiben den Inhalt der Webseite mit der Datei in die Datei Körper Attribut der Antwort Objekt.

Wir können mehr tun als nur die Webseite zu speichern. Die schöne Bibliothek kann verwendet werden, um die zu analysieren Körper.Antwort. Sie können sich dieses Beautiulsoup -Tutorial ansehen, wenn Sie mit der Bibliothek nicht vertraut sind.

Von der zu verschrotteten Seite ist hier ein Auszug des HTML, der die benötigten Daten enthält:









Afghanistan

Alandinseln

Sie würden feststellen, dass alle erforderlichen Daten in Div -Tags eingeschlossen sind, sodass wir den Code umschreiben werden, um die HTML zu analysieren.
Hier ist unser neues Skript:

Scrapy importieren
Aus BS4 Import BeautifulSoup
Klassenprobenplespider (Scrapy.Spinne):
name = "sample" "
start_urls = [
"http: // Beispiel.Webcraping.com/places/default/index/0 ",
"http: // Beispiel.Webcraping.com/places/default/index/1 ",
"http: // Beispiel.Webcraping.com/places/default/index/2 "
]
Def Parse (Selbst, Antwort):
Page_Number = Antwort.URL.split ('/') [-1]
Datei_name = "Seite .txt".Format (page_number)
mit öffnen (Datei_Name, 'w') als Datei:
html_content = BeautifulSoup (Antwort.Körper, "lxml")
div_tags = html_content.find ("div", "id": "resultation")
Country_Tags = div_tags.find_all ("div")
Country_Name_Position = ZIP (Bereich (len (Country_Tags)), Country_Tags)
Für die Position Country_Name in Country_Name_Position:
Datei.write ("Landnummer : \ n".Format (Position + 1, Country_Name.Text))

Der Code entspricht so gut wie der anfängliche.

Schauen wir uns die Logik kurz an.

Def Parse (Selbst, Antwort):

Hier haben wir die Parse -Funktion definiert und ihm einen Antwortparameter gegeben.

Page_Number = Antwort.URL.split ('/') [-1]
Datei_name = "Seite .txt".Format (page_number)
mit öffnen (Datei_Name, 'w') als Datei:

Dies tut dasselbe wie im Intial -Code beschrieben. Der einzige Unterschied besteht darin, dass wir mit einer Textdatei anstelle einer HTML -Datei arbeiten. Wir würden die abgekratzten Daten in der Textdatei speichern und nicht den gesamten Webinhalt in HTML wie zuvor.

html_content = BeautifulSoup (Antwort.Körper, "lxml")

Was wir in dieser Codezeile getan haben, ist, die einzusenden Antwort.Körper Als Argument für die BeautifulSoup -Bibliothek und die Ergebnisse der Ergebnisse zugewiesen html_content Variable.

div_tags = html_content.find ("div", "id": "resultation")

Wenn wir den HTML -Inhalt nehmen, analysieren wir sie hier, indem wir nach einem suchen div Tag, das auch hat und Ausweis Attribut mit Ergebnisse Da es Wert ist, können wir es in einem speichern div_tags Variable.

Country_Tags = div_tags.find_all ("div")

Denken Sie daran, dass die Länder in existierten div Tags auch, jetzt bekommen wir einfach alle die div Tags und speichern sie als Liste in der Country_Tags Variable.

Country_Name_Position = ZIP (Bereich (len (Country_Tags)), Country_Tags)
Für die Position Country_Name in Country_Name_Position:
Datei.write ("Landnummer : \ n".Format (Position + 1, Country_Name.Text))

Hier durch die Position der Länder unter allen Länder -Tags iteriert, speichern wir den Inhalt in einer Textdatei.

In Ihrer Textdatei hätten Sie also so etwas wie:

Land Nummer 1: Afghanistan
Land Nummer 2: Aland Islands
Landnummer 3: Albanien

Abschluss

Scrapy ist zweifellos eine der leistungsstärksten Bibliotheken da draußen, es ist sehr schnell und lädt die Webseite im Grunde genommen herunter. Es gibt Ihnen dann die Freiheit für alles, was Sie mit dem Webinhalt wünschen.

Wir sollten beachten, dass Scrapy viel mehr tun kann, als wir hier nachgegeben haben. Sie können Daten mit Scrapy CSS oder XPath -Selektoren analysieren, wenn Sie dies wünschen. Sie können die Dokumentation lesen, wenn Sie etwas Komplexeres tun müssen.