-
Notifications
You must be signed in to change notification settings - Fork 8
Installation
Wir erzeugen zunächst eine eigene Python-Umgebung mit virtualenv. Wer virtualenv noch nicht hat, kann es mit diesem Befehl installieren:
>>> sudo pip install virtualenv
Wenn virtualenv vorhanden ist, wechsele in das Hauptverzeichnis von Scrape-A-RIS (wo README.md liegt) und führe diesen Befehl aus:
>>> virtualenv --no-site-packages venv
Aktiviere die Umgebung mit diesem Befehl:
>>> source venv/bin/activate
Jetzt kannst Du wie folgt die benötigten Python-Module in die gerade erzeugte und aktivierte Umgebung installieren:
>>> pip install lxml mechanize parse pymongo pytest python-magic
Richtige Server-Admins kennen natürlich ihre Wege, um eine Datenbank-Software auf einem Server zu installieren. ;-) Für Testzwecke auf einer lokalen Umgebung kann der folgende Weg funktionieren.
Achtung: Damit ist die MongoDB-Installation offen wie ein Scheunentor. Jeder kann über das Netzwerk Daten lesen und löschen.
Unter MacOS oder Ubuntu (möglicherweise sogar unter Windows) ist das einfachste, sich eine fertige Version von Mongo herunter zu laden. Sobald das Paket entpackt ist, lässt sich darin über die Kommandozeile der Datenbank-Server starten:
>>> bin/mongodb --dbpath /pfad/zu/meiner/datenbank
Der Pfad /pfad/zu/meiner/datenbank steht für ein beliebiges Verzeichnis, in dem MongoDB die eigenen Datenbanken ablegen soll.
Beenden kann man den Server, wenn er auf diesem Weg gestartet wurde, übrigens mit Eingabe von Ctrl+C in der selben Konsole.
Als nächstes erstellen wir eine Konfigurationsdatei.
Der einfachste Weg, eine Konfiguraiton anzulegen und später zu nutzen, ist das mitgelieferte Beispiel zu kopieren und anzupassen. Beim Aufruf des scrapers wird dann automatisch die Konfiguration in config.py verwendet, wenn nichts anderes definiert wird.
>>> cp config_example.py config.py
(Es ist möglich, verschiedene Konfigurationsdateien vorzuhalten, z.B. für verschiedene Ratsinformationssysteme oder für Test- bzw. Produktionszwecke. Die Dateien müssen lediglich alle im Hauptverzeichnis der Anwendung liegen. Beim aufruf von Scrape-a-RIS kann dann mit dem Parameter -c eine bestimmte Datei ausgewählt werden.)
Die Konfigurationsdatei muss nun angepasst werden. Beachte dabei, dass es sich um Python-Code handelt. Das bedeutet beispielswiese, dass die genaue Schreibweise der Namen von Konfigurationsvariablen nicht verändert werden darf. Es bedeutet auch, dass man die Variablen an anderer Stelle nutzen kann, um Wiederholungen zu vermeiden.
Die Einstellungen im Einzelnen:
AGS steht für "Amtlicher Gemeindeschlüssel". Wenn Du ein Ratsinformationssystem (RIS) scrapen willst, ist die Annahme, dass dieses zu einer Gemeinde, einem Gemeindeverbund, einem Landkreis oder ähnlichem gehört. Alle diese Gebietskörperschaften haben einen solchen Amtlichen Gemeindeschlüssel.
Du findest den AGS über diese Seite heraus: https://www.destatis.de/gv/
Der AGS muss 8 Stellen lang sein und ohne Leerzeichen angegeben sein.
Der AGS wird hier benötigt, um es Dir zu ermöglichen, die Daten von mehreren Ratsinformationssystemen in die selbe Datenbank zu schreiben. Solltest Du nicht in der Lage sein, den richtigen AGS für das RIS der Wahl zu finden, kannst Du Dir einen beliebigen 8 Zeichen langen String ausdenken (nur idealerweise keinen existierenden AGS!). Für verschiedene Konfigurationen zu unterschiedlichen RIS musst Du entsprechend selbst darauf achten, dass die AGS sich unterscheiden. Sonst überschreibt der Scraper bereits vorhandene Daten aus einem anderen RIS.
Der Datenbank-Typ kann nur "mongodb" sein. Aber vielleicht ändert sich das in Zukunft auch.
Hier kannst Du den Namen der Datenbank in MongoDB festlegen.
Wenn MongoDB auf der selben Maschine läuft, belasse dies bei "localhost". Sonst gib die IP-Adresse oder den Hostnamen des Servers an.
Der Port für den MongoDB-Server kann ggf. hier angepasst werden.
Dies ist die Basis-URL des SessionNet Ratsinformationssystems, das Du scrapen möchtest. Sie ist nicht zu verwechseln mit der URL der Startseite. Beispiel:
In Mannheim lautet die URL der Startseite
http://buergerinfo.mannheim.de/buergerinfo/infobi.asp
und die URL einer Sitzungs-Detailseite:
http://buergerinfo.mannheim.de/buergerinfo/to0040.asp?__ksinr=6080
Die Basis-URL ist der gemeinsame Teil dieser beiden URLs, nämlich
http://buergerinfo.mannheim.de/buergerinfo/
Der Name (HTTP User Agent), mit dem der Scraper sich bei den Anfragen an das Ratsinformationssystems identifiziert. Dieser ist im Prinzip beliebig. Beachte, dass dieser Name üblicherweise beim Betreiber in Log-Dateien geschrieben wird.
Pfad zum Ordner, in dem herunter geladene Anhänge zu Vorlagen abgelegt werden sollen. Das Beispiel
ATTACHMENT_FOLDER = 'cache/attachments/' + AGS
ist ein relativer Pfad, ausgehend vom Scrape-a-RIS Hauptverzeichnis. Du kannst hier auch einen absoluten Pfad angeben, der dann entprechend mit / beginnt.
Der Pfad sollte KEINEN SCHRÄGSTRICH am Ende haben.
Im Beispiel wird der AGS (siehe oben) in den Pfad eingebaut, um die Anhänge aus verschiedenen RISen nicht mit einander zu vermischen und zu verhindern, das Dateien mit identischen Namen einander überschreiben.
Die Seiten-URLs in der Konfiguration sind nur unter bestimmten Bedingungen anzupassen:
- Entweder, weil bei dem RIS, das Du scrapen willst, die PHP-Version eingesetzt wird, statt der APS.NET Version (erkennbar an den .php-Dateiendungen in den URLs)
- Oder weil der Betreiber gegenüber dem Standard-Produkt Anpassungen an den URLs vorgenommen hat.
Es gibt zu jeder URL zwei Konfigurations-Strings. Der eine hat einen Namen endend mit _PARSE_PATTERN und dient dem Erkennen von Links zu den entsprechenden Seiten sowie zum Auslesen der URL-Parameter. Diese URIs sind immer relativ, d.h. es fehlt der Teil, der in BASE_URL definiert ist.
Der zweite endet mit _PRINT_PATTERN und dient der Erzeugung von absoluten URLs für den jeweiligen Seitentyp. Hier ist immer BASE_URL vorangestellt.
Hier geht es ans eingemachte der Scraper-Logik. Daran solltest Du nur dann etwas verändern, wenn die Einstellungen aus der config_example.py für Dein System nicht funktionieren und Du weißt, wie XPath funktioniert.
Die config_example.py enthält für viele XPath-Strings mehrere Varianten, die auskommentiert sind. Beispielsweise sind dort XPath-Pfade für die bei der PHP-Version von SessionNet leicht anders strukturierten Seiten enthalten.
Wenn Du Unterstützung bei der Anpassung benötigst, kannst Du Dich an die RIS-Öffner Mailingliste wenden.
https://groups.google.com/group/ris-oeffner/
Hiermit können verschiedene im RIS gebräuchliche Formulierungen zum Ergebnis eines Vorgangs auf eine standardisierte Form gebracht werden. Sofern eine vorkommende Formulierung in RESULT_STRING nicht gefunden wird, wird die tatsächlich genutzte Formulierung in die Datenbank geschrieben und eine Warnung ausgegeben.