Manchmal ist es zu umständlich, sich durch die Hierarchie einer Website zu wühlen, nur um eine bestimmte Information zu finden. Das Perl-Modul WWW::Mechanize::Shell hilft so genannte Screen Scraper zu schreiben, die wie Browser agieren und den Zugriff auf Webseiten automatisieren.
In Kalifornien darf man sich das Nummernschild fürs Auto gegen eine Gebühr selbst aussuchen. Aus nahe liegenden Gründen führt mein 13 Jahre alter Acura Integra das Kennzeichen “PERL MAN” (Abbildung 1). Die Kraftfahrzeugbehörde gibt sich fortschrittlich und bietet eine Webseite an, die prüft, ob das gewünschte Kennzeichen verfügbar ist – allerdings geht das vielen Anwendern zu langsam. Dieser Artikel zeigt, wie man die Abarbeitung von Webanfragen in einem Perl-Skript nachbildet.
Dazu bieten sich so genannte Screen Scraper an. Diese Programme bereiten bestimmte Daten für die Darstellung am Bildschirm auf, sie formatieren zum Beispiel HTML-Seiten für die Shell um.

Abbildung 1: Der erstaunliche PERL MAN: Schon 13 Jahre alt, doch er kann es einfach nicht lassen, die Sportwagen an den Ampeln San Franciscos zu provozieren.
Das passende Perl-Modul
Für solche Screen-Scraper-Programme hat Andy Lester das Modul WWW::Mechanize entwickelt. Neuerdings steht mit WWW::Mechanize::Shell von Max Maischein sogar eine Shell zur Verfügung, mit der Programmierer eine Browser-Session sehr schnell in ein Skript umwandeln. Die Beschreibung der Session erfolgt allein auf logischer Ebene, zum Beispiel: Folge einem Link auf der aktuellen Seite, der den Text \’xxx\’ enthält. Das Skript funktioniert also auch dann, wenn sich das Format der Webseite ändert.
Über die CPAN-Shell lassen sich die Module WWW::Mechanize und WWW::Mechanize::Shell komfortabel installieren. Sie hängen ihrerseits von weiteren Modulen ab, deren Installation dank der Shell-Automatik ebenfalls einfach ist. Der Sreen Scraper benötigt zusätzlich das Modul IO::Socket::SSL, um auch mit HTTPS-Seiten zurechtzukommen.
Die Browser-Emulator-Shell startet nach folgendem Perl-Aufruf:
perl -MWWW::Mechanize::Shell -eshell
Dem Benutzer bietet sich nun ein Prompt. Um die Seite der kalifornischen Kraftfahrzeugstelle “Department of Motor Vehicles” zu laden, tippt er einfach »get http://www.dmv.ca.gov« ein, die Shell antwortet daraufhin mit »Retrieving http://www.dmv.ca.gov(200)« um zu signalisieren, dass das Skript die Startseite erfolgreich geladen hat (HTTP-Code 200).
Die Browserdarstellung der Seite in Abbildung 2 zeigt den gesuchten Link zu »Personalized Plates«. Um herauszufinden welche Links die Shell erkannt hat, genügt das Kommando »links«, das alle verfügbaren Verweise anzeigt:
>links ... [14] Vehicle Industry & Commercial Permits [15] Personalized Plates [16] Disabled Placards ...
Nun könnte der Benutzer einfach dem Link Nummer 15 mit »open 15« folgen, aber das wäre nur begrenzt gültig, da sich Anzahl und Reihenfolge der Links auf einer regelmäßig gewarteten Seite stetig ändern. Der Vorgang sollte daher allgemein gültiger ablaufen, damit das Skript auch dann noch funktionsfähig ist, wenn die Behörde Verweise auf der Seite einfügt oder entfernt.







