LWP: Programmieren mit der libwww
Die LWP (libwww-perl) ist eine Bibliothek mit Funktionen zur Programmierung von Bots / automatisieren von Webseitenaufrufen. Die einfachste Möglichkeit ist, dass man nur eine bestimmte Website aus dem Internet herunterladen will, z.B. eine News-Site. Dafür gibt es in der LWP das Modul LWP::Simple. Hier ein kleines Beispiel zur Verwendung des Befehls:
Webseite herunterladen
#!/usr/bin/perl
use LWP::Simple;
my $seite = get "/index.html";
Dadurch wird die Seite in den Speicher eingelesen, genauer gesagt der HTML-Code der Seite. Mit diesem Inhalt kann man nun tun, was mann will, z.B. ihn in einer Datei speichern oder nach bestimmten Wörtern durchsuchen. Allerdings will man oft nicht nur den Inhalt einer Seite auslesen, sondern auch die HTTP-Header Zeilen, oder spezielle HTTP-Request Zeilen hinzufuegen. Dafür gibt es die LWP Klasse LWP::UserAgent, die einen Browser imitiert.
Dasselbe mit UserAgent
#!/usr/bin/perl
use LWP;
my $browser = LWP::UserAgent->new;
my $antwort = $browser->get("");
Das scheint ersteinmal nichts anderes als das erste Beispiel zu sein, allerdings ist die Antwort in diesem Fall ein Objekt mit mehr Informationen als nur dem Inhalt der Seite. So kann man z.B. über $antwort->is_success abfragen, ob der Aufruf der Seite ein Erfolg war, in $antwort->status_line kann man nachsehen, wieso der Aufruf nicht erfolgreich war (z.B. 403 Forbidden). Den Inhalt der Webseite kann über $antwort->content gelesen werden.
Oft will man nicht, dass der Webserver dessen Seite man aufruft weiß, dass sie von einem Bot aufgerufen wird. Normalerweise sendet die LWP als Browserkennung “libwww-perl/Version” was in diesem Fall unpraktisch ist. Man kann aber die Browserkennung mit dem Befehl $browser->agent($kennung) ändern. Um z.B. so zu tun, als ob der Bot eine Linux Variante von Firefox wäre müsste man Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.1) Gecko/0000000000 Firefox/2.0.0.1 (Ubuntu-edgy) eingeben, das ist übrigens die Kennung meines Firefox-Browsers.
Um einen Bot zu schreiben braucht man manchmal die Fähigkeit Formulare auszufüllen und abzusenden. Dabei muss man zwischen den GET-Formularen, dessen Inhalt an die URI angehängt wird, und den POST-Formularen, welche als eine extra Request Zeile an den Server übetragen werden unterscheiden. Für beide Möglichkeiten bietet LWP Funktionen. Soll ein GET-Formular übertragen werden so erstellt man ein neues Objekt der Klasse URI und gibt diesem die Schlüssel-Werte Paare als Parameter. Die nun generierte URL kann mit der Funktion get ganz normal aufgerufen werden:
GET-Formulare
#!/usr/bin/perl
use LWP;
use URI;
my $browser = LWP::UserAgent->new;
my $uri = URI->new("http://www.google.com");
$uri->query_form('q' => 'LWP');
my $antwort = $browser->get($uri);
Natürlich kann die Funktion query_form auch mehrere Schlüssel-Werte Paare als Argumente bekommen. Wenn man nun aber POST-Formulare absenden will, dann muss man einen anderen Weg gehen: Für POST-Formulare besitzt LWP die Funktion browser_post($url, [schlüssel1 => wert 1, ...]). Ein Beispiel:
POST-Formulare
#!/usr/bin/perl
use LWP;
my $browser = LWP::UserAgent->new;
my $antwort = $browser->browser_post("http://www.example.org/form.php",['beispiel' => 'wert']);
Wenn man freundliche Bots schreiben will, die auf die robots.txt achten und nicht zu oft Anfragen starten, so benutzt man statt der LWP::UserAgent Klasse, die LWP::RobotUA, welche genau auf diese beiden Sachen achtet. Die new-Methode dieser Klasse erwartet außerdem zwei Parameter: Den Namen des Bots und die Email-Adresse des Benutzers des Bots.



Kommentare
(verstecken) RSSGib deine Meinung ab!