Zum hauptinhalt springen

Web-Scraping (Hacky Hour Gießen)

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
      1. Freie Tage (mit angefragter Anazhl Minuten)
      2. 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
  • Polizei-Verkehrsmeldungen in Hessen

    • Github-IP blocked
  • Frankfurt Parkplätze

    • Ausfall des Webservice der Frankfurter Verwaltung