/ / Jak mogę użyć LWP :: UserAgent Perla do pobrania tego samego adresu URL z różnymi ciągami zapytań? - perl, loops, lwp-useragent

Jak mogę użyć LWP :: UserAgent Perla do pobrania tego samego adresu URL z różnymi ciągami zapytań? - perl, loops, lwp-useragent

Mam działającą LWP :: UserAgent, którą należy zastosować pod następującym adresem URL:

http://dms-schule.bildung.hessen.de/suchen/suche_schul_db.html?show_school=5503

To działa z wieloma wieloma podobnymi obiektami docelowymi, zobacz następujące zakończenia:

html?show_school=5503
html?show_school=9002
html?show_school=5512

Chcę to zrobić przy użyciu LWP :: UserAgent:

for my $i (0..10000)

{ $ua->get(" [here the URL should be applied] ", id => 21, extern_uid => $i);
# process reply }

W każdym razie, używając takiej pętli dla tego rodzajupracy to sposób na zrobienie tego. Domyślam się, że API LWP nie ma na celu zastąpienia funkcjonalności rdzeniowego Perla i mogę używać pętli Perla do wysyłania zapytań do wielu adresów URL.

Kod, który nie działa, ponieważ pętla musi zostać zastosowana:

#use strict;

use DBI;
use LWP::UserAgent;
use HTTP::Request::Common;
use HTML::TreeBuilder::XPath;

# first get a list of all schools
my ($url = "[here the url should be applied] =",id);

for my $id (0..10000) {
$ua->get(" [here the url should be applied ] ", id => 21, extern_uid => $i);
# process reply
}

#my $request = POST $url,
#                 [
#         Schulsuche=> "Ergebnisse anzeigen",
#         order => "schule_ort",
#         schulname => undef,
#         schulort => undef,
#         typid => "11",
#         verbinder => "AND"
#                 ];

my $ua = LWP::UserAgent->new;
print "getting all schools - this could take some timen";
my $response = $ua->request($request);

# extract the ids
my @ids = $response->content =~ /getSchoolDetail((d+)/gs;
print "found " . scalar @ids . " schoolsn";

# for this demo we only do the first 5
my @ids_to_do = @ids[0..4];

# use your own user and password
my $dbh = DBI->connect("DBI:mysql:database=schulen", "user", "pass", { AutoCommit => 0 }) or die $!;

my $sth = $dbh->prepare(<<sqlend);
insert into schulen ( name , plz , ort, strasse , tel, fax , mail, quelle , original_id )
values  ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
sqlend

# now loop over ids
for my $id (@ids_to_do) {

# get detail information for id
my $res = $ua->get("[url]=> &gid=$id");

# parse the response
my $tree = HTML::TreeBuilder::XPath->new;
$tree->parse($res->content);

my $xpath = q|//div[@id="MCinhview"]//div[@class="contentitem"]//table|;
my ($adress_table, $tel_table) = $tree->findnodes($xpath);

my ($adr) = $adress_table->find("td");
my ($name, $city, $street) = map { s/^s*//; s/s*$//; $_ } ($adr->content_list)[2,4,6];

my($plz, $ort) = $city =~ /^(d+)s*(.*)/;
my ($tel, $fax, $mail) = map { s/^s*//; s/s*$//; $_ } map { ($_->content_list)[1] } $tel_table->find("td");

$sth->execute($name, $plz, $ort, $street, $tel, $fax, $mail, "SA", $id);
$dbh->commit;

$tree->delete;

print "$name donen";
}

aktualizacja w niedzielę, 25 października: Zastosowałem się do porady z OmnipotentEntity.

#!/usr/bin/perl -W

use strict;
use warnings;         # give out some warnings if something does not run well
use diagnostics;      # tell me when something is wrong
use DBI;
use LWP::UserAgent;
use HTTP::Request::Common;
use HTML::TreeBuilder::XPath;

# first get a list of all schools

my $ua = LWP::UserAgent->new;

$ua->agent("Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7");

#pretending to be firefox on linux.

for my $i (0..10000) {
my $request = HTTP::Request->new(GET => sprintf(" here to put the URL into =%d", $i));
$request->header("Accept" => "text/html");
my $response = $ua->request($request);
if ($response->is_success) {
$pagecontent = $response -> content;
}
# now we can do whatever with the $pagecontent

}
my $request = POST $url,
[
order => "schule_ort",
schulname => undef,
Basisdaten => undef,
Profil  => undef,
Schulort => undef,
typid => "11",
Fax  =>
Homepage  => undef,
verbinder => "AND"

];

print "getting all schools - this could take some timen";
my $response = $ua->request($request);

# extract the ids
my @ids = $response->content =~ /getSchoolDetail((d+)/gs;
print "found " . scalar @ids . " schoolsn";

# for this demo we only do the first 5
my @ids_to_do = @ids[0..4];

# use your own user and password
my $dbh = DBI->connect("DBI:mysql:database=schulen", "user", "pass", { AutoCommit => 0 }) or die $!;

my $sth = $dbh->prepare(<<sqlend);
insert into schulen ( name , plz , ort, strasse , tel, fax , mail, quelle , original_id )
values  ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
sqlend

# now loop over ids
for my $id (@ids_to_do) {

# get detail information for id
my $res = $ua->get(" here to put the URL into => &gid=$id");

# parse the response
my $tree = HTML::TreeBuilder::XPath->new;
$tree->parse($res->content);

my $xpath = q|//div[@id="MCinhview"]//div[@class="floatbox"]//table|;
my ($adress_table, $tel_table) = $tree->findnodes($xpath);

my ($adr) = $adress_table->find("td");
my ($name, $city, $street) = map { s/^s*//; s/s*$//; $_ } ($adr->content_list)[2,4,6];

my($plz, $ort) = $city =~ /^(d+)s*(.*)/;
my ($tel, $fax, $mail) = map { s/^s*//; s/s*$//; $_ } map { ($_->content_list)[1] } $tel_table->find("td");

$sth->execute($name, $plz, $ort, $street, $tel, $fax, $mail, "SA", $id);
$dbh->commit;

$tree->delete;

print "$name donen";
}

Chcę zapętlić wyniki, dlatego próbuję zastosować odpowiednie adresy URL, ale mam kilka błędów:

suse-linux:/ usr / perl # perl perl_mecha_example_two.pl Globalny symbol "$ pagecontent" wymaga jawnej nazwy pakietu w linii perl_mecha_example_two.pl 24. Globalny symbol "$ url" wymaga jawnej nazwy pakietu w linii 29 perl_mecha_example_two.pl. Wykonanie perl_mecha_example_two.pl przerwane z powodu błędów kompilacji (nr 1) (F) Powiedziałeś "użyj ścisłego" lub "używaj ścisłych vars", co oznacza że wszystkie zmienne muszą mieć zakres leksykalny (używając "moje" lub "państwo"), zadeklarowane wcześniej przy użyciu "nasze" lub wyraźnie zakwalifikowane do powiedzenia który pakiet zawiera zmienną globalną (używając "::").  Niezatłoczony wyjątek od kodu użytkownika: Globalny symbol "$ pagecontent" wymaga jawnej nazwy pakietu w linii perl_mecha_example_two.pl 24. Globalny symbol "$ url" wymaga jawnej nazwy pakietu w linii 29 perl_mecha_example_two.pl. Wykonanie perl_mecha_example_two.pl zostało przerwane z powodu błędów kompilacji. w linii perl_mecha_example_two.pl 86

Teraz część do debugowania. Co mam zmienić? Jak zastosować adresy URL we właściwy sposób?

Kiedy używam stricta, nie mogę używać zmiennej przed jej zadeklarowaniem my, np. my $url i my $pagecontent przy pierwszym jej pojawieniu się.

Odpowiedzi:

2 dla odpowiedzi № 1

To jest tak proste, jak:

#!/usr/bin/perl -W

use LWP::UserAgent;

my $ua = LWP::UserAgent->new;
$ua->agent("Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7"); #pretending to be firefox on linux.
for my $i (0..10000) {
my $req = HTTP::Request->new(GET => sprintf("http://path/to/url?=%d", $i));
$req->header("Accept" => "text/html");
my $res = $ua->request($req);
if ($res->is_success) {
$pagecontent = $res -> content;
}
# Do whatever with the $pagecontent
}

Zakłada to, że chcesz pobrać wszystkie 10000strony. Jeśli chcesz tylko pobrać określone, wtedy powinieneś spróbować rzucić te liczby w tablicę, a następnie mieć na spacer tę tablicę zamiast 1..10000