03.01.2014

Screenscraping – vom Bildschirm in die Tabelle

Mit Screenscraping die Daten einer Website einfach als Excel-Tabelle speichern können? Das ist nicht nur für Datenjournalisten interessant, sondern kann auch sonst hilfreich sein, etwa um bei einer systematischen Recherche die Ergebnisse in eine Liste einzutragen oder um alle Namen und Telefonnummern in einem Dokument parat zu haben.

Einfach eine Tabelle auf einer Website zu kopieren und in Excel einzufügen bringt leider nichts. Denn die Formatierungen sind völlig anders und produzieren ein großes Durcheinander im Excel-Dokument. Noch weniger funktioniert es bei Listen und anderen Informationen, die über eine ganze Website verteilt sein können.

Beim Scraping mit einem Browser-Plugin oder auch OpenRefine lässt sich erstaunlich genau festlegen, welche Informationen gespeichert werden sollen. Der Kniff liegt in der Formatierung des Web-Textes – im Quellcode sind die Eigenschaften genau definiert. Das kann man sich zunutze machen, indem man die Textelemente laut ihrer Formatierung oder Position abspeichert. Bei einer Liste von Bundestagesabgeordneten etwa sowohl ihr Name als auch der Hyperlink zu deren Bundestags-Website enthalten.

screenscraping_bundestagsliste

Mit dem Chrome-Plugin “DataMiner” (oder dem nahezu identischen “Scraper”) lässt sich die Auswahl des Elements einfach mit der Maus bewerkstelligen. Das gewünschte Element anklicken und mit der rechten Maustaste “Get similar” wählen. Ein Fenster öffnet sich und zeigt live an, was in der Spalte landet.

data_miner_bundestagsliste

Nun kann man dem Scraper-Plugin sagen: Speichere in Spalte 1 Abgeordnetenname, in Spalte 2 die URL. Dazu brauche ich einen Google-Account, denn das Plugin speichert direkt in eine Google-Tabelle ab (DataMiner speichert alternativ auch im Tabellenformat CSV). Hakelig kann es bei größeren Textblöcken werden, die unsauber formatiert sind. Einfach sind dagegen Überschriften, URLs oder Mail-Adressen.

Eher unproblematisch sind Web-Tabellen, denn dort ist jedes Feld einzeln definiert. Ein Sonderfall sind allerdings Tabellen, bei denen einzelne Spalten etwa am Anfang ein “Sammelfeld” enthalten, dem mehrere Zeilen folgen (Beispiel). Statt das erste Feld zu bündeln, wäre auch einfach ein Feld pro Zeile möglich, in diesem Fall immer der Parteiname.

Wenn der Code stimmt, lässt sich eine weitere Spalte einfach hinzufügen. Die Sprache dafür heißt XPATH, die sich an HTML orientiert und nach kurzer Einarbeitung recht intuitiv funktioniert. Ein Absatz ist einfach “p”, ein zweiter Absatz innerhalb desselben Abschnitts “p[2]”. Durch die rechte Maustaste kann man schnell die grobe Vorlage erstellen und dann feinjustieren. (Wer XPATH-Abfragen genauer verstehen will, kann Websites mit der Chrome-Erweiterung “XPath Helper” untersuchen.)

Wenn die Auswahl nicht genau funktioniert, sollte man sich an den Auswahl-Code in der Erweiterung anpassen. Etwa wenn “Get Similar” nur ein ganz bestimmtes Feld hervorhebt, nicht aber alle Felder einer Spalte. Bei folgender Tabelle ergibt ein Klick in die fünfte Spalte der zweiten Zeile den Code “//tr[2]/td”. Dieser liest alle Einträge der zweiten Zeile aus.

data_miner_auswahl_1

Wer aber alle Einträge der fünften Spalte will, kann den Code ändern in “//tr/td[5] – das bedeutet Spaltenelement Nummer 5, für die ganze Spalte.

data_miner_auswahl_2

Noch weiter geht es, wenn man bestimmte Spalten haben will. Dann muss man den allerersten Code bei “Selector” verkürzen, im Beispiel in “//tr” – dies ist eine Vorauswahl für die Tabelle. Für jede Spalte fügt man im Bereich darunter mit dem Plus-Zeichen ein Feld hinzu und gibt dort “./td[Zahl]” ein. Die erste Spalte ist dann also “./td[1]”, die fünfte “./td[5]”.

data_miner_auswahl_3

Scraping hat aber auch seine Grenzen. Eine höchst miserabel formatierte Seite kann bedeuten, dass man nicht weiterkommt. Bei einer Liste, die mir auf einer Seite untergekommen ist, gab es zum Beispiel mehrere unterschiedliche Fett-Formatierungen für das gleiche Element. Die Folge: Nicht alle Einträge werden in der Tabelle gespeichert. Also mutig bleiben, und unter Umständen auf Feinheiten zu verzichten. Dann wird eben eine Person samt Adresse und Firma in ein Feld gespeichert. In der Regel ist das trotzdem besser als mehrere hundert Einträge von Hand zu kopieren.

Ganze Tabellen lassen sich mit der Chrome-Erweiterung “TableCapture” denkbar einfach in eine Google-Tabelle transferieren. Sobald die Erweiterung installiert ist, erscheint bei allen Websites, die Tabellen enthalten, rechts in der Adresszeile ein rotes Dokumentensymbol. “Table Capture: Found 2 Tables” zeigt es an, wenn man mit der Maus darüber fährt. Beim Daraufklicken zeigt es eine kurze Beschreibung der einzelnen Tabellen in Form von [Zeilenzahl]x[Spaltenzahl] an. Mit “Copy to Clipboard” wird die jeweilige Tabelle in korrekter Form in die Zwischenablage kopiert, mit “To Google Doc” wird eine neue Google-Tabelle geöffnet, in die man die bereits kopierten Daten von Hand einfügt. Hilfreich ist auch die Schaltfläche “Display Inline”, die ebenfalls angezeigt wird, wenn man auf das rote Symbol klickt. Anschließend bekommt nämlich jede Tabelle auf der Seite ein kleines Kopieren-Menü, wenn man mit der Maus über sie fährt. Das ist vor allem hilfreich bei Seiten mit vielen Tabellen.

Die beschriebenen Möglichkeiten helfen in ganz unterschiedlichen Szenarien. Während die Arbeit mit den Scraping-Erweiterungen etwas mehr Vorarbeit erfordert, aber auch speziellere Ergebnisse bringt, ist Table Capture vor allem für Kopien “im Vorbeigehen” geeignet. Beide helfen weiter, wenn Daten nicht in direkt weiterverarbeitbarer Form vorliegen.

Ein rechtlicher Hinweis: Wenn der Inhalt einer Seite urheberrechtlich geschützt ist, kann es Probleme geben. Amtliche Informationen dagegen, etwa Verzeichnisse von Ämtern, Politikern oder Behörden, stellen in der Regel kein Problem dar. In der Praxis bekommt man eher Probleme, wenn man im großen Stil hunderte von Websites abgrast und damit den Server an die Grenzen seiner Leistungsfähigkeit bringt. Denn das fällt unter den Begriff der Computersabotage.

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht.