Читать книгу Dojos für Entwickler 2 - Stefan Lieser - Страница 68
Aufgabe 4 Screen-Scraping für Webanwendungen Wann kommt der Bus?
ОглавлениеViele Websites bieten ihre Daten und Services auch über eine Programmierschnittstelle (API) an. Wenn eine solche Schnittstelle nicht existiert, bleibt als Ausweg nur Screen-Scraping.
Die Idee beim Scraping besteht darin, die Webanwendung wie ein Browser über HTTP anzusprechen. Aus dem gelieferten HTML-Datenstrom liest man die benötigten Informationen heraus. Das Verfahren wird allgemein als Screen-Scraping bezeichnet. Ich kann mich noch an die „Green Screen“-Zeiten erinnern. Da hingen beispielsweise IBM-5250-Terminals an einer AS/400. Als die Windows-PCs in Mode kamen, konnte man 5250-Emulatoren unter Windows einsetzen, um aus dem 5250-Terminaldatenstrom Informationen herauszulesen. So wurde eine Bedienung der AS/400-Anwendungen mit der Maus unter Windows möglich. Über die Sinnhaftigkeit lässt sich streiten.
Heute spielen Terminals keine Rolle mehr. Aber eine vergleichbare Aufgabenstellung ergibt sich häufig für Webanwendungen. Existiert kein API, über das die Webanwendung angesprochen werden kann, bleibt nur der Ausweg über HTTP und HTML. Ein konkretes Beispiel, an dem ich zurzeit arbeite: Die Kölner Verkehrsbetriebe (KVB) stellen die aktuellen Abfahrtszeiten von Bussen und Bahnen zu fast allen Haltestellen im Web zur Verfügung [1]. An den Haltestellen befinden sich QR-Codes, die beim Scannen auf die jeweilige Webseite der Haltestelle führen, siehe Abbildung 1.
[Abb. 1]
Der KVB-Fahrplan im Browser des iPhones ..
Das ist eine tolle Sache! Allerdings habe ich mir eine App für mein iPhone gewünscht, in der ich die Haltestelle auswählen kann und dann die gleichen Informationen angezeigt bekomme. Eine solche App gab es nicht, also musste ich sie mir selbst bauen, siehe Abbildung 2.
[Abb. 2]
... und als native iPhone-App.
Die Daten werden von den KVB zurzeit nur in Form von HTML zur Verfügung gestellt, also blieb mir nichts anderes übrig, als die Daten aus dem HTML-Dokument auszulesen.
Glücklicherweise muss man für Web-Scraping nicht alles selbst bauen. Es gibt die Open-Source-.NET-Bibliothek Html Agility Pack [2]. Damit ist das Auslesen einzelner HTML-Elemente sehr komfortabel über XPath-Ausdrücke möglich. Und mit dem WebClient aus dem .NET Framework kann der HTML-Datenstrom besorgt werden. Das funktioniert auch asynchron.
Die Übung für diesen Monat besteht darin, mittels WebClient und Html Agility Pack eine Anwendung zu bauen, die asynchron Daten aus dem Web lädt und diese auf der Konsole oder in einem GUI anzeigt. Was Sie als Datenquelle nehmen, bleibt Ihnen überlassen. Folgende Beispiele mögen Ihnen als Anregung dienen:
Suchen eines Buches bei Amazon über den Titel oder die ISBN, um herauszufinden, ob es das Buch als E-Book für den Kindle gibt [3].
Anzeigen der aktuellen Abfahrten der Bahn AG an einem einzugebenden Bahnhof [4].
Anzeigen der aktuellen Abfahrtszeiten an einer KVB-Haltestelle [5].
Das Laden der HTML-Daten sollte in jedem Fall asynchron erfolgen. Andernfalls friert die Benutzerschnittstelle ein, das ist heutzutage nicht mehr zu entschuldigen. Experimentieren Sie mit der Frage, ob die HTML-Daten mit dem Html Agility Pack im Hintergrund verarbeitet werden sollten oder ob dies im Hauptthread passieren kann. Happy Scraping!
[1] KVB, Haltestellensuche, http://www.kvb-koeln.de/german/hst/search/ [2] Html Agility Pack, http://htmlagilitypack.codeplex.com/ [3] http://www.amazon.de [4] Deutsche Bahn, http://reiseauskunft.bahn.de/bin/bhftafel.exe/ [5] KVB, Haltestelle Kölner Dom, http://www.kvb-koeln.de/qr/8