jimr1984 escribiste:Para poder reproducir lo que ud. hizo, tengo que hacer las mismas modificaciones. En tal caso, ¿en el archivo ".pm" de HTTP::ProxySelector?
No tienes que modificar nada si cuentas con una lista de
proxies que realmente funcionen.
jimr1984 escribiste:¿Y qué modificaciones debería realizar?
Abrir el archivo ProxySelector.pm y cambiar la línea 59 como se ha indicado antes.
jimr1984 escribiste:Me conseguí una lista de proxies ya testados,
los guardé en un arreglo, un total de 30 proxies:
$link = "http://www.google.com.bo";
my @listado_proxy = ("192.152.52.2:80","xxxx","yyyy","zzzzz","ect");
my $rmd = int(rand(30));
my $ua = LWP::UserAgent->new;
$ua->proxy('http','http://'.$listado_proxy[$rmd]);
$ua->agent("aqui detallo el agente ");
my $req = HTTP::Request->new(GET => $link);
...
...
..
print $response->code(); # 200 o 440 o 500
Hasta aquí, todo bien. El problema está en que a veces se conecta con un proxy QUE YA NO ESTÁ ACTIVO.
Todas esas líneas es lo que hace internamente HTTP::ProxySelector: de un URL se baja una lista de
proxies. Luego intentará el número de veces indicado elegir uno de ellos al azar y ver si a través de él se puede conectar al sitio de prueba. Si puede hacerlo, saldrá inmediatamente porque habrá encontrado uno que funciona.
El problema es que los
proxies listados devuelven éxito al módulo, pero cuando le vas a solicitar que te traiga una determinada página, pues no lo hacen.
Lo más probable es que los sitios web destino estén bloqueando el acceso de esos
proxies. Yo, desde luego, lo haría (no me gustaría que accedieran a los sitios web de mis clientes de forma anónima).
En el ejemplo de prueba, se intenta bajar la página oficial de yahoo.com. Lo he intentado más de 20 veces, y sólo ha funcionado 2.
jimr1984 escribiste:¿Cómo puedo hacer para que salte a otro proxy automáticamente? ¿Ud. utilizó un timeout? ¿Me podría explicar un poco más sobre ello?
HTTP::ProxySelector hace justamente eso: salta al siguiente
proxy si no obtuvo respuesta. El problema es lo comentado antes: que luego no funcionan bien.
El
timeout es una de las opciones que se pasan a LWP::UserAgent para decirle el máximo de tiempo que deben durar los intentos de conexión. Eso incluye las pruebas de conexión de HTTP::ProxySelector, ya que utiliza el objeto LWP::UserAgent creado en el programa ($ua).
La posible solución sería meter el programa dentro de otro bucle que obligase a escoger otro
proxy si el seleccionado por HTTP::ProxySelector no funciona bien (la función get() de LWP::UserAgent no devuelve éxito).
Te aconsejo que estudies el código de HTTP::ProxySelector. No es muy largo, y se entiende bien. Ahí puedes ver cómo usa eval() para capturar los errores de conexión y probar el siguiente
proxy.
Esto, de todas maneras, no garantiza que funcione con la web que quieres obtener. Muchas webs cuentan con sistemas de protección para este tipo de accesos.