Open Data im 21. Jahrhundert
Über die fehlende Einheitlichkeit bei öffentlich verfügbaren Daten
Website background Image

Vor einiger Zeit habe ich mich gefragt, welche Daten aller Art aus meiner Umgebung frei verfügbar sind und was man mit diesen Daten anfangen könnte. Relativ schnell bin ich auf die Plattform für maschinenlesbare Daten der Grazer Stadtverwaltung gestoßen. Hier werden laut eigenen Angaben Daten in maschinenlesbarer Form für Entwicklerinnen und Entwickler aus dem privaten Bereich und der Wirtschaft zur freien Weiterverwendung (basierend auf den Open Data Prinzipien) zur Verfügung gestellt. Als Einstieg wollte ich einfach Daten aus einer öffentlichen Quelle beziehen und in aufbereiteter Form auf meiner Website darstellen. Ich dachte mir, dass es sich um besonders aktuelle Daten handeln müsste um die ganze Sachen spannend zu gestalten. Beispielsweise interessierten mich Daten über die Standorte von Parkgaragen in Graz nur wenig, da es relativ selten vorkommt, dass eine neue Parkgarage errichtet wird oder eine alte abgerissen wird. Nach kurzer Suche fand ich im Datenkatalog der Open-Government-Data Plattform des Landes Steiermark einen Datensatz der Daten zur Feinstaubbelastung in der Steiermark enthält. Mein Plan war es, die aktuellsten Daten dieses Datensatzes direkt auf einer Website darzustellen, sowie die Daten der letzten Stunden in einem Diagramm zu veranschaulichen.

JSON Everywhere?

Der erste Schritt war, die Daten aus der frei verfügbaren Quelle zu beziehen. Ich nahm also an, dass ich mittels Javascript eine Anfrage an die Quelle der Daten sende um dann eine Antwort im gängigen JSON-Format zu erhalten. Mit dieser Annahme lag ich leider falsch. Ich konnte zwar eine Anfrage mit einigen Parametern mit Hilfe der GET-Methode an die Datenquelle übermitteln und ich bekam auch eine Antwort. Diese Antwort war aber leider weder JSON noch XML noch irgendein anderes aktuelles Datenaustauschformat. Zu meinem Erstaunen war die Antwort ein "Microsoft Excel 1997-2003-Arbeitsblatt". Gut, halb so schlimm, dachte ich mir. Irgendwo wird es bestimmt eine Library oder sonst irgendwas für Javascript geben, dass Daten aus einem "Microsoft Excel 1997-2003-Arbeitsblatt" auslesen kann. Zum Glück habe ich etwas derartiges auch schnell gefunden. Nach kurzer Zeit war ich in der Lage die Daten mittels Javascript aus dem "Microsoft Excel 1997-2003-Arbeitsblatt" auszulesen, doch da kam schon das nächste Problem auf mich zu.

HTTPS Everywhere?

Es ist heutzutage üblich Daten im Internet über eine gesicherte Verbindung, also mit Hilfe des Hypertext Transfer Protocol Secure (HTTPS), zu übertragen. Auch die Inhalte dieser Website werden zu jenem, der sie aufruft, über eine gesicherte Verbindung übertragen. Erkennen kann man das in Google Chrome an dem Vorhängeschloss oben links im Browserfenster. Die Daten über die Feinstaubbelastung in der Steiermark werden jedoch nicht über eine solche gesicherte Verbindung zur Verfügung gestellt. Sie sind lediglich über HTTP (Hypertext Transfer Protocol Secure, OHNE Secure) verfügbar. Ich dachte mir, dass das eigentlich gar nicht so schlimm sei, da es sich ohnehin nicht um geheime oder besonders sensible Daten handelt. Leider wieder falsch gedacht. Da meine "sichere" Website versucht, Daten aus einer "unsicheren" Quelle zu laden, würde man in diesem Fall von "Mixed Content" sprechen. Einige Teile meiner Website werden wie gewohnt über die gesicherte Verbindung übertragen, andere Teile aber nicht. Dies hatte zur Folge, dass Chrome den Datenaustausch mit der "unsicheren" Quelle blockierte, und keine Daten auf der Website bzw. beim Benutzer ankamen. Ich musste es also irgendwie schaffen, dass die gewünschten Daten über eine gesicherte Verbindung an meine Website übertragen werden.

Google Cloud Functions

Die Lösung ist äußerst einfach. Eine dritte Instanz bezieht die Daten von der "unsicheren" Quelle, speichert diese, und stellt sie meiner Website über eine gesicherte Verbindung zur Verfügung. Um dies zu realisieren habe ich mich nach einigen Überlegungen für Google Cloud Functions entschieden. Ich habe in der Vergangenheit bereits mit AWS Lambda gearbeitet. Im Prinzip sind diese beiden Anwendungen relativ ähnlich. Bei beiden kann ein Programm in Form von Python-Code (Node.js ist auch möglich) hinterlegt werden, dass dann beim Eintreten bestimmter Ereignisse automatisch ausgeführt wird. Ich schrieb also ein Python-Programm, das das "Microsoft Excel 1997-2003-Arbeitsblatt" herunterlädt und die darin enthaltenen Daten in ein handliches JSON-Datenpaket verpackt. Von meiner Website aus würde nun eine Anfrage an das Programm meiner Google Cloud Function gesendet werden, welches daraufhin die gewünschten Daten über die "unsichere" Verbindung lädt, in ein JSON-Datenpaket überführt und über eine gesicherte Verbindung an meine Website bzw. den Benutzer zurücksendet. Dies funktionierte auf Anhieb ohne Probleme. Auch die Darstellung der Daten auf der Website war nun ohne Probleme möglich.

In Folgenden ist der Python Programmcode, der für das Herunterladen der Daten von der "unsicheren" Datenquelle verantwortlich ist, ersichtlich.

def getFeinstaub(request):
    day = datetime.datetime.now().day
    month = datetime.datetime.now().month
    year = datetime.datetime.now().year
    hour = datetime.datetime.now().hour
    minute = datetime.datetime.now().minute
    url = 'http://app.luis.steiermark.at/luft2/export.php'
    PARAMS = {'station1': 36,
              'station2': 139,
              'station3': 172,
              'komponente1': 125,
              'komponente2': 125,
              'von_tag': day,
              'von_monat': month,
              'von_jahr': year,
              'bis_tag': day,
              'bis_monat': month,
              'bis_jahr': year,
              'mittelwert': 1}
    r = requests.get(url, params=PARAMS)
    file = open("/tmp/temp.xls", "wb")
    file.write(r.content)
    file.close()

Zum Abschluss verwendete ich noch Chart.js um die Daten der letzten Stunden in einem übersichtlichen Diagramm darzustellen. Abschließend kann man sagen, dass ich zwar anfangs verwundert über das Format der Daten war, es aber trotzdem eine interessante Erfahrung war, herauszufinden, wie mit diesem Format umzugehen ist. Die fertige Anwendung kann unter folgendem Link gefunden werden.

More...
Read more interesting blogposts.
Matthias Hülser
insta iconfb iconx iconlinkedin icon
Imprint