Web-Scraping (Hacky Hour Gießen)
Hier liegt die deutsche Version meines Talks über Data-Scraping (dort in Englisch) in der Hacky-Hour in Gießen. Den zweiten Teil des Talks hat Martin Lellep gehalten und seine Projekte vorgestellt.
Beginn des Talk
Heute geht es um Data-Scraping
- Daten aus dem Internet lesen und speichern
- Messen beinhaltet aber oft auch eine zeitliche Komponente
Tools:
- Jupyter-Notebooks, Python, beatiful-soup
- Dev-Tools im Browser
- Github-Actions
Ziel ist Verständnis über folgende Punkte:
- wie sind Websites aufgebaut
- was benötige ich um Zeitreihen aus Websites zu erstellen
- einige Werkzeuge zur Auswertung
Grundlagen
Daten im Internet werden von einem Browser gelesen.
|---------| linked /-----------\
| | reads /-----------\ in | Resourcen |
| Browser | <---- | HTML Page | <---- | json, jpg |
| | \-----------/ | csv ... |
|---------| \-----------/
Browser rendert Website via Spezifkation einer sog. Markup-Sprache. Website ist maschinenlesbar. Markup-Sprache linked zu anderen Resourcen wie Daten oder Bilder
Dev-Tools im Browser erlauben das Untersuchen:
<html>
<head>
</head>
<body>
<h1>It works</h1>
<ul>
<li>Parkhaus A - 30/50 belegt</li>
<li>Parkhaus B - 35/60 belegt</li>
</ul>
<a href="data.csv">Data</a>
<img src="graph.jpg" />
</body>
</html>
Daten
- Strukturierte Informationen zum Rendering im Browser wie HTML
- Allgemeine Datenformate wie JSON oder CSV
- Auch maschinenlesbar aber anders: Bild-Daten oder mehr “binäre” Formate (heute Beschränkung auf JSON und HTML)
Problem: Wir wollen über die Zeit betrachten, also wie? Zeitreihe
- Zustand der Website speichern (Daten erheben). Automatisch?
- Zustände auswerten (Daten analysieren)
Daten erheben
Das heißt ständig “betrachten” und “notieren” im Internet
- Dafür benötige ich eindeutige Adresse z.B. für JSON/CSV
oder “Algorithmus” (XML-Pfad) wie ich aus HTML mein Datum ermitteln
- Adresse oder XML-Pfad z.B. per Browser oder Dev-Tools explorieren Langfristig als Algorithmus dann z.B. in Python mit BeautifulSoup Jupyter-Notebook1 Ausführung einzelner Code-Schnipsel, speichert Http-Response
- Automatische Ausführung auf einer eigenen Maschine
- Github-Actions
- cronjob auf eigenem Linux Server
- Wichtig: Wie sichere ich versch. Fehlerfälle ab
Sonst stehe ich schnell mal mit fehlenden Daten da
Fehlerfälle:
- Quelle (Website oder Daten) verändert sich Strukturelle Veränderung oder Verschoben
- Remote-Server lässt kein Scraping zu z.B. IP wird gesperrt Mitigation:
- Workflow zu versch. Fällen auch wieder über Jupyter-Notebook
oder z.B. über Kommandozeile mit curl und jq
- Disguise oder Elaboriertes Scraping Framework
- Proxies oder Tor-Browsing
- Server cronjob oder Github-Actions mailen mich bei Fail an
Auswertung der Daten:
- Für Zeitreihen immer ähnlich, Schema des Speicherns zum Zeit der Messung bestimmt das Schmea der späteren Extraktion
- Alternative: Rohdaten speichern und damit Schema erst zum Zeitpunkt des Auswertens definieren
Note: HTML-Dokumente können auch via pandoc (siehe letzter Termin 2) in pure Text-Darstellung überführt werden.
Datenquellen
-
Strecken-News auf bahn.de (via Github Actions, git-history u. datasette)
- Einfach: Statische Adresse für JSON-File alle 20 Minuten abfragen
- Messung: Roh-JSON-Datei (mit Meldungen) zu einem Zeitpunkt
- Auswertung:
- Wie lange sind Meldungen im Ticker (pro Bundesland/Strecke/Typ)
- Anzahl von Meldungstypen im Zeitverlauf (pro Bundesland/Strecke)
- Fazit:
- Daten stehen automatisch vollständig und versioniert zur Verfügung
- datasette bietet immer gleiches Front-End zur Datenauswertung ? Erfordert technisches Verständnis
-
Parkplätze in Gießen (via v-server, cronjob und python/beatiful-soap)
- Einfach: Statische Adresse für HTML-File alle 20 Minuten abfragen
- Messung: Freie u. Maximale Parkplätze zu einem Zeitpunkt für ein Parkhaus
- Auswertung:
- Auslastung pro Parkhaus über die Zeit
- Wann sind häufig Plätze frei
- Fazit:
- self hosted, volle Kontrolle ? erfordert eigenen Server
-
Freie Termine im Rathaus Gießen (via v-server, cronjob und Python)
- Komplex: Zwei Endpunkte (JSON-Daten) mit Parameter aufrufen
- Freie Tage (mit angefragter Anazhl Minuten)
- Freie Termine an einem Tag (mit angefragter Anzahl Minuten) Konkret: Mitschneiden des Netzwerkverkehrs und kopieren des cURL-Befehls (für Header-Definition)
- Messung: Ein freier Termin zu einem Zeitpunkt für eine angefragte Anzahl an Minuten
- Auswertung:
- Wie lange muss ich für den nächsten Termin im Rathaus warten?
- Wann werden oft Termine freigegeben oder zurückgenommen?
- Fazit: ? schwieriger da Interaktion der Termin-Applikation verstanden werden muss
- Komplex: Zwei Endpunkte (JSON-Daten) mit Parameter aufrufen
-
Polizei-Verkehrsmeldungen in Hessen
- Github-IP blocked
-
Frankfurt Parkplätze
- Ausfall des Webservice der Frankfurter Verwaltung