Wie man Landtage scrapet

Jeder vierte Landtagsabgeordnete übt bezahlte Tätigkeiten oder Funktionen neben seinem Mandat aus. Das ist eines der Ergebnisse meiner Datenrecherche für Spiegel Online: In drei Artikeln widme ich mich den Top-Verdienern, unvollständigen Selbstauskünften und Lücken in den Transparenzregeln.

Alle ausgewerteten Angaben stammen von den Webseiten der Landtage. Auf ihrem jeweiligen Abgeordnetenprofil müssen die Parlamentarier ihre Nebeneinkünfte auflisten. Die insgesamt rund 1200 Abgeordneten machen mehr als 6000 Angaben.

An dieser Stelle möchte ich beschreiben, wie man solche Informationen von Webseiten auslesen und in eine Struktur überführen kann, in der dann die weitere Auswertung möglich ist. Wer, wie ich, kein Python-Profi ist, kann sich hierfür mit einer überschaubaren Auswahl an Werkzeugen behelfen.

Das Scraping-Tool

Um Angaben von Dutzenden und Hunderten Seiten zu „kratzen“ reichen häufig Freemium-Tools wie import.io. In einem Seminar habe ich kürzlich mit Volontären schon mal probiert, damit verschiedene Landtagswebseiten auszulesen – mit wechselndem Erfolg: Die Quellcode-Qualität der Seiten ist sehr unterschiedlich, sodass es bei manchen Landtagen hervorragend funktionierte, bei anderen überhaupt nicht.

Ein mächtigeres Tool musste her. Gute Erfahrungen habe ich mit dem kostenpflichtigen OutWit Hub gemacht. (Das aber auch kostenlos getestet werden kann. Außerdem gibt es eine kostenlose Browser-Addon-Variante, zu der ich aber nicht viel sagen kann.)

Muster finden mit RegEx

Beim Bau des Scrapers geht es darum, die Angaben, für die ich mich interessiere, im HTML-Code der Seite eindeutig identifizierbar zu machen. Wenn also die Auflistung der Nebentätigkeiten eingeleitet wird mit „Entgeltliche Tätigkeiten neben dem Mandat“ und dann eine Aufzählungsliste mit <ul>- und <li>-Tags folgt, ist diese Identifizierung sehr leicht.

In mehreren Landtagen werden die Angaben aber offenbar händisch in das Abgeordnetenprofil geschrieben, ohne dabei einer einheitlichen Struktur zu folgen. Zum Teil finden sich sogar Tippfehler in den Überschriften von Tätigkeitskategorien. Dann wird es Zeit für Reguläre Ausdrücke (RegEx). Damit ist es möglich, nach Mustern im Quellcode zu suchen, statt nach exakten HTML-Schnipseln.

Zwischen den Slashes /…/ gebe ich an, wie die Marker vor und hinter den Angaben aufgebaut sind, die ich auslesen möchte. Wer RegEx noch nicht kennt, für den mag es anfangs etwas kniffelig sein, ein Grundverständnis dafür zu entwickeln. Einmal verstanden kann man sich aber vieles Weitere selbst erschließen und Ausdrücke mit Tools wie RegExr bauen und testen, bis sie die gewünschten Ergebnisse liefern.

Im obigen Beispiel handelt es sich um einen Scraper für den Thüringer Landtag. In den Abgeordnetenprofilen tauchen an wechselnden Stellen Zeilenumbrüche auf, Zwischenüberschriften sind mal gefettet, mal unterstrichen, mal stehen sie in einem eigenen Textabsatz (<p>), mal zu Beginn eines <li>-Tags, und manchmal werden <ul>-Aufzählungslisten nicht korrekt geschlossen. Die Regulären Ausdrücke bilden all diese Varianten ab.

Tabellen „umstülpen“ mit OpenRefine

Funktioniert der Scraper schließlich und erfasst alle Angaben korrekt, bietet OutWit Hub die Möglichkeit, die Daten in Tabellenform zu exportieren (CSV, Excel). Jede Zeile steht für einen Abgeordneten, die angegebenen Tätigkeiten sind über die Spalten verteilt. Weil es einige Parlamentarier mit sehr vielen Angaben gibt, hat die Tabelle entsprechend viele Spalten – sie wird also sehr breit und unübersichtlich, Abgeordnete mit keinen oder wenigen Angaben haben viele leere Zellen.

Ziel ist es, eine Tabellenstruktur zu erreichen, in der jede Zeile für eine Tätigkeitsangabe steht. Abgeordnete mit nur einer Angabe haben weiterhin nur eine Zeile, Abgeordnete mit mehreren Angaben sind über mehrere Zeilen verteilt. Das ermöglicht am Ende die weitere Auswertung per Pivot-Tabelle im Tabellenkalkulationsprogramm der eigenen Wahl.

Die Zielstruktur lässt sich mit der Transpose-Funktion von OpenRefine erreichen. Das Tool wird unter anderem dafür genutzt, um in unsauberen Datensätzen unterschiedliche Schreibweisen anzugleichen – manchmal wird da die zweite Schlüsselfunktion ganz vergessen: Daten aus mehreren Zeilen in verschiedene Spalten ein und derselben Zeile überführen und umgekehrt.

In diesem Fall geht es darum, die Tätigkeitsangaben, die über die Spalten verteilt sind, in mehrere Zeilen zu überführen. Dafür klickt man in der ersten Spalte mit Tätigkeitsangaben auf den Dropdown-Pfeil und wählt im Menü „Transpose -> Transpose cells across columns into rows“.

Im folgenden Dialogfenster legt man fest, wie genau die neue Struktur aussehen soll. Von der ausgewählten bis zur letzten Spalte sollen alle dem Prozedere unterzogen werden. Es sollen nur noch zwei Spalten übrig bleiben, eine in der die Überschriften der ursprünglichen Spalten übernommen werden (Typ der Einkünfte) und eine in der dann die eigentliche Tätigkeitsangabe steht. Leere Zellen sollen ignoriert werden, sodass keine leeren Zeilen entstehen. Und in den vorderen Spalten sollen die Namens- und Parteiangaben auf alle Zeilen übertragen werden, die zum selben Abgeordneten gehören.

Fertig ist die wohl strukturierte Tabelle. Nun müssen noch die meist in Einkommensstufen angegebenen Nebeneinkünfte in echte Geldbeträge übersetzt werden (durch intensives Nutzen von Facets und Textfiltern in Kombination mit RegEx), bis schließlich alle Angaben per Pivot-Tabelle zusammengefasst werden können.

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.