HTML Scraper


Mit Version 1.0.0.7 wurde im Zusammenhang mit der neu eingeführten Variablenfunktion die Beta-Version eines HTML Scrapers veröffentlicht. Dieser wurde jedoch zum aktuellen Zeitpunkt noch nicht vollständig getestet und muss deshalb durch eine Tastenkombination freigeschaltet werden. Der HTML Scraper ermöglicht das parallele Abrufen von Webseiten und kann mit Hilfe von XPath- oder Regex-Ausdrücken Text von diesen Webseiten extrahieren.

Einführungsvideo

Freischaltung des Scrapers

Um den HTML Scraper freizuschalten, muss zunächst das Variablensetup geöffnen werden. Nun muss die Tastenkombination (STRG + ALT + R) gedrückt werden. Es erscheint ein Hinweis, dass der HTML Scraper nun verfügbar ist, sich aber noch in der Beta-Phase befindet. Außerdem wird in der linken Hälfte des Fensters der Button „Scraper öffnen“ sichtbar, durch den der HTML Scraper geöffnet wird.

HTML Scraper freischalten
HTML Scraper freischalten

Erklärung der Benutzeroberfläche

GUI des HTML Scrapers
GUI des HTML Scrapers

1 – Eingabe der URLs

In dieser Textbox werden die einzelnen URLs, die gescraped werden sollen, eingegeben. Jede URL muss dabei in eine neue Zeile geschrieben werden.

2 – Definition der Scraping Regeln

Die in (1) eingegebenen URLs werden abgerufen, so dass ihr Quelltext durchsucht werden kann. Dazu werden Scraping-Regeln definiert, die jeweils aus vier Bestandeilen bestehen. Der Erste Teil ist ein Bezeichner (Spaltenname „Spaltenname„) des zu scrapenden Elementes. Wenn zum Beispiel Informationen über Städte gescraped werden sollen, dann kann eine Regel darin bestehen, die Einwohnerzahl zu extrahieren. Als Spaltenname würde man dann zum Beispiel „Einwohner“ oder „Einwohnerzahl“ wählen. Ein Spaltenname darf nur aus Zahlen und Buchstaben bestehen.

Das Durchsuchen des Quelltextes muss nach bestimmten Regeln (Spalte „Ausdruck„) geschehen, damit das Programm weiß, welcher Text extrahiert werden soll. Dabei kann festgelegt werden, ob der Ausdruck ein XPath-Ausdruck oder ein Regex-Ausdruck ist (Spalte „Extraktionsmethode„). Wenn der Ausdruck mehr als ein Ergebnis liefert, kann zusätzlich angegeben werden, ob jeder oder nur ein bestimmter Treffer extrahiert werden soll (Spalte „Index des Ergebnisses„). Der Wert „-1“ bedeutet, dass für jedes gefundene Element eine eigene Zeile in der Ergebnistabelle (6) erzeugt wird. Jeder von „-1“ abweichende Wert bezieht sich auf den jeweiligen Index der Ergebnismenge der gefundenen Texte (sprich Index 0 bezieht sich auf das erste Element, Index 1 auf das zweite, etc.).

XPath-Tipp: Zur Ermittlung von XPath Regeln empfehle ich das FireFox Plugin Firebug mit der FirePath-Erweiterung. Mit dessen Hilfe kann man die Position eines Elementes im DOM sowie einen dazu passenden XPath Ausdruck direkt durch Auswahl im Browser anzeigen lassen. Die folgende Abbildung demonstriert das dazu nötige Vorgehen.

Ermittlung des XPath Ausdrucks mit Hilfe von FirePath
Ermittlung des XPath Ausdrucks mit Hilfe von FirePath

Allerdings liefert Firebug eben nur einen möglichen Pfad und der muss nicht immer der günstigste sein (oder kann unter Umständen auch gar nicht vom HTML Scraper des Article Wizards erkannt werden, siehe bekannte Bugs).

Achtung: Seit einem der letzten Firebug-Updates funktioniert das oben dargestellte Vorgehen nicht mehr. Stattdessen ist ein weiterer Schritt notwendig, der im folgenden Screenshot erklärt ist:

XPath anzeigen mit neuer Firebug Version
XPath anzeigen mit neuer Firebug Version (zum Vergrößern anklicken)

Regex-Tipp: Reguläre Ausdrücke sind sozusagen die Holzhammer-Methode bei der Extraktion von Daten, die eigentlich in strukturierter Form vorliegen. Dennoch erfüllen sie meist ihren Zweck, auch wenn die Regeln teilweise nicht einfach zu erstellen sind. Leider ist mir kein Tool á la FirePath bekannt, das reguläre Ausdrücke auf Basis eines HTML Dokumentes erstellen kann. Hier ist also die Kenntnis von Regex zwingend erforderlich.

Die Syntax entspricht der Regex-DotNet-Syntax. Für diejenigen, die die PCRE Syntax gewohnt sind (dürfte bei den PHP Programmierern der Fall sein…), sei an dieser Stelle erwähnt, dass es keine globalen Modifier gibt! Bei Problemen lohnt sich eventuell die Lektüre dieses Regex-Tutorials. Bei jedem Regex wird nur das Singleline-Flag gesetzt, das dazu führt, dass der Punkt „.“ jedes Zeichen (auch Zeilenumbrüche) matcht.

Zur Prüfung empfehle ich diesen Regex-Tester. Dort bitte als Regex-Engine „.NET Engine“ auswählen. Der Tester bietet die Möglichkeit, eine beliebige Seite als Textbasis zu laden. Damit kann man relativ schnell erkennen, ob ein Regex die gewünschten Ergebnisse liefert.

3 – Verbindungseinstellungen

Der HTML Scraper kann mit bis zu 100 Threads parallel arbeiten. Das bietet sich vor allem dann an, wenn eine Seite gescraped werden soll, deren Ladezeiten etwas größer sein können. Es hängt vom System ab, welche Anzahl hier empfehlenswert ist. Eine größere Anzahl bedeutet in der Regel auch ein schnelleres Scraping, aber es gibt einige Webseiten, die bei zu vielen gleichzeitigen Anfragen die Auslieferung der Webseiten verweigern – hier hilft meist nur Try and Error.

Der Timeout-Wert legt die Anzahl der Millisekunden fest, in denen eine Antwort vom Server gesendet werden muss. Wird diese Zeit überschritten, wird die Anfrage verworfen.

Mit dem Start-Button wird das Scraping gestartet. Daraufhin wird der „Abbrechen“-Button aktiviert. Wird er betätigt, werden keine weiteren Threads gestartet mehr gestartet und das Scraping wird beendet, wenn der letzte Thread beendet wurde. Bereits laufende Threads werden jedoch nicht unterbrochen!

4 – Log

In der Log-Anzeige werden Fehler beim Scraping mitgeschnitten. Fehler können zum Beispiel auf Grund der Verbindung zu Stande kommen, oder weil ein XPath- oder Regex-Ausdruck kein Resultat liefern konnte. Achtung, es reicht aus, dass ein einziger Ausdruck kein Resultat liefert, damit das komplette Scraping der Seite fehlschlägt. Damit sollen unvollständige Datensätze unterbunden werden.

5 – GUI Anpassen und Neustarten

Über die Buttons „Log löschen“ und „Tabelle löschen“ können das Log (4) und die Ergebnistabelle (6) gelöscht werden. Der „Fehlerhafte erneut starten“ Button führt den Scrapingvorgang für URLs, deren Scraping fehlschlug, erneut aus.

6 – Ergebnistabelle des Scapens

Die Ergebnisse des Scrapens werden in einer Tabelle erfasst. Die Spalten der Tabelle werden Dabei aus den in den Regeln (2) definierten Spaltennamen gebildet. Wenn bei keiner Regel der Index „-1“ verwendet wurde, entspricht jede Zeile der Ergebnistabelle genau einer URL und zwar in der Reihenfolge, in der die URLs in (1) eingegeben wurden. Fehlgeschlagene URLs werden nicht dargestellt, so dass es keine Leerzeilen gibt.

Dieses Verhalten kann jedoch abweichen, wenn der Index „-1“ bei einer Regel verwendet wurde und mehr als ein Resultat zurückgeliefert wurde. In diesem Fall wurde für jedes Resultat eine neue Zeile erzeugt. Dieses Verhalten wurde speziell für das Scraping von großen tabellarischen Daten eingeführt, da die einzelnen Zeilen der zu scrapenden Tabelle meist auch einzelne Zeilen in der Ergebnistabelle darstellen sollen. Kleiner Tipp am Rande: Damit könnte man zum Beispiel die Google SERPs scrapen.

7 – Exportmöglichkeiten

Der Inhalt der Ergenistabelle (6) kann auf zwei Weisen extrahiert werden. Zum einen können die Daten als CSV Datei exportiert werden. Dabei wird der Delimiter verwendet, der im Variablensetup angegeben wurde. Zum anderen können die gescrapten Daten auch direkt als Variablen gespeichert werden. Dabei werden jedoch alle bisherigen Variablen gelöscht!

8 – Fortschrittsanzeige

In der Fortschrittsanzeige wird neben dem allgemeinen Fortschritt angezeigt, wie viele Scraping-Aufgaben bisher erfolgreich beendet wurden. Dazu gibt es vier Werte:

Threads
Anzahl der gerade aktiven Threads
Erfolg
Anzahl der erfolgreich gescrapten URLs
Fehler
Anzahl der URLs, bei denen es entweder einen Fehler gab oder bei denen mindestens eine Regel zu keinem Ergebnis geführt hat
Ausstehend
Anzahl der URLs, die noch nicht gescraped wurden

Bekannte Bugs

Zur Interpretation der XPath-Ausdrücke wird die Bibliothek HTML Agility Pack verwendet. Diese ist leider nicht in der Lage, den komplette XPath Umfang abzubilden. So ist es zum Beispiel nicht möglich, mit der Funktion „following-sibling“ zu arbeiten, die die benachbarten Knoten auswählt. Außerdem kann es zu Problemen bei komplexeren Ausdrücken kommen. Wenn also FirePath einen Ausdruck anzeigt, der jedoch beim HTML Scraper des Article Wizards kein Ergebnis liefert, dann kann dies daran liegen, dass ein Bug im HTML Agility Pack vorliegt. In diesem Fall sollte entweder ein alternativer XPath Ausdruck gesucht werden oder ein entsprechender Regex (falls möglich) verwendet werden.

Es gibt noch ein weiteres Problem, das vor allem bei Tabellen häufig auftritt. Dieses liegt jedoch an FireFox, denn dieser setzt teils automatisch ein tbody in den Quellcode ein – auch wenn gar keins im ursprünglichen Quelltext steht (siehe auch Stackoverflow: Unable to figure out XPath in HtmlAgilityPack)! Wenn der HTML Scraper des Article Wizards kein Ergebnis liefert und sich ein tbody im XPath Ausdruck von FirePath befindet, dann sollte diese testweise entfernt werden.

«« Zeichensatz

GUI – Die Benutzeroberfläche »»