Moduł LWP
Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowaSpis treści
Moduł LWP - Library for WWW in Perl
Wstęp
LWP (skrót od "Library for WWW in Perl") jest popularnym modułem Perla, który pozwala na pobieranie danych z sieci. Jak większość modułów Perla, każdy z jego komponentów posiada dokumentację w pełni opisującą ich interfejs. Postaram się przybliżyć jedynie te najprostsze i najczęściej używane funkcje modułu LWP, które mogą przydać się na codzień podczas pisania skryptów w Perlu wykorzystujących do swego działania pobrane z WWW dane.
Pobieranie dokumentów przy pomocy LWP::Simple
Jeśli chcemy jedynie pobrać zawartość dostępną pod konkretnym URL'em, najprościej będzie wykorzystać moduł LWP::Simple.
W skrypcie Perlowym można skorzystać z funkcji get($url). Nastąpi wtedy pobranie zawartości URL'a. Jeśli zadziała, funkcja zwróci pożądaną zawartość, w przeciwnym wypadku zwróci wartość undef.
my $url = 'http://http://piotao.math.univ.gda.pl/Perl/';
use LWP::Simple;
my $content = get $url;
die "Nie mogłem pobrać $url" unless defined $content;
if($content =~ /perl/i) {
print "Tak, to na pewno właściwa strona ;)\n";
}
else {
print "Coś tu nie gra.\n";
}
Najprostszym sposobem na wypisanie zawartości danego URL'a na STDOUT przy pomocy modułu LWP::Simple w tak zwanym jednolinijkowcu, jest skorzystanie z funkcji getprint:
% perl -MLWP::Simple -e "getprint 'http://cpan.org/RECENT'"
Jest jeszcze wiele innych użytecznych funkcji w LWP::Simple, właczając w to funkcję wysyłającą zapytanie typu HEAD dla podanego URL'a, dwie funkcje do zapisywania i tworzenia tak zwanych 'mirrorów' w pliku lokalnym. Więcej można przeczytać w dokumentacji LWP::Simple.
Podstawy dotyczące klasy LWP
Funkcje LWP::Simple są poręczne w prostych sytuacjach dzięki ich prostocie, jednakże nie obsługują one tak zwanych ciasteczek czy autoryzacji. Nie pozwalają także na ustawienie nagłówków dla zapytań HTTP (requests) i ogólnie nie wspierają czytania nagłówków dla odpowiedzi HTTP (response). Możliwości te daje pełny model klasowy LWP.
Podczas gdy LWP składa się z dziesiątek klas, tak naprawdę do naszych najprostszych zastosowań wystarczą jedynie dwie: LWP::UserAgent i LWP::Response. LWP::UserAgent jest klasą tak zwanej wirtualnej przeglądarki, którą będziemy używać do wykonywania zapytań, natomiast HTTP::Response jest klasą umożliwiającą uzyskiwanie odpowiedzi (lub informacji o błędach) na wysłane przez nas wcześniej zapytania.
Przykład:
use LWP;
my $browser = LWP::UserAgent->new;
my $url = 'http://http://piotao.math.univ.gda.pl/Perl/';
my $response = $browser->get($url);
die("Nie mogę pobrać $url -- "),$response->status_line
unless $response->is_success;
die("Błąd: oczekiwałem HTML'a, nie ",$response->content_type
unless $response->content_type eq 'text/html';
if($response->content =~ /perl/i) {
print "Tak, to na pewno właściwa strona ;)\n";
}
else {
print "Coś tu nie gra.\n";
}
Tak więc mamy tutaj dwa obiekty: $browser, który zawiera obiekt klasy LWP::UserAgent i $response, który jest obiektem klasy HTTP::Response. Tak naprawdę wystarczy nam tylko jeden obiekt browser, ale za każdym razem kiedy wysyłamy przy jego pomocy zapytanie, tworzony jest w odpowiedzi nowy obiekt HTTP::Response, który będzie zawierał kilka interesujących atrybutów takich jak:
- Kod statusu mówiący o tym, czy wysłanie zapytania zakończyło się sukcesem lub porażką: $response->is_success.
- Linia statusu HTTP, która może zwrócić na przykład łańcuch "404 Not Found": $response->status_line.
- Typ MIME taki jak "text/html", "image/gif", "application/xml" i inne, które sprawdzić możemy pod: $response->content_type.
- Całkowita zawartość odpowiedzi na zapytanie typu HTTP. Jeśli zwrócony zostanie dokument HTML, zawartością będzie jego źródło: $response->content.
Cookies
Domyślnie obiekt LWP::UserAgent działa jak przeglądarka z wyłaczoną opcją cookies. Jednakże istnieje wiele możliwości, aby tą opcję włączyć ustawiając atrybut cookie_jar. Jest to obiekt, reprezentujący małą bazę wszystkich cookies, o których istnieniu może wiedzieć nasza przeglądarka. Może się odnosić zarówno do pliku na dysku, jak i pozostać jedynie obiektem w pamięci, który jest pusty na początku, i którego kolekcja cookies zniknie tuż po tym, jak program zakończy swoje działanie.
Aby włączyć w naszej przeglądarce pusty cookie jar, musimy ustawić atrybut cookie_jar w następujący sposób:
$browser->cookie_jar({});
Jeśli chcemy odczytać nasz cookie jar z pliku, a następnie zapisać wszelkie jego zmiany po tym, jak nasz program zakończy swoje działanie, ustawiamy atrybut cookie_jar jak poniżej:
use HTTP::Cookies;
$browser->cookie_jar( HTTP::Cookies->new(
'file' => 'cookies.lwp',
'autosave' => 1,
));
Przesyłanie danych formularza metodą POST
Wiele HTML'owych formularzy przesyła dane do ich serwera używając zapytania HTTP POST, które można wysłać korzystając z poniższej składni:
$response = $browser->post( $url,
[
key1 => val1,
key2 => val2,
...
],
);
Przykładowo, poniższy kod wysyła zapytanie do wyszukiwarki (wysyłając kilka wartości pól formularza metodą POST), a nastepnie analizując odpowiedź ze strony serwera, podaje ile wyników wyszukiwania zostało zwróconych:
use strict;
use warnings;
use LWP;
my $browser = LWP::UserAgent->new;
my $word = 'perl';
my $url = 'http://www.wyszukiwarka.com/search.php';
my $response = $browser->post( $url,
[ 'query' => $word,
'search => 1,
]
);
die "$url error: ", $response->status_line unless $response->is_success;
die "Niespodziewana zawartość w $url -- ", $response->content_type
unless $response->content_type eq 'text/html';
if( $response->content =~ /znaleziono ([0-9,]+)/ ) {
print "$word: $1\n";
}
Dokumentacja
To jedynie kilka podstawowych zagadnień dotyczących bardzo rozbudowanego i szerokiego w swych zastosowaniach modułu LWP. Jednakże znając te podstawy można już napisać wiele bardzo rozbudowanych i przydatnych skrytpów pobierających i parsujących dane z wybranych stron internetowych w celu ich dalszego przetworzenia. Pozostałe informacje i szczegóły dotyczące modułu LWP można znaleźć na stronie http://search.cpan.org/~gaas/libwww-perl/lib/LWP.pm.
Autor
D.P.
Uniwersytet Gdański - Instytut Informatyki - Strona domowa - Perl - Wyklady