/ / ¿Cómo puedo usar LWP :: UserAgent de Perl para obtener la misma URL con diferentes cadenas de consulta? - Perl, bucles, lwp-useragent

¿Cómo puedo usar el LWP :: UserAgent de Perl para buscar la misma URL con diferentes cadenas de consulta? - perl, loops, lwp-useragent

Tengo un LWP :: UserAgent en ejecución que debería aplicarse en la siguiente URL:

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

Esto se ejecuta con muchos objetivos similares, ver los siguientes finales:

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

Quiero hacer esto con el uso de LWP :: UserAgent:

for my $i (0..10000)

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

En cualquier caso, utilizando un bucle como este para ese tipo.De trabajo es una forma de hacerlo. Supongo que la API de LWP no pretende reemplazar la funcionalidad del núcleo de Perl, y puedo usar los bucles de Perl para consultar varias URL.

El código que no se ejecuta porque el bucle debe aplicarse:

#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";
}

Actualización el domingo 25 de octubre: He aplicado el consejo de la entidad omnipotente.

#!/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";
}

Quiero hacer un bucle sobre los resultados y, por lo tanto, traté de aplicar las URL correspondientes, pero obtuve muchos errores:

suse-linux:/ usr / perl # perl perl_mecha_example_two.pl El símbolo global "$ pagecontent" requiere un nombre de paquete explícito en la línea 24 de perl_mecha_example_two.pl. El símbolo global "$ url" requiere un nombre de paquete explícito en la línea 29 de perl_mecha_example_two.pl. Ejecución de perl_mecha_example_two.pl abortada debido a errores de compilación (# 1) (F) Usted ha "dicho" usar estricto "o" usar vars estrictos ", que indica que todas las variables deben tener un ámbito léxico (usando "mi" o "estado"), declarado de antemano usando "nuestro", o explícitamente calificado para decir en qué paquete está la variable global (usando "::").  Excepción no detectada del código de usuario: El símbolo global "$ pagecontent" requiere un nombre de paquete explícito en la línea 24 de perl_mecha_example_two.pl. El símbolo global "$ url" requiere un nombre de paquete explícito en la línea 29 de perl_mecha_example_two.pl. Ejecución de perl_mecha_example_two.pl abortada debido a errores de compilación. en perl_mecha_example_two.pl línea 86

Ahora la parte de depuración. ¿Qué cambio? ¿Cómo aplicar las URL de la manera correcta?

Cuando utilizo el estricto, no puedo usar una variable antes de declararla. La solución habitual es anteponer my, p.ej. my $url y my $pagecontent En la primera aparición de la misma.

Respuestas

2 para la respuesta № 1

Es tan simple como:

#!/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
}

Esto es asumiendo que quieres obtener todos los 10000páginas Si solo desea obtener números particulares, debe intentar lanzar esos números en una matriz y luego tener que recorrer esa matriz, en lugar de 1..10000