Erstellen eines grundlegenden Web-Crawlers zum Abrufen von Informationen von einer Website

Erstellen eines grundlegenden Web-Crawlers zum Abrufen von Informationen von einer Website / Programmierung

Wollten Sie schon immer bestimmte Informationen zur Weiterverarbeitung auf einer Website programmatisch erfassen? Sagen Sie etwas wie Sportergebnisse, Börsentrends oder die neueste Modeerscheinung, Bitcoin und andere Krypto-Währungskurse? Wenn die von Ihnen benötigten Informationen auf einer Website verfügbar sind, können Sie einen Crawler (auch als Scraper oder Spider bezeichnet) schreiben, um die Website zu durchsuchen und genau das zu extrahieren, was Sie benötigen. Lass uns herausfinden, wie man das in Python macht.

Bitte beachten Sie, dass mehrere Websites davon abraten, von einem Crawler auf Informationen zuzugreifen, die von der Website bereitgestellt werden. Überprüfen Sie daher die Nutzungsbedingungen der Website, bevor Sie einen Crawler auf einer Website bereitstellen.

Scrapy installieren

Wir verwenden ein Python-Modul namens Scrapy, um das eigentliche Crawlen zu handhaben. Es ist schnell, einfach und kann, wie mit einem Browser, auf mehreren Webseiten navigiert werden.

Beachten Sie jedoch, dass Scrapy nicht über die Möglichkeit verfügt, Javascript beim Navigieren auf der Website zu verarbeiten. Daher können Websites und Apps, die Javascript verwenden, um die Benutzeroberfläche zu ändern, mit diesem Ansatz nicht ordnungsgemäß gecrawlt werden.

Lassen Sie uns jetzt Scrapy installieren. Wir verwenden virtualenv Lernen Sie, wie Sie die virtuelle Python-Umgebung verwenden. Lernen Sie, wie Sie die virtuelle Python-Umgebung verwenden. Unabhängig davon, ob Sie ein erfahrener Python-Entwickler sind oder gerade erst anfangen, das Einrichten einer virtuellen Umgebung ist für jedes Python-Projekt unerlässlich. Lesen Sie weiter, um Scrapy zu installieren. Dies ermöglicht uns, Scrapy in einem Verzeichnis zu installieren, ohne die anderen installierten Systemmodule zu beeinflussen.

Erstellen Sie ein Verzeichnis und initialisieren Sie eine virtuelle Umgebung in diesem Verzeichnis.

mkdir crawler cd crawler virtualenv venv. venv / bin / aktivieren 

Sie können nun Scrapy in dieses Verzeichnis installieren.

Pip installieren Scrapy 

Überprüfen Sie, ob die Scrapie ordnungsgemäß installiert ist.

scrapy # druckt Scrapy 1.4.0 - kein aktives Projekt Verwendung: Scrapy  [options] [args] Verfügbare Befehle: bench Schneller Benchmark-Testabruf ausführen URL mit dem Scrapy-Downloader abrufen genspider Neue Spinne mit vordefinierten Vorlagen erstellen runspider Eine in sich geschlossene Spinne ausführen (ohne ein Projekt zu erstellen)… 

Erstellen eines Website-Crawlers (auch als Spider bezeichnet)

Lassen Sie uns jetzt einen Crawler zum Laden von Informationen schreiben. Wir fangen damit an, einige Informationen von einer Wikipedia-Seite zu einer Batterie von https://en.wikipedia.org/wiki/Battery_(electricity) zu entfernen..

Der erste Schritt beim Schreiben eines Crawlers ist das Definieren einer Python-Klasse, die sich von erstreckt scrapy.Spider. Nennen wir diese Klasse spider1.

Eine Spinnenklasse erfordert mindestens Folgendes:

  • ein Name zur Identifizierung der Spinne, “Wikipedia” in diesem Fall.
  • ein start_urls Variable, die eine Liste von URLs enthält, von denen aus das Crawlen beginnen soll. Wir verwenden die oben gezeigte Wikipedia-URL für unsere erste Durchforstung.
  • ein parse () Eine Methode, die - auch wenn dies vorläufig ein No-Op ist - zur Verarbeitung der Webseite verwendet wird, um das zu extrahieren, was wir wollen.
Importieren der Scrapy-Klasse spider1 (scrapy.Spider): name = 'Wikipedia' start_urls = ['https://en.wikipedia.org/wiki/Battery_(electricity)'] def parse (selbst, antwort): pass 

Wir können diese Spinne jetzt ausführen, um sicherzustellen, dass alles korrekt funktioniert. Es wird wie folgt ausgeführt.

scrapy runspider spider1.py # druckt 2017-11-23 09:09:21 [scrapy.utils.log] INFO: Scrapy 1.4.0 gestartet (Bot: scrapybot) 2017-11-23 09:09:21 [scrapy.utils .log] INFO: Überschriebene Einstellungen: 'SPIDER_LOADER_WARN_ONLY': True 2017-11-23 09:09:21 [scrapy.middleware] INFO: Aktivierte Erweiterungen: ['scrapy.extensions.memusage.MemoryUsage', 'scrapy.extensions .logstats.LogStats ',… 

Protokollierung ausschalten

Wenn Sie Scrapy mit unserer Minimalklasse ausführen, erzeugen Sie einen Haufen Output, der für uns nicht sehr sinnvoll ist. Setzen wir die Protokollierungsstufe auf Warnung und versuchen Sie es erneut. Fügen Sie am Anfang der Datei die folgenden Zeilen hinzu.

import logging logging.getLogger ('scrapy'). setLevel (logging.WARNING) 

Beim erneuten Ausführen der Spinne sollten wir ein Minimum an Protokollnachrichten sehen.

Chrome Inspector verwenden

Das Extrahieren von Informationen aus einer Webseite besteht darin, die Position des HTML-Elements zu bestimmen, von dem Informationen abgerufen werden sollen. Eine nette und einfache Möglichkeit, die Position eines Elements zu finden. Probleme mit Chrome Developer Tools oder Firebug herausfinden Probleme mit Chrome Developer Tools oder Firebug herausfinden Wenn Sie meine jQuery-Tutorials bisher befolgt haben, sind Sie möglicherweise bereits angelaufen einige Code-Probleme und nicht bekannt, wie sie behoben werden können. Bei einem nicht funktionalen Code ist es sehr hilfreich, den Inspector zu verwenden.

  • Navigieren Sie zur richtigen Seite in Chrome.
  • Platzieren Sie die Maus auf dem Element, für das Sie die Informationen wünschen.
  • Klicken Sie mit der rechten Maustaste, um das Kontextmenü aufzurufen.
  • Wählen Prüfen aus dem menü.

Das sollte die Entwicklerkonsole mit der Elemente Registerkarte ausgewählt. Unterhalb der Registerkarte sollte die Statusleiste mit der Position des Elements wie folgt angezeigt werden:

html body div # content.mw-body h1 # firstHeading.firstHeading.

Wie wir weiter unten erklären, benötigen Sie einige oder alle Teile dieser Position.

Titel extrahieren

Lassen Sie uns jetzt den Code hinzufügen parse () Methode, um den Titel der Seite zu extrahieren.

… Def parse (selbst, Antwort): print response.css ('h1 # firstHeading :: text'). Extract ()… 

Das Antwort Das Argument für die Methode unterstützt eine aufgerufene Methode css () Dadurch werden Elemente von der Seite anhand des angegebenen Ortes ausgewählt. Für unseren Fall ist das Element h1.ErsteHeading. Wir brauchen den Textinhalt des Elements, damit wir hinzufügen ::Text zur Auswahl. Endlich, das Extrakt() Methode gibt das ausgewählte Element zurück.

Beim erneuten Ausführen von Scrapy in dieser Klasse erhalten wir die folgende Ausgabe:

[u'Batterie (Strom) '] 

Dies zeigt an, dass der Titel in eine Liste von Unicode-Zeichenfolgen extrahiert wurde.

Wie wäre es mit der Beschreibung??

Um einige weitere Aspekte des Extrahierens von Daten von Webseiten zu demonstrieren, lassen Sie uns den ersten Absatz der Beschreibung von der obigen Wikipedia-Seite erhalten.

Bei der Überprüfung mit der Chrome Developer Console finden wir, dass die Position des Elements die folgende ist (Die spitze Klammer (>) zeigt eine Eltern-Kind-Beziehung zwischen den Elementen an):

div # mw-content-text> div> p

Dieser Ort kehrt zurück alles das p Elemente, die die gesamte Beschreibung enthalten. Da wollen wir nur den ersten p Element verwenden wir den folgenden Extraktor:

response.css ('div # mw-content-text> div> p') [0] 

Um nur den Textinhalt zu extrahieren, fügen wir den CSS-Extraktor hinzu ::Text:

response.css ('div # mw-content-text> div> p') [0] .css (':: text') 

Der abschließende Ausdruck verwendet Extrakt() welches eine Liste von Unicode-Strings zurückgibt. Wir benutzen den Python Beitreten() Funktion, um der Liste beizutreten.

 def parse (selbst, antwort): print ".join (response.css ('div # mw-content-text> div> p') [0] .css (':: text'). extract ()) 

Die Ausgabe von Scrapy mit dieser Klasse ist das, wonach wir suchen:

Eine elektrische Batterie ist ein Gerät, das aus einer oder mehreren elektrochemischen Zellen mit externen Anschlüssen für elektrische Geräte wie Taschenlampen, Smartphones und Elektroautos besteht. [1] Wenn eine Batterie Strom liefert, ist ihr Pluspol… 

Daten sammeln mit Ausbeute

Der obige Code druckt die extrahierten Daten an die Konsole. Wenn Sie Daten als JSON sammeln müssen, können Sie das verwenden Ausbeute Aussage. Der Weg Ausbeute funktioniert wie folgt - Ausführen einer Funktion, die a enthält Ausbeute Die Anweisung gibt dem Aufrufer einen sogenannten Generator zurück. Der Generator ist eine Funktion, die der Anrufer wiederholt ausführen kann, bis er beendet wird.

Hier ist Code, der dem obigen ähnlich ist, der aber den Ausbeute Anweisung, um die Liste von zurückzugeben p Elemente innerhalb des HTML.

… Def parse (self, response): für e in response.css ('div # mw-content-text> div> p'): Ausbeute 'para': ". Join (e.css (':: text') ) .extract ()). strip ()… 

Sie können den Spider jetzt ausführen, indem Sie wie folgt eine JSON-Ausgabedatei angeben:

scrapy runspider spider3.py -o joe.json 

Die erzeugte Ausgabe lautet wie folgt:

["para": "Eine elektrische Batterie ist ein Gerät, das aus einer oder mehreren elektrochemischen Zellen mit externen Anschlüssen besteht, die elektrische Geräte wie Taschenlampen, Smartphones und Elektroautos mit Strom versorgen. [1] Wenn eine Batterie elektrischen Strom liefert, ist es eine Batterie Der positive Anschluss ist die Kathode und der negative Anschluss ist die Anode. [2] Der als negativ gekennzeichnete Anschluss ist die Elektronenquelle, die bei Anschluss an einen externen Stromkreis fließt und Energie an ein externes Gerät liefert. Wenn eine Batterie an ein externes Gerät angeschlossen ist Elektrolyte können sich innerhalb des Stromkreises als Ionen bewegen, so dass die chemischen Reaktionen an den separaten Anschlüssen abgeschlossen werden können und somit Energie an den externen Stromkreis abgegeben wird. Die Bewegung dieser Ionen innerhalb der Batterie ermöglicht den Stromfluss aus der Batterie [3] Historisch bezieht sich der Begriff "Batterie" insbesondere auf eine Vorrichtung, die aus mehreren Zellen besteht, jedoch hat sich die Verwendung zusätzlich dahingehend weiterentwickelt, dass sie Vorrichtungen umfasst, die aus einer Sünde bestehen gle cell. [4] ", " para ":" Primärbatterien (Einwegbatterien oder "Einwegbatterien") werden einmalig verwendet und entsorgt. Die Elektrodenmaterialien werden während der Entladung irreversibel gewechselt. Übliche Beispiele sind die Alkalibatterie für Taschenlampen und eine Vielzahl tragbarer elektronischer Geräte. Sekundäre (wiederaufladbare) Batterien können mehrfach entladen und aufgeladen werden… 

Verarbeitung mehrerer Informationen

Lassen Sie uns nun einen Blick auf das Extrahieren mehrerer Bits in Bezug auf Informationen werfen. In diesem Beispiel werden die besten IMDb Box Office-Hits für das laufende Wochenende ermittelt. Diese Informationen sind unter http://www.imdb.com/chart/boxoffice in einer Tabelle mit einer Informationszeile für jeden Treffer verfügbar.

Wir extrahieren verschiedene Felder in jeder Zeile anhand der folgenden parse () Methode. Wieder wurden die CSS-Positionen für Elemente mithilfe der oben beschriebenen Chrome Developer Console bestimmt:

… Def parse (self, response): für e in response.css ('div # boxoffice> table> tbody> tr'): ertrag 'title': ". Join (e.css ('td.titleColumn> a: : text '). extract ()). strip (),' weekend ': ". join (e.css (' td.ratingColumn ') [0] .css (' :: text '). extract ()). strip (), 'gross': ". join (e.css ('td.ratingColumn') [1] .css ('span.secondaryInfo :: text'). extract ()). strip (), 'weeks' : ". join (e.css ('td.weeksColumn :: text'). extract ()). strip (), 'image': e.css ('td.posterColumn img :: attr (src)'). extract_first (),… 

Notiere dass der Bild Selektor oben gibt an, dass img ist ein Nachkomme von td.posterColumn, und wir extrahieren das aufgerufene Attribut src mit dem Ausdruck :: attr (src).

Beim Ausführen des Spiders wird jetzt der folgende JSON-Code zurückgegeben:

["brutto": "93,8 Mio. $", "Wochen": "1", "Wochenende": "93,8 Mio. $", "image": "https://images-na.ssl-images-amazon.com/images /M/MV5BYWVhZjZkYTItOGIwYS00NmRkLWJlYjctMWM0ZjFmMDU4ZjEzXkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_UY67_CR0,0,45,67_AL_.jpg " "title": "Justice League",  "brutto": "$ 27,5 Mio.", "Woche": "1", "Wochenende":" $ 27,5 Mio.“, "Bild": "https://images-na.ssl-images-amazon.com/images/M/MV5BYjFhOWY0OTgtNDkzMC00YWJkLTk1NGEtYWUxNjhmMmQ5ZjYyXkEyXkFqcGdeQXVyMjMxOTE0ODA@._V1_UX45_CR0,0,45,67_AL_.jpg", "title": "Wonder" , "brutto": "$ 247.3M", "Wochen": "3", "Wochenende": "$ 21.7M", "Bild": "https://images-na.ssl-images-amazon.com/ images / M / MV5BMjMyNDkzMzI1OF5BMl5BanBnXkFtZTgwODcxODg5MjI @ ._ V1_UY67_CR0,0,45,67_AL_.jpg "," title ":" Thor: Ragnarok ",…] 

Verwenden Sie Ihren Crawler

Lassen Sie uns diesen Artikel mit einigen hervorstechenden Punkten abschließen:

  • Durch die Verwendung von Python mit Scrapy ist es einfach, Website-Crawler zu schreiben, um alle benötigten Informationen zu extrahieren.
  • Die Chrome Developer Console (oder das Firebug-Tool von Firefox) hilft bei der Suche nach zu extrahierenden Elementpositionen.
  • Python Ausbeute Anweisung hilft beim Extrahieren wiederholter Datenelemente.

Haben Sie spezielle Projekte für das Scraping von Websites? Und mit welchen Problemen haben Sie zu kämpfen versucht? Bitte teilen Sie uns in den Kommentaren unten mit.

Bild-Gutschrift: dxinerz / Depositphotos | Lulzmango / Wikimedia Commons

Erfahren Sie mehr über: Programmierung, Python, Webmaster-Tools.