Moduł LWP

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa

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:

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 Matematyki - Zakład Informatyki - Strona domowa - Perl - Wyklady
[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.