Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Web Development

Screen Scraping mit Node.js

by
Difficulty:IntermediateLength:LongLanguages:

German (Deutsch) translation by Alex Grigorovich (you can also view the original English article)

Vielleicht haben Sie NodeJS als Webserver verwendet, aber wussten Sie, dass Sie es auch für das Web Scraping verwenden können?  In diesem Tutorial erfahren Sie, wie Sie mit Hilfe von NodeJS und einigen hilfreichen NPM-Modulen statische Webseiten - und solche nervtötenden - mit dynamischen Inhalten abkratzen können.

Ein bisschen über Web Scraping

Web Scraping hat in der Welt der Webentwicklung schon immer einen negativen Beigeschmack gehabt - und das aus gutem Grund.  In der modernen Entwicklung sind APIs für die meisten populären Dienste vorhanden und sie sollten verwendet werden, um Daten zu erhalten, anstatt sie zu scrappen. Das inhärente Problem mit dem Scraping ist, dass es auf der visuellen Struktur der Seite basiert, die abgekratzt wird. Immer wenn sich der HTML-Code ändert - egal wie klein die Änderung ist - kann er den Code komplett zerstören.

Trotz dieser Mängel ist es wichtig, ein wenig über Web Scraping und einige der Tools zu lernen, die für diese Aufgabe zur Verfügung stehen.  Wenn eine Website keine API oder einen Syndication-Feed (RSS / Atom, usw.) enthüllt, ist die einzige Option, die wir haben, um diesen Inhalt zu bekommen ... Scraping.

Hinweis: Wenn Sie die benötigten Informationen nicht über eine API oder einen Feed abrufen können, ist dies ein gutes Zeichen dafür, dass der Eigentümer nicht auf diese Informationen zugreifen möchte.  Es gibt jedoch Ausnahmen.


Warum benutzt man NodeJS ?

Scraper können wirklich in jeder Sprache geschrieben werden.  Der Grund, warum ich gerne Knoten benutze, ist wegen seiner asynchronen Natur, was bedeutet, dass mein Code zu keinem Zeitpunkt im Prozess blockiert ist. Ich bin ziemlich vertraut mit JavaScript, das ist ein zusätzlicher Bonus. Schließlich gibt es einige neue Module, die für NodeJS geschrieben wurden, die es einfach machen, Webseiten zuverlässig zu scratzen (also so zuverlässig wie Scraping!).  Lass uns anfangen!


Einfaches Scraping mit YQL

Beginnen wir mit dem einfachen Anwendungsfall: statische Webseiten. Dies sind Ihre Standard-Webseiten. Für diese, Yahoo! Query Language (YQL) sollte diese Aufgabe sehr gut erfüllen.  Für diejenigen, die mit YQL nicht vertraut sind, handelt es sich um eine SQL-ähnliche Syntax, die verwendet werden kann, um mit verschiedenen APIs konsistent zu arbeiten.

YQL hat einige großartige Tabellen, die Entwicklern helfen, HTML von einer Seite zu bekommen.  Ich habe alles vorbereitet:

Lassen Sie uns alle durchgehen und sehen Sie sich an, wie Sie sie in NodeJS implementieren.

html table

Die HTML table ist die einfachste Möglichkeit, HTML von einer URL zu scrapen.  Eine reguläre Abfrage, die diese Tabelle verwendet, sieht folgendermaßen aus:

Diese Abfrage besteht aus zwei Parametern: der "URL" und dem "xpath".  Die URL ist selbsterklärend. Der XPath besteht aus einer XPath-Zeichenfolge, die YQL mitteilt, welcher Abschnitt des HTML zurückgegeben werden soll. Versuchen Sie diese Abfrage hier.

Zusätzliche Parameter, die Sie verwenden können, umfassen browser (Boolean), charset (Zeichenfolge) und compat (Zeichenfolge).  Ich musste diese Parameter nicht verwenden, aber beziehen Sie sich auf die Dokumentation, wenn Sie spezielle Anforderungen haben.

Nicht zufrieden mit XPath?

Leider ist XPath keine sehr populäre Art, die HTML-Baumstruktur zu durchlaufen. Es kann für Anfänger schwierig sein, zu lesen und zu schreiben.

Sehen wir uns die nächste Tabelle an, die dasselbe tut, aber stattdessen CSS verwendet

data.html.cssselect table

Die data.html.cssselect-Tabelle ist meine bevorzugte Methode, um HTML von einer Seite zu scrapen. Es funktioniert genauso wie die HTML-Tabelle, erlaubt Ihnen aber CSS anstelle von XPath. In der Praxis konvertiert diese Tabelle das CSS in XPath unter der Haube und ruft dann die HTML-Tabelle auf, so dass es etwas langsamer ist. Der Unterschied sollte vernachlässigbar sein für den Bedarf an Schaben.

Eine reguläre Abfrage mit dieser Tabelle sieht folgend aus:

Wie Sie sehen können, ist es viel sauberer.  Ich empfehle Ihnen, diese Methode zuerst zu versuchen, wenn Sie versuchen HTML mit YQL zu scrappen.  Versuchen Sie diese Abfrage hier.

htmlstring 

Die htmlstring Tabelle ist nützlich, wenn Sie versuchen, einen großen Teil des formatierten Texts von einer Webseite zu scrappen.

Wenn Sie diese Tabelle verwenden, können Sie den gesamten HTML-Inhalt dieser Seite in einer einzigen Zeichenfolge abrufen, und nicht als JSON, der basierend auf der DOM-Struktur aufgeteilt wird.

Zum Beispiel sieht eine reguläre JSON-Antwort, die  <a> so aussieht

Sehen Sie, wie die Attribute als Eigenschaften definiert sind?  Stattdessen würde die Antwort von der htmlstring-Tabelle so aussehen

Also, warum würdest du das benutzen?  Nun, aus meiner Erfahrung kommt das sehr gut, wenn Sie versuchen, eine große Menge an formatiertem Text zu scrappen. Betrachten Sie zum Beispiel das folgende Snippet:

Mithilfe der htmlstring-Tabelle können Sie diesen HTML-Code als Zeichenfolge abrufen und mit regex die HTML-Tags entfernen, sodass nur der Text angezeigt wird. Dies ist eine einfachere Aufgabe als das Iterieren durch JSON, das basierend auf der DOM-Struktur der Seite in Eigenschaften und untergeordnete Objekte aufgeteilt wurde.


Verwending YQL mit NodeJS  

Jetzt, da wir ein wenig über einige Tabellen, die uns in YQL zur Verfügung stehen, wissen, implementieren wir einen Web-Scraper mit YQL und NodeJS.  Glücklicherweise ist dies wirklich einfach, dank des node-yql Moduls von Derek Gathright.

Wir können das Modul mit npm installieren:

Das Modul ist extrem einfach und besteht nur aus einer Methode: der YQL.exec() -Methode.  Es ist wie folgt definiert:

Wir können es verwenden, indem wir es benötigen und YQL.exec() aufrufen.  Nehmen wir zum Beispiel an, wir möchten die Schlagzeilen aller Beiträge auf der Nettuts-Hauptseite abkratzen:

Das Beste an YQL ist die Fähigkeit, Ihre Abfragen zu testen und zu bestimmen, welche JSON Sie in Echtzeit erhalten. Gehen Sie zur Konsole, um diese Abfrage auszuprobieren, oder klicken Sie hier, um den rohen JSON zu sehen.

Die Parameter params und httpOptions sind optional. Parameter können Eigenschaften wie env (ob Sie eine bestimmte Umgebung für die Tabellen verwenden) und format (xml oder json) enthalten. Alle an params übergebenen Eigenschaften werden URI-codiert und an die Abfragezeichenfolge angehängt. Das httpOptions-Objekt wird in den Header der Anforderung übergeben. Hier können Sie angeben, ob Sie beispielsweise SSL aktivieren möchten.

Die JavaScript-Datei mit dem Namen yqlServer.js enthält den minimalen Code, der zum Abkratzen mithilfe von YQL erforderlich ist. Sie können es ausführen, indem Sie den folgenden Befehl in Ihrem Terminal ausgeben:

Ausnahmen und andere bemerkenswerte Werkzeuge

YQL ist meine bevorzugte Wahl für das Scrappen von Inhalten von statischen Webseiten, da es einfach zu lesen und einfach zu verwenden ist. YQL schlägt jedoch fehl, wenn die betreffende Webseite eine robots.txt-Datei enthält, die eine Antwort darauf verweigert. In diesem Fall können Sie sich einige der unten genannten Dienstprogramme ansehen oder PhantomJS verwenden, auf die wir im folgenden Abschnitt eingehen werden.

Node.io ist ein nützliches Dienstprogramm, das speziell für das Scraping von Daten entwickelt wurde. Sie können Jobs erstellen, die Eingaben verarbeiten, verarbeiten und Ausgaben zurückgeben. Node.io wird auf Github gut beobachtet und hat einige nützliche Beispiele für den Einstieg.

JSDOM ist ein sehr beliebtes Projekt, das das W3C-DOM in JavaScript implementiert. Mit bereitgestelltem HTML kann ein DOM erstellt werden, mit dem Sie interagieren können. JSDOM und eine beliebige JS-Bibliothek (z. B. jQuery) zusammen, um Daten von Webseiten zu scrappen.


Scraping von Seiten mit dynamischen Inhalten

Bis jetzt haben wir einige Tools, die uns dabei helfen können, Webseiten mit statischem Inhalt zu bearbeiten. Mit YQL ist es relativ einfach. Leider werden uns oft Seiten präsentiert, deren Inhalt dynamisch mit JavaScript geladen wird. In diesen Fällen ist die Seite anfangs oft leer und der Inhalt wird anschließend angehängt. Wie können wir mit diesem Problem umgehen?

Ein Beispiel

Lassen Sie mich ein Beispiel dafür geben, was ich meine; Ich habe eine einfache HTML-Datei auf Ihre eigene Website hochgeladen, die einige Inhalte über JavaScript zwei Sekunden nach dem document.ready() anfügt. Funktion wird aufgerufen. Sie können die Seite hier anschauen. So sieht das Original aus:

Versuchen wir nun, den Text im <div id="content"> mithilfe von YQL zu scrappen.

Sie werden feststellen, dass YQL undefinied zurückgegeben wird, da <div id="content"> leer ist, wenn die Seite geladen wird. Der Inhalt wurde noch nicht angehängt. Sie können die Abfrage versuchen hier für sich selbst aus.

Schauen wir uns an, wie wir dieses Problem umgehen können!

Geben Sie PhantomJS ein

PhantomJS kann Webseiten laden und einen Webkit-basierten Browser ohne die GUI imitieren.

Meine bevorzugte Methode, Informationen von diesen Sites zu scrappen, ist die Verwendung von PhantomJS. PhantomJS beschreibt sich selbst als "kopfloses Webkit mit einer JavaScript-API. In einfachen Worten bedeutet dies, dass PhantomJS Webseiten laden und einen Webkit-basierten Browser ohne GUI simulieren kann. Als Entwickler können wir bestimmte Methoden aufrufen, mit denen PhantomJS Code auf der Seite ausführen kann. Da es sich wie ein Browser verhält, scriptet es auf der Webseite.

Um Daten von unserer Seite zu erhalten, verwenden wir PhantomJS-Node, ein großartiges kleines Open-Source-Projekt, das PhantomJS mit NodeJS verbindet. Unter der Haube lässt dieses Modul PhantomJS als Kindprozess laufen.

Installieren von PhantomJS

Bevor Sie das PhantomJS-Knoten-NPM-Modul installieren können, müssen Sie PhantomJS installieren. Das Installieren und Erstellen von PhantomJS kann jedoch ein wenig schwierig sein.

Gehen Sie zuerst zu PhantomJS.org und laden Sie die entsprechende Version für Ihr Betriebssystem herunter. In meinem Fall war es Mac OSX.

Entpacken Sie die Datei nach dem Herunterladen in ein Verzeichnis wie /Applications/. Als Nächstes möchten Sie es Ihrem PATH hinzufügen:

Ersetzen Sie 1.5.0 durch Ihre heruntergeladene Version von PhantomJS. Beachten Sie, dass nicht alle Systeme /usr/local/bin/ haben. Einige Systeme haben stattdessen: /usr/bin/, /bin/ oder usr/X11/bin.

Für Windows-Benutzer, überprüfen Sie das kurze Tutorial hier. Du wirst wissen, dass du alles eingerichtet hast, wenn du dein Terminal öffnest und phantomjs schreibst, und du bekommst keine Fehler.

Wenn es dir unangenehm ist, deinen PATH zu bearbeiten, notiere dir, wo du PhantomJS entpackt hast, und ich zeige dir im nächsten Abschnitt eine andere Möglichkeit, es einzurichten, obwohl ich dir rate, deinen PATH zu bearbeiten.

PhantomJS-Knoten installieren

Das Einrichten von PhantomJS-Node ist viel einfacher. Vorausgesetzt, Sie haben NodeJS installiert, können Sie über npm installieren:

PATH im vorherigen Schritt bei der Installation von PhantomJS können Sie in das phantom/ Verzeichnis gehen, das um npm heruntergezogen wurde, und diese Zeile in phantom.js bearbeiten.

Ändern Sie den Pfad zu:

Sobald das erledigt ist, können Sie es testen, indem Sie diesen Code ausführen:

Wenn Sie dies in der Befehlszeile ausführen, sollte Folgendes angezeigt werden:

Wenn du das hast, bist du bereit und bereit zu gehen. Wenn nicht, poste einen Kommentar und ich werde versuchen dir zu helfen!

Verwenden von PhantomJS-Node

Um es Ihnen leichter zu machen, habe ich eine JS-Datei namens phantomServer.js in den Download aufgenommen, der einige der PhantomJS-API verwendet, um eine Webseite zu laden. Es wartet 5 Sekunden, bevor JavaScript ausgeführt wird, das die Seite abkratzt. Sie können es ausführen, indem Sie zu dem Verzeichnis navigieren und den folgenden Befehl in Ihrem Terminal ausgeben:

Ich werde einen Überblick geben, wie es hier funktioniert. Zuerst benötigen wir PhantomJS:

Als nächstes implementieren wir einige Methoden aus der API. Wir erstellen nämlich eine Seiteninstanz und rufen dann die open() -Methode auf:

Sobald die Seite geöffnet ist, können wir JavaScript in die Seite einfügen. Lassen Sie uns jQuery über die page.injectJs() Methode  erzählen

jQuery ist jetzt geladen, aber wir wissen nicht, ob der dynamische Inhalt auf der Seite bereits geladen wurde.  Um dies zu berücksichtigen, setze ich meinen Scrapping-Code normalerweise in eine setTimeout() - Funktion, die nach einem bestimmten Zeitintervall ausgeführt wird.  Wenn Sie eine dynamischere Lösung wünschen, können Sie mit der PhantomJS API bestimmte Ereignisse anhören und emulieren.  Lassen Sie uns mit dem einfachen Fall gehen:

Zusammenfassend sieht unsere phantomServer.jsDatei folgendermaßen aus:

Diese Implementierung ist ein wenig grob und unorganisiert, aber es macht den Punkt.  Mit PhantomJS können wir eine Seite scannen, die dynamischen Inhalt hat!  Ihre Konsole sollte Folgendes ausgeben:


Schlusswort

In diesem Lernprogramm haben wir zwei verschiedene Möglichkeiten zum Ausführen von Web Scraping überprüft. Wenn Sie von einer statischen Webseite scrapen, können Sie die Vorteile von YQL nutzen, das einfach einzurichten und zu verwenden ist. Auf der anderen Seite können wir für dynamische Standorte PhantomJS nutzen.  Es ist ein wenig schwieriger einzurichten, bietet aber mehr Möglichkeiten. Denken Sie daran: Sie können PhantomJS auch für statische Sites verwenden!

Wenn Sie Fragen zu diesem Thema haben, zögern Sie nicht, unten zu fragen und ich werde mein Bestes tun, um Ihnen zu helfen.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.