[PERL] Modul Http::Request

Pozdrav!

Trebam napraviti perl skriptu koja će se spajati na www.google.com. Argument komandne linije pri pokretanju skripte je riječ za pretraživanje google-a. E sad, nemam pojma raditi sa perl modulima (zapravo sa perlom uopće) pa bih molio nekakav hint-smjernicu.

Preko CPAN-a sam instalirao module Http::Request i Bundle::LWP ali neznam kako provjeriti da li sam ih uspješno instalirao.
Možda neki isječak koda od par linija sa printovima koji će provjeriti jel instalirano dobro ili ne?

Malo razmišljam i moj plan je da treba ovako nekako ići

  1. Poslat HTTP request (www.google.com, port 80)¸
  2. Primit HTTP response, u njemu dobiti html stranicu, i izparsirati rezultata koliko je potrebno

Pošto neznam kako to realizirati molio bih one koji imaju malo vremena da me upute. Na što jednostavniji način.

Thanx!

wget -O /tmp/google_result -U Mozilla [url=http://www.google.com/search?q=$upit]http://www.google.com/search?q=$upit[/url];
pa pročitaš /tmp/google_result (ono mozilla je zato što google zabranjuje wget)
ili možda ovako:
$stranica = lynx -dump [url=http://www.google.com/search?q=$upit]http://www.google.com/search?q=$upit[/url];

Inače kad odeš na stranicu modula
(npr. http://search.cpan.org/~gaas/libwww-perl-5.822/lib/HTTP/Request.pm - tražiš na http://search.cpan.org/)
imaš mali primjer - Synopsis. Možeš to isprobati da vidiš da li je modul ispravno instaliran.

Evo nije me bilo nekoliko dana pa nisam sudjelovao. Hvala Vedrane na pomoći.
No ja sam to išo rješit baš preko modula (LWP). Evo kod za skriptu koja dohvaća rezultate sa google-a:

#################################################################

[code]

Create a user agent object

use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$ua->agent(“Mozilla/5.0”); #koristiti UserAgent objekt jer google odbija upite perl skripti

my $request = new HTTP::Request GET => “http://www.google.com/search?q=$ARGV[0]”;
my $response = $ua->request($request);

#ako je uspio dohvatiti sadržaj sa google-a spremi ga u var. $content
if ($response->is_success)
{
$content= $result->content;
}
else
{
#ako nije, prekini izvodjenje
die “Could not get content”;
}

my @rezultati;
#regex koji izdvaja linkove sa stranice, tj. meča rezultate pretrage kako bi samo njih ispisao
while ($content =~ /

<a[^>]+href=["’ ](http:[^"’ ]+)["’ ][^>]*>/igs) {
push @rezultati, $1;
}

#ispis izparsiranih rezultata
my $zajedno = join("\n", @rezultati);
print $zajedno."\n";[/code]
##########################################################

A sad imam jedan drugi problemcic. Istu stvar trebam napraviti za http://www.hr gdje pretraživanje radi perl skripta. Ako se pogleda source kod stranice www.hr onda se može naći opis forme u koju se inače upisuje pojam. Analizom tog opisa vidljivo je da se atribut koji prenosi riječ za pretragu zove “srch”. Ali osim tog atributa ima još atributa koji se prenose ali su za korisnika hidden. Za http::Request treba koristit POST metodu pa bih molio ako možete pogledati dali je kod napisan ispravno i kako dodati u POST metodu ostale parametre.

C/P html opisa forme za unos pojma za pretragu:
[b]

[code]

    <img src="/images/Web-Search.jpg" width="45" height="31" align="middle" alt="Traži" />            
    </form>[/code]

[/b]
i kod moje skripte:

#############################################################

[code]

Create a user agent object

use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$ua->agent(“Mozilla/5.0”);

my $request = HTTP::Request->new (POST => ‘http://www.hr/’);
$request->content(‘srch=$ARGV[0]’);

print “\n\n\n\n”;
print “UPIT: $ARGV[0]”;
print “\n\n\n\n”;

print “SADRŽAJ:”;
print “\n\n\n\n”;

my @rezultati;
while ($content =~ /

<a[^>]+href=["’ ](http:[^"’ ]+)["’ ][^>]*>/igs) {
push @rezultati, $1;
}

my $zajedno = join("\n", @rezultati);
print $zajedno."\n";[/code]
##################################################################

sad ja samo prosljeđujem POST metodi atribut ‘srch’ što mi ne daje ispravan http::Response. Trebao bih i druge atribute valjda prenijeti. Jel se da kome isprobati ovaj kod i malo se igrat da mi pomogne?

Jesi li probao HTTP::Request::Common?
http://search.cpan.org/~gaas/libwww-perl-5.822/lib/HTTP/Request/Common.pm
Koliko vidim imaš još u formi polja lang=hr i Submit=Traži

Proučavam taj HTTP::Request::Common…
Zbunjuje me taj perl objective. Kako da krenem? Što trebam napraviti, tj. na koji način prenijeti sve argumente?
Može neki odsječak koda za primjer da shvatim. Nešto što bi svaka budala trebala shvatit :slight_smile: ?

use HTTP::Request::Common; $ua = LWP::UserAgent->new; my $response = $ua->request(POST 'http://www.hr/', [ srch => $ARGV[0], lang => "hr", submit => "Traži" ]); if ($response->is_success) { # Blahblah print $response->decoded_content; } else { die "Doslo je do greske: ".$response->status_line; }

Bok! Rvo opet me nije bilo neko vrijeme.

Dali tebi ovaj kod radi ispravno? Ja šta god napravim dobivam početnu stranicu. Gdje je bug?
Čitam na netu da većina CGI skripti vraća početnu stranicu ako nisu navedeni svi parametri POST metode ili su netočni.
Da li je to slučaj ovdje i kako to riješiti? Nikako ne uspijevam, a već je hitno.

E ne znam, nisam ni probao. Možda detektuje referer ili user agent, u svakom slučaju nemam baš vremena da oko toga eksperimentišem - do tebe je.