Skip to content
Daniel Ehlers edited this page Nov 19, 2016 · 16 revisions

Hier erfährst Du, wie Du ris-scraper installieren und konfigurieren kannst.

Wer einen kompletten Installer will, wo er die Konfiguration des Scrapers in der Weboberfläche statt in der MongoDB erstellen kann, sollte im Schwesterprojekt ris-web vorbeischauen.

Systemvoraussetzungen schaffen

Zunächst solltest Du sicher stellen, dass einige benötigte Pakete vorhanden sind. Falls Du eine Debian-basierte Linux-Distribution verwendest, könntest Du das mit apt-get so machen:

$ sudo apt-get update
$ sudo apt-get install libxml2-dev libxslt1-dev zlib1g-dev build-essential python-virtualenv 

ris-scraper von Github installieren

Wir installieren uns die neuste Version von ris-scraper in einem Verzeichnis unserer Wahl mit diesen Befehlen:

$ mkdir /srv/www
$ mkdir /srv/www/ris-scraper
$ cd /srv/www/ris-scraper
$ git clone git://github.com/okfde/ris-scraper.git .

ris-scraper sollte in der Regel ris gehören (jedenfalls nicht root):

$ chown ris:ris -R /srv/www/ris-scraper/

Python-Umgebung

Jetzt erzeugen wir eine eigene Python-Umgebung mit virtualenv:

$ virtualenv venv

Nun aktiviert man die gerade erzeuge Umgebung mit diesem Befehl:

$ source venv/bin/activate

Zunächst updaten wir pip und setuptools:

$ pip install --upgrade pip setuptools

Die für den Scraper benötigten Python-Module installieren wir nun so in die aktive Umgebung:

$ pip install -r requirements.txt

Damit ist die Python-Umgebung fertig.

MongoDB Installation

An dieser Stelle gibt es mehrere Möglichkeiten. Für Entwicklungszwecke wirst Du hier eventuell etwas anderes machen wollen, als es für einen produktiven Server der Fall der Fall ist.

Die Firma 10gen, das sind die Entwickler von MongoDB, stellen Pakete und Anleitungen für Debian und für Ubuntu zur Verfügung. Wer eine dieser beiden Distributionen nutzen möchte, sollte nach den entsprechenden Anleitungen verfahren:

Sicherheitshinweis: MongoDB ist standardmäßig offen wie ein Scheunentor. Jeder kann über das Netzwerk Daten lesen und löschen. Um das zu verhindern, sollten die Firewall-Einstellungen mindestens so angepasst werden, dass die entsprechenden Ports nur von localhost aus erreichbar sind.

Basis-Konfiguration

Als nächstes erstellen wir eine Konfigurationsdatei.

Der einfachste Weg, eine Konfiguration anzulegen und später zu nutzen, ist das mitgelieferte Beispiel config.py anzupassen. Beim Aufruf des scrapers wird dann automatisch die Konfiguration in config.py verwendet, wenn nichts anderes definiert wird.

Beachte beim Anpassen der Konfigurationsdatei, dass es sich um Python-Code handelt. Das bedeutet beispielswiese, dass die genaue Schreibweise der Namen von Konfigurationsvariablen nicht verändert werden darf.

Die Einstellungen im Einzelnen:

DB_TYPE

Der Datenbank-Typ kann nur "mongodb" sein. Aber vielleicht ändert sich das in Zukunft auch.

DB_NAME

Hier kannst Du den Namen der Datenbank in MongoDB festlegen.

DB_HOST

Wenn MongoDB auf der selben Maschine läuft, belasse dies bei "localhost". Sonst gib die IP-Adresse oder den Hostnamen des Servers an.

DB_PORT

Der Port für den MongoDB-Server kann ggf. hier angepasst werden.

Erweiterte Konfiguration: Grundlagen

Die restliche Konfiguration befindet sich in der MongoDB. Das Schwesterprojekt ris-web hat eine komfortable Weboberfläche zur Verwaltung. Vorlagen für die Konfiguration befinden sich im Ordner config. Selbstverständlich kann man die JSON Files auch direkt in der MongoDB manipulieren, das gibt ein bisschen Übung in der MongoDB Shell.

Die Konfiguration ist dabei unterteilt in Bodies (also Körperschaften, welche gescraped werden), Regions (Zusammenfassungen von Bodies) und der Hauptkonfiguration. Für den Scraper relevant ist die Hauptkonfiguration und die Bodies.

Im Falle der Bodies gibt die zentrale Konfiguration etliche Werte vor, diese kann dann in dem jeweiligen Body ergänzt werden. Wenn also eine Stadt in einem Fall einen abweichenden XPATH benötigt, kann dieser - und nur dieser - in den Body geschrieben werden, während der Rest in der Hauptkonfiguration bleibt.

Erweiterte Konfiguration: Hauptkonfiguration

In ['scraper'] befinden sich alle für den Scraper relevanten Variablen (Link zur Vorlage). Die wichtigsten wären:

log_base_dir

Dorthin loggt der Scraper.

log_level

Das Level des Loggings. Erlaubte Werte sind die Log-Level vom Python-Modul logging. Wenn man debuggen möchte, lohnt sich ein Blick in den Parameter --interative, welcher alle Logmeldungen auch in die Konsole auf stdout ausgibt.

Erweiterte Konfiguration: Body

In ['config'] bzw. ['config']['scraper'] befinden sich alle für den Scraper relevanten Variablen (Link zur Vorlage). Die wichtigsten wären:

base_url

Dies ist die Basis-URL des 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/

type

Mit type sagst Du dem Scraper, um was für ein Ratsinformationssystem es sich handelt. Zur Zeit werden sessionnet-php, sessionnet-asp und allris unterstützt. Allerdings Vorsicht: allris ist noch an ein anderes Datenmodell angepasst, d.h. dort fehlt noch ein wenig Entwicklungsarbeit.

rgs

rgs steht für "Regionalschlü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 Regionalschlüssel.

In einigen Fällen kannst Du den Regionalschlüssel schon auf der Wikipedia-Seite zur jeweiligen Körperschaft finden. Die offizielle Quelle ist jedoch das Gemeindeverzeichnis des Statistischen Bundesamts. Dieses kann man unter anderem im Excel-Format herunter laden und darin nach seiner Gemeinde suchen.

Für eine Gemeinde ist der RS immer 12stellig, ohne Leerzeichen. Für Verbandsgemeinden sind es neun Stellen, bei Landkreisen sind es fünf Stellen. Fülle bitte aber immer 12 Zeichen aus, d.h. ergänze fehlende Stellen mit Nullen.

Seiten-URLs

Die Seiten-URLs in der Konfiguration sind nur anzupassen, wenn 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.

XPath-Strings

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/

party_alias

Falls im Ratsinformationssystem Parteien unter mehreren Namen vorkommen, kann man sie hiermit zu einer einzigen Partei verschmelzen. party_alias erwartet eine Liste an Listen. Zum Beispiel: 'Partei 1 mit Schreibfehler','Partei 1'],['Partei 2 mit Schreibfehler','Partei 2'

result_strings

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_strings nicht gefunden wird, wird die tatsächlich genutzte Formulierung in die Datenbank geschrieben und eine Warnung ausgegeben.

Und weiter?

Das war's erst mal mit der Konfiguration. Weiter geht es mit der Anleitungsseite zu Benutzung.