• Publicidad

Código de respuesta

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

Código de respuesta

Notapor colorado » 2011-03-03 17:17 @762

Tengo el siguiente script:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open (URLS, 'urls3.txt');
  2. my @urls = <URLS>;
  3. chomp @urls;
  4. close(URLS);
  5.  
  6. open (PROXY, 'proxy.txt');
  7. my @proxy = <PROXY>;
  8. chomp @proxy;
  9. close(PROXY);
  10.  
  11. for (my $i = 0; $i < @urls; $i++) {
  12.  
  13. print $urls[$i],"::::"," PROXY: ",$proxy[$i],"\n";
  14.  
  15. my $ua = LWP::UserAgent->new;
  16.  
  17. $ua->proxy(['http', 'ftp'], "http://$proxy[$i]");
  18. $ua->agent("Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)");
  19. $ua->timeout(10);
  20.  
  21.  
  22. my $req = HTTP::Request->new(GET => $urls[$i]);
  23. $req->content_type('application/x-www-form-urlencoded');    
  24. my $response = $ua->request($req);
  25.  
  26.  
  27. $result = $response->code();
  28.  
  29.  
  30. open(ARCHIVO,">>libros.txt");
  31. binmode ARCHIVO;
  32. print ARCHIVO $result," ",$response->message( ),":::",$proxy[$i],":::::","\n",$response->content(),"\n","\n";
  33. close(ARCHIVO);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4



urls3.txt:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
http://sitio.com/archivo1.txt
http://sitio.com/archivo2.txt
http://sitio.com/archivo3.txt
http://sitio.com/archivo4.txt
.........
.......
......
...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo que necesito es descargar todos los archivos de urls3.txt, a través de proxies.

El problema son las respuestas del proxy:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
500 read timeout
500 Status read failed
.......
......
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo que quería es que el programa se atasque en las direcciones en las que, por ejemplo, me da un error 500, y hasta que no me dé una respuesta 200, vaya cambiando de proxy. Más o menos lo que necesito sería así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
http://sitio.com/archivo1.txt respuesta:200 proxy:1
http://sitio.com/archivo2.txt respuesta:200 proxy:2
http://sitio.com/archivo3.txt respuesta:200 proxy:3
http://sitio.com/archivo4.txt respuesta:500 proxy:4
http://sitio.com/archivo4.txt respuesta:500 proxy:5
http://sitio.com/archivo4.txt respuesta:500 proxy:6
http://sitio.com/archivo4.txt respuesta:200 proxy:7
http://sitio.com/archivo5.txt respuesta:200 proxy:8
http://sitio.com/archivo6.txt respuesta:200 proxy:9
...........
........
......
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Vaya lío XD Bueno, espero que se entienda.
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Publicidad

Re: Código de respuesta

Notapor pvaldes » 2011-03-04 04:34 @232

Podrías capturar el mensaje de error en una variable, tomar la primera cifra y entrar en un bucle while() que te cambie de proxy hasta que esa cifra sea inferior a 201 por ejemplo, en cuyo caso sale del bucle, algo tipo
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ($proxy){
    if my $respuesta[1] > 200 ...  next
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Te falta cerrar el bucle "for" por cierto
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Código de respuesta

Notapor colorado » 2011-03-04 17:28 @769

Gracias por la respuesta, pvaldes.

Pero no sé cómo adaptarlo y que funcione.

Mi idea es, si la respuesta es igual a 500, entonces retroceder en la lista de URL una posición.
De esta forma los proxies seguirían corriendo igual, y la URL que ha dado error 500 se volvería a repetir pero con el siguiente proxy de la lista.

Creo que sería algo así:

if($response->code == 500) {
$urls[$i] = $urls[$i -1]

pero no sé cómo adaptarlo.

He leído sobre redo. Quizás sea útil en este caso.

¿Puedes ayudarme?
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Re: Código de respuesta

Notapor pvaldes » 2011-03-04 18:21 @806

No acabo de entender bien el problema así que me resultaría complicado llegar a una estructura, de todos modos ¿por qué retroceder? puedes hacer que cada URL se pruebe sucesivamente con todos los proxies de la lista uno por uno hasta que encuentre uno que al aplicarlo sea igual a 200 y entonces salga del bucle (con last por ejemplo) o bien que se salte al siguiente si su valor es 500 con next por ejemplo, en cuyo caso llegas a lo mismo.

Lo primero que habría que saber es por dónde quieres cerrar el bucle for() para comprender qué es lo que hace realmente el bucle.

Es decir, esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for (my $i = 0; $i < @urls; $i++) {
  2.         ... contenido del bucle...
  3.         ... que tiene que acabar con...
  4.  
  5. }
  6. ... contenido fuera del bucle
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


analizando el código un poco:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. require LWP::UserAgent; #si no estuviera cargado aún
  2. require HTTP::Request;
  3.  
  4. my $ua = LWP::UserAgent->new;  #creamos el objeto
  5. $ua->proxy(['http', 'ftp'], "http://$proxy[$i]"); #esquemas para el proxy y dirección y puerto a utilizar
  6. $ua->agent("Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)"); #establecemos el identificador
  7. $ua->timeout(10); # y que corte si no hay actividad en 10 segundos ...
  8.  
  9. my $req = HTTP::Request->new(GET => $urls[$i]); #creamos la petición de una URL de la lista... ahá, ya veo, esto está aún dentro del bucle ¿no?
  10.  
  11. $req->content_type('application/x-www-form-urlencoded');    
  12. my $response = $ua->request($req); #y se la pasamos al objeto user_agent
  13. ...
  14. $result = $response->code(); #y aquí llega el código de 3 cifras que nos interesa
  15.  
  16.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


entonces, supongo que el nuevo bucle entraría aquí, evaluando el valor de $result como condición

la estructura podría ser algo similar a esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  
  2. for ("cada elemento de url"){
  3.      my $result = 0; #definimos result previamente...
  4.      while ($result!=200){
  5.      for ("cada elemento de proxies"){
  6.  ... ejecutamos el bucle que va a modificar el valor de result y nos va a decir cuanto vale, mientras se cumpla que el valor es distinto de 200 seguimos en el bucle para el elemento actual, cuando encontramos un 200 salimos y pasamos al URL siguiente
  7. ...
  8.     $result = $response->code();
  9.     }  #cerramos bucle for interno
  10.   } #cerramos bucle while
  11. }  #cerramos bucle for externo
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Código de respuesta

Notapor explorer » 2011-03-04 19:25 @850

Se podría usar una variable que fuese el índice del proxy a utilizar.

En caso de fallo, se incrementa el índice.

En caso de que al incrementarlo llegásemos al límite de proxies, se le pone a 0 (para que apunte al primero de la lísta).

Y se repite el bucle de intento.
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

Re: Código de respuesta

Notapor colorado » 2011-03-04 19:44 @864

Gracias de nuevo, pvaldes, por la respuesta.

El bucle se cierra en la línea 33.

last o next no me valen ya que salgo del bucle y el programa termina.

Quiero que se ejecute el bucle hasta que la última URL haya sido descargada.

Si retrocedo una URL en el bucle cuando hay un error 500, la URL volvería a cargarse con el siguiente proxy de la lista.

Si volviera a dar un error 500 pues volvería a intentarlo con la misma URL y el siguiente proxy,
hasta que encontrara un código 200. Entonces seguiría con la siguiente URL y el siguiente proxy.
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
http://sitio.com/archivo1.txt respuesta:200 proxy:1
http://sitio.com/archivo2.txt respuesta:200 proxy:2
http://sitio.com/archivo3.txt respuesta:200 proxy:3
http://sitio.com/archivo4.txt respuesta:500 proxy:4
http://sitio.com/archivo4.txt respuesta:500 proxy:5
http://sitio.com/archivo4.txt respuesta:500 proxy:6
http://sitio.com/archivo4.txt respuesta:200 proxy:7
http://sitio.com/archivo5.txt respuesta:200 proxy:8
http://sitio.com/archivo6.txt respuesta:200 proxy:9
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo complicado es cómo congelar la URL que me esta dando la respuesta errónea.
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Re: Código de respuesta

Notapor colorado » 2011-03-04 20:21 @889

Gracias, explorer.

Se podría usar una variable que fuese el índice del proxy a utilizar.

En caso de fallo, se incrementa el índice.


Eso es lo que quiero, pero en vez de con los proxies con las URL.

Y en caso de acierto, se incremente la URL.

Pero no sé cómo realizarlo.
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Re: Código de respuesta

Notapor explorer » 2011-03-05 06:22 @307

Pero si en el ejemplo que has puesto, estás incrementando tanto las URL como los proxy...
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

Re: Código de respuesta

Notapor colorado » 2011-03-05 09:09 @423

En el ejemplo de como quiero que quede, si te fijas, solo incremento las URL cuando obtengo un respuesta diferente a 500:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
http://sitio.com/archivo1.txt respuesta:200 proxy:1
http://sitio.com/archivo2.txt respuesta:200 proxy:2
http://sitio.com/archivo3.txt respuesta:200 proxy:3
http://sitio.com/archivo4.txt respuesta:500 proxy:4
http://sitio.com/archivo4.txt respuesta:500 proxy:5
http://sitio.com/archivo4.txt respuesta:500 proxy:6
http://sitio.com/archivo4.txt respuesta:200 proxy:7
http://sitio.com/archivo5.txt respuesta:200 proxy:8
http://sitio.com/archivo6.txt respuesta:200 proxy:9
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Y lo que necesito es incrementar el proxy siempre y la URL solo cuando el código es diferente a 500.

Debo de estar explicándome mal, así que lo intento de nuevo.

Lo que quiero es coger el proxy número 1, y
la URL número 1.

Si la respuesta es diferente a 500,
pasar al proxy 2, y a
la URL 2.

Si la respuesta es igual a 500,
coger el proxy 3
pero la URL 2

Si la respuesta es igual a 500:
coger el proxy 4
y la URL 2

Si la respuesta es diferente a 500:
coger el proxy 5
y la URL 3

etc.

Y que el bucle funcione así, por ejemplo:

(proxy 1) (URL 1) código de respuesta 200
(proxy 2) (URL 2) código de respuesta 200
obtenemos la primera respuesta 500

(proxy 3) (URL 3) código de respuesta 500
(proxy 4) (URL 3) código de respuesta 200
al encontrar la respuesta 200 sigue adelante el incremento de las URL

(proxy 5) (URL 4) código de respuesta 200
y así sucesivamente según el código de la respuesta

(proxy 6) (URL 5) código de respuesta 500
(proxy 7) (URL 5) código de respuesta 200
Última edición por explorer el 2011-03-05 10:29 @479, editado 2 veces en total
Razón: Tildes
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Re: Código de respuesta

Notapor colorado » 2011-03-05 10:19 @471

No vi tu modificado, pvaldes.
Gracias. entrenaré con tu estructura. En cuanto lo monte te cuento.
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Siguiente

Volver a Básico

¿Quién está conectado?

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