• Publicidad

Problema con LWP::Parallel

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema con LWP::Parallel

Notapor Zeokat » 2007-09-26 14:33 @648

He creado el siguiente código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use strict;
use HTTP::Request;
require LWP::Parallel::UserAgent;

my $pua = LWP::Parallel::UserAgent->new();
$pua->in_order  (1);  # handle requests in order of registration
$pua->duplicates(1);  # ignore duplicados
$pua->timeout   (100);  # segundos
$pua->redirect  (0);  # sigue las redirecciones
$pua->max_hosts(4); # maximo numero de hosts paralelos
$pua->max_req  (1); # maximo numero de requests paralelos


open (INDICE,"indice.txt");  #Abro el archivo que contiene las urls
my @reqs = <INDICE>;

foreach my $req (@reqs) {
    print "Registering '".$req->url."'\n";
    my $response = $pua->request($req);
    my $content = $response->content();
    print $response->code ,":" , $response->message,"\n";

}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4



El archivo indice.txt contiene:
Código: Seleccionar todo
HTTP::Request->new('GET', http://www.google.es)
HTTP::Request->new('GET', http://www.yahoo.es)
HTTP::Request->new('GET', http://www.msn.com)
HTTP::Request->new('GET', http://www.mtv.es)


El error que devuelve:
Código: Seleccionar todo
Can't use 'HTTP::Request->new('GET', http://www.google.es)' as an HTTP::Request
object. Ignoring at C:\Practicas Perl\Leecher\temp_recode.pl line 73
Can't call method "content" without a package or object reference at C:\Practica
s Perl\Leecher\temp_recode.pl line 74, <INDICE> line 4.


Sin embargo el siguiente ejemplo tomado de CPAN funciona perfectamente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
require LWP::Parallel::UserAgent;
use HTTP::Request;
# shortcut for demo URLs
my $url = "http://localhost/";

my $reqs = [  
   HTTP::Request->new('GET', $url),
   HTTP::Request->new('GET', $url."homes/marclang/"),
];

my $pua = LWP::Parallel::UserAgent->new();
$pua->in_order  (1);  # handle requests in order of registration
$pua->duplicates(0);  # ignore duplicates
$pua->timeout   (2);  # in seconds
$pua->redirect  (1);  # follow redirects

foreach my $req (@$reqs) {
  print "Registering '".$req->url."'\n";
  if ( my $res = $pua->register ($req) ) {
      print STDERR $res->error_as_HTML;
  }  
}
my $entries = $pua->wait();

foreach (keys %$entries) {
  my $res = $entries->{$_}->response;
  print "Answer for '",$res->request->url, "' was \t", $res->code,": ",
        $res->message,"\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Yo lo que intento es tomar de un txt los hosts, pero no sé por qué no funciona... ¿alguien se le ocurre algo?. Saludos.
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Publicidad

Notapor creating021 » 2007-09-26 16:34 @732

No funciona porque no estás creando "$req" como se debe:

No lo podés hacer como si fuera un texto, ya que no lo es (es una función de un módulo)

Mas bien pon los parámetros de HTTP::Request en indice.txt creas $req con un while.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2007-09-26 18:56 @830

Estás leyendo un fichero de texto. Lo que dice creating021 es cierto: no puedes pretender que ese texto se convierta en un objeto HTTP::Request real.

Una forma de hacerlo sería con un eval(), pero me parece complicarlo un poco...

Una solución sencilla sería:
* En el fichero de texto pon solo las URL
* Y en el programa, en el bucle foreach, al principio, haces un
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $peticion = HTTP::Request->new('GET', $req);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y usas $peticion en el resto del bucle, como un objeto -ahora sí, real- HTTP::Request.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Zeokat » 2007-09-27 07:32 @355

Sí, solucionado, con un foreach y escribiendo las urls en un txt.

Gracias. :)
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380

Notapor Zeokat » 2007-09-27 13:37 @609

Mmm.... la verdad esque no noto que tenga conexiones simultaneas con el LWP parallel, la velocidad sigue siendo la misma que usan el LWP normal...

el codigo se quedo asi:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use strict;
use HTTP::Request;
require LWP::Parallel::UserAgent;
my $pua = LWP::Parallel::UserAgent->new();

$pua->in_order  (1);  # handle requests in order of registration
$pua->duplicates(1);  # ignore duplicates
$pua->timeout   (100);  # in seconds
$pua->redirect  (0);  # follow redirects
$pua->max_hosts(8); # sets maximum number of locations accessed in parallel
$pua->max_req  (3); # sets maximum number of parallel requests per host

#Generating requests
open (INDICE,"indice.txt");  #Abro el archivo que contiene las urls
my @unique_urls = <INDICE>;
my @reqs;
foreach my $unique_url (@unique_urls)  {
    my $peticion = HTTP::Request->new(GET => "$unique_url");
    push (@reqs,$peticion);
}

#Downloading urls source code.
foreach my $req (@reqs) {
    print "Downloading: ".$req->url."  ";
    my $response = $pua->request($req);
    my $content = $response->content();
    print $response->code ,":" , $response->message,"\n";

    }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Aun modificando $pua->max_hosts(10); a un valor mas alto sigo sin notar aunemto de velocidad.... mmm.... no se que esta pasando.... alguna idea?
Zeokat
Perlero nuevo
Perlero nuevo
 
Mensajes: 125
Registrado: 2006-08-22 08:08 @380


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 9 invitados

cron