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