Home|Personal|
Tutorials|Scripts|Stupid Tools

yaos°

 

»

HTTP mit Perl

 
 

Einstieg

Mit dem Modul LWP (Library for WWW access in PERL) ist es möglich in PERL Zugriff auf WWW-Dokumente zu bekommen. Dieses Modul verhält sich ähnlich einem Browser, es stellt einen HTTP-Request (WWW-Anfrage) an den WebServer und liefert die Antwort (z.B. das HTML-Dokument) zurück.

Am besten wir steigen direkt mit einem Beispiel in die Materie ein...

Kleiner Einstieg

#!/usr/bin/perl -w

use LWP::UserAgent;

$url = 'http://www.yaos.de/home/';

$agent = new LWP::UserAgent;
$request = HTTP::Request->new('GET', $url);
$result = $agent->request($request);
print $result->content();

Wer zum ersten Mal mit Modulen unter Perl Arbeitet wird jetzt wahrscheinlich erstmal aufstöhnen und fragen wozu diese ganzen "->" Teile sind, aber kümmern wir uns erstmal nicht darum. ;-)

Die Erste Zeile sollte jedem Perl-Programmierer klar sein, in der Dritten Zeile wird das Modul LWP::UserAgent eingebunden das wie gesagt einen einfachen Browser simuliert. Schliesslich wird eine URL (Adresse eines Dokuments im WWW) festgelegt, diese Datei wollen wir später vom Server holen. In Zeile 7 starten wir dann einen neuen Agenten der für uns zuständig ist, eine zeile tiefer definieren wir einen HTTP-Request, wir benutzen die Optione "GET" was soviel heisst wie "holen" (also Datei vom Webserver HOLEN), eine andere Option waere HEAD, mehr dazu später. Schliesslich schicken wir die Anfrage (den Request) ins Weltweite Datennetz und lauschen einer Antwort von unserem Server. Zeile 10 gibt dann das Ergebnis unserer Aktion aus, im Normalfall also den HTML-Quellcode von http://www.yaos.de/home/.

Allerdings kann sowas auch jeder mit einem normalen Browser und der rechten Maustaste.

Quelltext anzeigen

#!/usr/bin/perl -w

use LWP::UserAgent;

$url = 'http://www.yaos.de/home/';

$agent = new LWP::UserAgent;
$request = HTTP::Request->new('HEAD',$url);
$result = $agent->request($request);
print $result->headers_as_string();

Zum voherigen Script sind nur ein paar Unterschiede zu bemerken. Diesmal verwenden wir die Option HEAD im Request, was soviel heisst wie das er uns nur die Info über sich seblst und die Datei geben soll. Das Ergebnis wird mit headers_as_string() ausgegeben.

Quelltext abspeichern

#!/usr/bin/perl -w

use LWP::UserAgent;

$url = 'http://www.perlunity.de/';
$agent = new LWP::UserAgent;
$request = HTTP::Request->new('GET',$url);
$result = $agent->request($request);
if (!$result->is_success()) {
print "Fehler Code: ".$result->code()."\n";
print $result->message()."\n";
exit 1;
}
$url =~ s/.*\///;
$url = 'index.html' if (!$url);
open(DEST_FILE, ">$url");
print DEST_FILE $result->content();
close(DEST_FILE);

Dieses Script hat schon eine Fehlererkennung in Zeile 8-12 und gibt das Ergebniss in einer Datei aus, Zeile 15,16 und 17. "if (!$result->is_success())" bedeutet das überprüft wird ob der Request erfolgreich war, das ! ist ein NOT, und sprachlich könnte man sagen: "Wenn verbindung NICHT erfolgreich tue dies&: das". In Zeile 13+14 wird dann der zukünftige Dateinamen generiert. Die Datei wird geöffnet und es wird der content() reingeschrieben.

Logs verwirren

Mit dem LWP Modul ist es ein leichtes eine eigenen Browserversion zu erstellen. Jeder herkömliche Browser hat eine Kennung in seinem Request-Header, das ermöglicht dem ambitioniertem Webmaster auf die Fehler&Probleme des meist genutzten Browsers einzugehen, ausserdem ist so ein bißchen Statistik schon interresant. Z.B. sendet der Internet Explorer "MSIE 5.5; Windows 98; Win 9x 4.90" als Kennung. Um es perfekt zu machen setzten wir noch einen neuen Referer. Der Referer ist eine Angabe im Request-Header der die URL der vorherigen Seite anzeigt (also von der, von der man kommt). Im nächsten Beispiel setzten wir einen eigenen Browser Typen und Referer und bringen den Webmaster damit ein bisschen ins Grübeln :-).

#!/usr/bin/perl -w

use LWP::UserAgent;

$url = 'http://www.perlunity.de/index.html';
$version = "Hallo WebMaster";
$referer = "http://www.yaos.de";
$agent->agent($version);
$agent->referer($referer);
$agent = new LWP::UserAgent;
$request = HTTP::Request->new('GET',$url);
$result = $agent->request($request);
print $result->content();

Zeile 6 und 7 sind bei diesem Beispiel neu hinzugekommen. In Zeile 6 setzten wir eine String-Variable die als String die Browserversion beinhaltet. In der nächste Zeile weissen wir dann dem Agenten diese Browser Version zu, so dass in dem nächsten Request diese Browser Version gesendet werden soll.

... noch viel Spass beim coden :-)).

 

Valid HTML 4.01! Valid CSS!