Ich möchte für ein kleine Projekt Informationen aus dem Netzt weiterverarbeiten. Konkret geht es um Wetterdaten, die ich auf einem kleinen Webserver nutzen möchte. Welche Ansätze gibt es, damit man Informationen aus den Webseiten extrahieren kann? Ein Beispiel: Ich möchte den Temperatuverlauf für den morgigen Tag. Dazu benötige ich für jede Stunde die Temperatur. Natürlich ist diese auf der HTML-Seite verteilt. Wie kann ich diese verarbeiten bzw. die Informationen für mich nutzen. Am besten wäre Hinweise, wie so etwas unter Linux mit der Shell gehen könnte. Aber auch python oder andere Sachen wären möglich. Was wäre da generell zu Empfehlen. Ich probier auch gern was neues aus.
Es gibt Dienstleister, die solche Daten in einem sinnvoll verarbeitbaren Format zur Verfügung stellen, ohne daß man Webseiten auseinanderpflücken ("screen scraping") muss. Siehe z.B. http://www.worldweatheronline.com/api/ (durchaus auch kostenlos)
Wenn es scraping sein muss:
> Linux mit der Shell
Ein bash-Script mit curl, grep, sed und viel Zeit sowie Fluchen, wenn
der Anbieter irgendwann die Seite ändert.
Aus eigener Erfahrung: gleich mit Python und Beautiful Soup (oder einer
ähnlichen Lösung) anfangen, die nicht auf unterster Textebene die
Seite zerpflückt. Ab einen gewissen Grad der Komplexität wird die
schnelle einfache bash-Lösung zur Bremse, weil sich der Hauptteil der
Entwicklung auf "Wie kann ich bash durch obskure Tricks dazu bringen, X
zu tun?" verschiebt.
In Python kommst du mit den mitgelieferten Bibliotheken mit wenig Aufwand schon ziemlich weit: Mit urllib.request kannst du den HTML-Text einer Webseite einlesen und mit re per regulärem Ausdruck nach bestimmten Mustern suchen. Falls reguläre Ausdrücke zu schwach sind, kannst du mit html.parser den HTML-Text auch syntaktisch analysieren. Hier ist ein einfaches Beispiel zur Abfrage der aktuellen Temperatur in Berlin von wetter.com:
1 | from urllib.request import urlopen |
2 | from re import search |
3 | |
4 | url = 'http://www.wetter.com/wetter_aktuell/aktuelles_wetter/deutschland/berlin/DE0001020.html' |
5 | pattern = r'<div class="degree-in" >\s*(\S*)\s*°C\s*</div>' |
6 | |
7 | htmltext = urlopen(url).read().decode('utf-8') |
8 | searchresult = search(pattern, htmltext) |
9 | if searchresult: |
10 | temp = float(searchresult.group(1).replace(',', '.')) |
11 | print('Aktuelle Temperatur: %.1f °C' % temp) |
Diese Methode der Abfrage funktioniert prinzipiell mit jeder Webseite. Allerdings musst du bei jeder Änderung des Aufbaus der Webseite deine Software entsprechend anpassen. Diesbezüglich ist die Verwendung eines APIs, wie von Rufus vorgeschlagen, vorteilhafter.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.