Im vorherigen Post “CloudStack & Symfony2“ wurde gezeigt, mit welchem Konzept man aus einer Online-Dokumentation einen API-Client generieren kann. Angeknüpft daran soll dieser Post anhand eines Beispiels demonstrieren, wie man mit Web Scraping maschinenlesbare Informationen aus Webseiten gewinnt. Heutzutage werden viele API-Dokumentationen mit Hilfe von Tools generiert, statt von Hand geschrieben. Ein Trend, der sich grosser Beliebtheit erfreut und durch zahlreiche Tools ermöglicht wird, z.B. mit PHPDocumentor oder Sami. Wir kehren diesen Ansatz um und generieren Code aus einer Dokumentation.

Webseiten herunterladen

Zunächst wird eine Webseite bzw. ein Markup Dokument (HTML, XML, etc.) heruntergeladen, was beispielsweise mit dem Guzzle HTTP Client möglich ist.

Statt den HTML-Code der Webseite auszugeben, wird dieser in einer Variable gespeichert. So kann er später weiter verarbeitet werden.

Dokument parsen

Das Dokument als String-Repräsentation in der Variable kann nun geparst werden. Sofern das Dokument reines XML Markup ist, kann dafür PHP’s SimpleXML verwendet werden. Im Beispiel hier liegt ein HTML-Dokument vor, welches mit der Dom Crawler Komponente von Symfony2 geparsed werden kann. Dabei wird davon ausgegangen, dass bereits ein Guzzle Response-Objekt $response zur Verfügung steht.

Das Beispiel zeigt, wie alle Übertitel aus dem HTML Dokument extrahiert und als ‘topic’ und ‘classname’ in ein assoziatives Array geschrieben werden. Anhand dieser Infos können schlussendlich PHP Klassen generiert werden.

Der Parser bzw. Crawler ist vereinfacht implementiert und keineswegs vollständig. Wie alle benötigten Informationen aus dem Dokument extrahiert werden können, zeigt die Implementierung der Klassen DocumentationIndexScraper, DocumentationMethodDetailScraper und AbstractWebScraper.

Fazit

Mit einem Web Scraper besteht die die Möglichkeit, Daten aus dem Web zu extrahieren und weiter zu verarbeiten. Das spart viel Zeit und Aufwand. Solange sich die Struktur des verwendeten Dokuments nicht ändert, können auch Daten aus weiteren Versionen extrahiert werden, ohne dass der Code angepasst werden muss. Voraussetzungen dafür ist ein semantisch korrektes Markup, sowie die Online-Verfügbarkeit des Dokuments. Weitere Knackpunkte welche vorab überprüft werden sollten, sind Aktualität und Korrektheit der Doku, auf die meisst kein Einfluss genommen werden kann.

Alle Codebeispiele dieses Artikels stehen als Gist bei Github zur Verfügung.

Im nächsten Beitrag der Serie wird gezeigt, wie aus den gewonnenen Daten PHP-Klassen generiert werden, die schlussendlich als API Client zur Verfügung stehen sollen. Haben Sie Fragen oder Feedback? Verfassen Sie einen Kommentar oder twittern Sie an @frank_neff

(This blog post is also available in English)

0 Kommentare

Einen Kommentar abschicken

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *