• Publicidad

Acelerar la rotación de proxies

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Acelerar la rotación de proxies

Notapor Norther » 2007-07-24 13:54 @621

Buenas, hace unos días que empecé a mirar el Perl para unas aplicaciones que necesito y hasta ahora creo que conseguí lo que necesitaba, pero tengo un problema que destroza todo lo que hice; a ver si consigo explicarlo: este es un fragmento de un programa que hice que navega a través de proxies, una especie de navegador custom.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$ua = LWP::UserAgent->new;
$ua->agent("Mozilla");
$ua->cookie_jar($cookie_jar);
$ua->proxy('http', "http://$linea");
$ua->timeout(10);
$req = HTTP::Request->new (POST, $url);
$req->content_type("application/x-www-form-urlencoded");
$req->content($query);
push @{ $ua->requests_redirectable }, 'POST';
$res = $ua->request($req);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Funciona perfectamente, excepto por un detalle: cuando uno de los proxies en lista muere, o es extremadamente lento, el programa sigue esperando por el ilimitadamente. Lo que me gustaría saber es cómo hacer para que el programa espere por ejemplo 5 segundos por cada proxy y después cambie al siguiente independientemente de si obtiene respuesta o no. Probé a hacer una burrada que se me ocurrió: una variable tal que $tiempo = time() + 20; y meterle un while, pero no cuajo del todo y todo lo que leí por ahí va de timeout, pero en mi caso no funciona. Muchas gracias por cualquier ayuda que me ofrezcáis :)
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Publicidad

Notapor Norther » 2007-07-25 07:51 @368

A nadie se le ocurre nada? :shock:
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2007-07-25 08:18 @387

¿Has activado el modo debug para saber en qué parte queda? Dices que el timeout no te funciona. Sería interesante saber por qué. ¿En qué sistema operativo estás?

Una posibilidad de arreglo sería usar la función alarm().
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 Norther » 2007-07-25 08:49 @409

Muchas gracias por la contestación :) La verdad es que es casualidad pero ahora mismo estaba probando con la función alarm, pero tengo un problema: este fragmento incluye la parte donde rota los proxies, el for, y si utilizo el alarm() tal que así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for($linea=0; $linea=<DATA>; $linea++) {
chop($linea);
print "Using Proxy: $linea \r\n";
my $url='http://www.xxx.com/in.php';
my $query='site=1132206410x';
$ua = LWP::UserAgent->new;
$ua->agent("Mozilla 7.0");
$ua->cookie_jar($cookie_jar);
$ua->proxy('http', "http://$linea");
$req = HTTP::Request->new (POST, $url);
$req->header('Referer', 'http://www.xxx.net');
$req->content_type("application/x-www-form-urlencoded");
$req->content($query);
push @{ $ua->requests_redirectable }, 'POST';
alarm(6);
$res = $ua->request($req);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Efectivamente espera los 6 segundos y después se detiene, pero se detiene literalmente, quiero decir detiene el script, luego hice algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
comienzo:
for($linea=0; $linea=<DATA>; $linea++) {
chop($linea);
print "Using Proxy: $linea \r\n";
my $url='http://www.xxx/in.php';
my $query='site=1132206410x';
$ua = LWP::UserAgent->new;
$ua->agent("Mozilla 7.0");
$ua->cookie_jar($cookie_jar);
$ua->proxy('http', "http://$linea");
$req = HTTP::Request->new (POST, $url);
$req->header('Referer', 'http://www.xxx.net');
$req->content_type("application/x-www-form-urlencoded");
$req->content($query);
push @{ $ua->requests_redirectable }, 'POST';
$tiempo=time() + 6;
while(time() < $tiempo) {
$res = $ua->request($req);
}
goto comienzo
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero al hacer esto (utilizar un goto) el for se pierde y comienza de nuevo, cogiendo una vez mas el proxy de la primera línea en vez de cambiar al siguiente... realmente lo que necesito es que funcione el $ua->timeout(6); pero no alcanzo a comprender por qué no funciona. Estoy en Windows SP 2. Gracias de veras, por la ayuda porque mientras siga atascado con esto no puedo continuar con lo demás :S
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2007-07-25 09:28 @436

Fíjate por favor en el ejemplo que aparece en la página de información de alarm();

* Primero redefinen $SIG{ALRM} a una subrutina, que es realmente la que hace morir el programa, pero tu ahí podrías simplemente poner un print para sacar un texto, y nada más. El programa seguiría.
* Luego, definen el tiempo de timeout de alarm.
* Después, la instrucción o instrucciones problemáticas que deben resolverse en ese tiempo.
* Y finalmente, un alarm(0), para desactivar el timeout.

El ponerlo dentro de un eval() es sólo necesario si quieres controlar la llamada a una función del sistema.

Yo activaría el modo debug/trace del $ua, de todas formas, para tener más pistas de qué es lo que está pasando. Es muy raro que el timeout no funcione.
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 Norther » 2007-07-25 09:31 @438

Sonara estúpido pero... ¿cómo activo el modo debug? :$ por cierto, el problema ya es seguro, está en $res = $ua->request($req);. En el momento en que llega ahí y hace el request, si el proxy tarda en contestarle, ¡a veces no funciona ni el alarm()! Sencillamente es como si se bloquease hasta obtener respuesta del proxy al que quiere conectarse para posteriormente acceder a ese formulario.
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2007-07-25 09:50 @451

Me parece que se puede realizar todo el trabajo con sólo el objeto LWP::UserAgent...
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 Norther » 2007-07-25 09:52 @452

No entiendo lo que quieres decir, ya estoy usando LWP::UserAgent O_o
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2007-07-25 10:12 @467

Quiero decir que 'quizás' te puedes ahorrar el crear un objeto HTTP::Request. No lo sé, pero mirando la documentación, sí que parece que se puede hacer todo con el mismo objeto.

Y si alarm() no vuelve... oye... ¿no estarás en Windows?
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 Norther » 2007-07-25 10:17 @470

jaja siiiiii te lo dije en un post anterior :P Windows SP2, casi prefiero que me digas que ni el timeout ni el alarm funcionan por eso, por que ya no se que hacer, pero tambien espero que haya solucion :S me parece increible que me resulte tan dificil, si no imposible tan solo hacer que rote de proxies mas rapido xd y mas cuando se podria hacer con un simple $ua->timeout(5); :S
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Siguiente

Volver a Intermedio

¿Quién está conectado?

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