Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] ¿Excepción de redireccionamiento???

Estas en el tema de ¿Excepción de redireccionamiento??? en el foro de Python en Foros del Web. Hola. Estoy probando un programa en Python para abrir un archivo desde una URL determinada. En principio podría ser así: Código: import urllib2 from urllib2 ...
  #1 (permalink)  
Antiguo 28/03/2013, 06:31
Avatar de MA40  
Fecha de Ingreso: septiembre-2004
Mensajes: 23
Antigüedad: 17 años
Puntos: 1
¿Excepción de redireccionamiento???

Hola.

Estoy probando un programa en Python para abrir un archivo desde una URL determinada.

En principio podría ser así:

Código:
import urllib2
from urllib2 import HTTPError, URLError

try:
     archivo = urllib2.urlopen("http://kkk")
except (HTTPError, URLError):
     print """ERROR"""
else:
     print """CORRECTO"""
El problema es el siguiente: Cuando se intenta abrir un archivo en una dirección que no existe, el programa imprime el texto ERROR; pero si se pone una dirección de una página inexistente pero que está en un dominio que en lugar de devolver el error 404 devuelve una página personalizada de error (error 404 redireccionado), el programa imprime CORRECTO.

¿Cómo se puede solucionar este problema?

Gracias de antemano.
  #2 (permalink)  
Antiguo 28/03/2013, 06:48
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 9 años, 3 meses
Puntos: 127
Respuesta: ¿Excepción de redireccionamiento???

El programa sólo devolverá ERROR si existe un código de error en la respuesta HTTP.

Si la respuesta es de un supuesto error y el código es 200 python interpretará como que todo está bien, porque de hecho está bien.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor
  #3 (permalink)  
Antiguo 28/03/2013, 06:56
Avatar de MA40  
Fecha de Ingreso: septiembre-2004
Mensajes: 23
Antigüedad: 17 años
Puntos: 1
Respuesta: ¿Excepción de redireccionamiento???

Cita:
Iniciado por dontexplain Ver Mensaje
El programa sólo devolverá ERROR si existe un código de error en la respuesta HTTP.

Si la respuesta es de un supuesto error y el código es 200 python interpretará como que todo está bien, porque de hecho está bien.
Gracias.

¿Y cómo se podría hacer para que al intentar abrir un archivo que no existe en un dominio que tiene el error 404 redireccionado a una página personalizada imprimiera el mensaje ERROR?

Saludos.
  #4 (permalink)  
Antiguo 28/03/2013, 06:58
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 9 años, 3 meses
Puntos: 127
Respuesta: ¿Excepción de redireccionamiento???

Con error 404 redireccionado a qué te refieres, ¿a que el código de la respuesta es 301 y redirecciona a un 404?

En ese caso tendrías que usar un httpredirecthandler.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor
  #5 (permalink)  
Antiguo 28/03/2013, 10:15
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 16 años, 6 meses
Puntos: 1360
Respuesta: ¿Excepción de redireccionamiento???

¿Puedes poner una url que reproduzca el problema?
  #6 (permalink)  
Antiguo 28/03/2013, 11:18
Avatar de MA40  
Fecha de Ingreso: septiembre-2004
Mensajes: 23
Antigüedad: 17 años
Puntos: 1
Respuesta: ¿Excepción de redireccionamiento???

Sí, claro.

Por ejemplo, si cargamos el archivo http://ma40.zxq.net/reti.txt

Mediante el código:

Código:
import urllib2
from urllib2 import HTTPError, URLError

try:
     archivo = urllib2.urlopen("http://ma40.zxq.net/reti.txt")
except (HTTPError, URLError):
     print """ERROR"""
else:
     print """CORRECTO"""
El programa imprime CORRECTO, porque el archivo realmente existe.

Pero ahora intentamos cargar el archivo http://ma40.zxq.net/inexistente.txt , el cual no existe.

Mediante el código:

Código:
import urllib2
from urllib2 import HTTPError, URLError

try:
     archivo = urllib2.urlopen("http://ma40.zxq.net/inexistente.txt")
except (HTTPError, URLError):
     print """ERROR"""
else:
     print """CORRECTO"""
Lo deseable en este caso sería que el programa imprimiera ERROR ya que el archivo no existe, sin embargo, como esa dirección devuelve una página personalizada de error 404, el programa imprime CORRECTO.

Por ejemplo con esta otra dirección, esto no pasa: http://www.edicionesma40.com/inexistente.txt

El código en este caso sería:

Código:
import urllib2
from urllib2 import HTTPError, URLError

try:
     archivo = urllib2.urlopen("http://www.edicionesma40.com/inexistente.txt")
except (HTTPError, URLError):
     print """ERROR"""
else:
     print """CORRECTO"""
En este último caso, el programa sí que imprime ERROR, eso es porque esa dirección no tiene configurada ninguna página de error 404.

Lo que yo quisiera saber es cómo debe ser el código para que en el 2º caso, el programa imprima ERROR.
Por favor, mis conocimientos son limitados.

Muchas gracias.
  #7 (permalink)  
Antiguo 28/03/2013, 11:36
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 9 años, 3 meses
Puntos: 127
Respuesta: ¿Excepción de redireccionamiento???

No puede imprimir error porque como dije en el primer mensaje, no es un error.



Los códigos son 302, 301 y 304.

Lo que puedes hacer es adaptarlo exclusivamente para que en caso de código 302.

Código Python:
Ver original
  1. try:
  2. archivo = urllib2.urlopen("http://www.edicionesma40.com/inexistente.txt")
  3. except (...):
  4. ...
  5. else:
  6.     if archivo.getcode() in [301,302,304]:
  7.         print "error"
  8.     else:
  9.         print "ok"

De todas formas con urllib2 no tienes demasiado control sobre la respuesta y no sé si sigue el redireccionamiento o si no lo sigue. Lo suyo sería que usaras socket.

Deberías no obstante mirar lo que te dije, HTTPRedirectHandler, que permite manejar esas redirecciones.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Última edición por dontexplain; 28/03/2013 a las 12:01
  #8 (permalink)  
Antiguo 28/03/2013, 12:39
Avatar de MA40  
Fecha de Ingreso: septiembre-2004
Mensajes: 23
Antigüedad: 17 años
Puntos: 1
Respuesta: ¿Excepción de redireccionamiento???

Hola.

Disculpa mi torpeza dontexplain pero he probado el siguiente código y el resultado es el mismo.

Código:
import urllib2
from urllib2 import HTTPError, URLError

try:
	archivo = urllib2.urlopen("http://ma40.zxq.net/inexistente.txt")
except (HTTPError, URLError):
	print """ERROR"""
else:
	if archivo.getcode() in [301,302,304]:
		print "error"
	else:
		print "ok"
Un saludo.
  #9 (permalink)  
Antiguo 28/03/2013, 13:39
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 16 años, 6 meses
Puntos: 1360
Respuesta: ¿Excepción de redireccionamiento???

Primero que nada te recomiendo usar requests.

Lo que pasa es lo siguiente:

El caso normal seria configurar el servidor web para que te arroje error 404 y una pagina personalizada.

Lamentablemente no toda la gente lo hace de esta manera entonces lo que hace es lo siguiente:
El usuario intenta acceder a una url que no existe, el servidor web detecta que no existe tal url y redirecciona a una pagina de error personalizada. El navegador web nunca supo que tal url no existía.

Para este tipo de casos un bot como este es prácticamente imposible detectar si la url existe o no.

Y si te pones a pensar es "normal" para una web que guarda archivos hacer esto, por que si no seria muy fácil un bot que detectara urls validas.

Aquí un ejemplo que funciona solamente para el dominio ma40.zxq.net y edicionesma40.com

Código Python:
Ver original
  1. import requests
  2.  
  3. url = "http://www.edicionesma40.com/inexistente.txt"
  4. r = requests.get(url)
  5. if r.status_code == 200 and r.url == url:
  6.     print "OK"
  7. else:
  8.     print "ERROR"
  #10 (permalink)  
Antiguo 28/03/2013, 15:13
Avatar de MA40  
Fecha de Ingreso: septiembre-2004
Mensajes: 23
Antigüedad: 17 años
Puntos: 1
Respuesta: ¿Excepción de redireccionamiento???

Muchas gracias razpeitia.

El problema que tengo ahora es que el módulo requests no está incluido en la librería estándar de Python y ese paquete no lo tiene instalado el servidor con el que trabajo, sólo tiene la librería estándar. No he podido probar tu código.

No sé si podrá haber una solución con la librería estándar.

Saludos.
  #11 (permalink)  
Antiguo 29/03/2013, 00:21
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 16 años, 6 meses
Puntos: 1360
Respuesta: ¿Excepción de redireccionamiento???

Código Python:
Ver original
  1. import urllib2
  2. from urllib2 import HTTPError, URLError
  3.  
  4. url = "http://ma40.zxq.net/inexistente.txt"
  5. try:
  6.     archivo = urllib2.urlopen(url)
  7. except (HTTPError, URLError):
  8.     print """ERROR"""
  9. else:
  10.     if archivo.getcode() == 200 and archivo.geturl() == url:
  11.         print """CORRECTO"""
  12.     else:
  13.         print 'ERROR'

Buena suerte en lo que sea que estés haciendo.
  #12 (permalink)  
Antiguo 29/03/2013, 05:32
Avatar de MA40  
Fecha de Ingreso: septiembre-2004
Mensajes: 23
Antigüedad: 17 años
Puntos: 1
Respuesta: ¿Excepción de redireccionamiento???

¡Perfecto! Ahora sí.

Muchas gracias razpeitia.
Muchas gracias a ti también dontexplain.

Os he dado mi punto en todos los mensajes de este tema a los dos como agradecimiento.

Un cordial saludo.

P.D.: Por cierto, si tenéis curiosidad por lo que estoy haciendo, se puede ver aquí:
http://www.edicionesma40.com/blog/visor-pgn-de-ajedrez.htm

Última edición por MA40; 29/03/2013 a las 05:49 Razón: P.D.
  #13 (permalink)  
Antiguo 29/03/2013, 05:56
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 9 años, 3 meses
Puntos: 127
Respuesta: ¿Excepción de redireccionamiento???

Cita:
Iniciado por razpeitia Ver Mensaje
Código Python:
Ver original
  1. import urllib2
  2. from urllib2 import HTTPError, URLError
  3.  
  4. url = "http://ma40.zxq.net/inexistente.txt"
  5. try:
  6.     archivo = urllib2.urlopen(url)
  7. except (HTTPError, URLError):
  8.     print """ERROR"""
  9. else:
  10.     if archivo.getcode() == 200 and archivo.geturl() == url:
  11.         print """CORRECTO"""
  12.     else:
  13.         print 'ERROR'

Buena suerte en lo que sea que estés haciendo.
Exacto. Comprobar la url del recurso actual y del primitivo (original) era una solución bastante fácil. No obstante, te dije de mirar el HTTPRedirectHandler y ni caso me hiciste.

La idea es que esa clase recibe una petición de urllib2 y la procesa. Su funcionamiento es sencillo, en primer lugar se crea un opener, el opener será la función que reciba el objeto de petición. Este objeto será un HTTPRedirectHandler.

El HTTPRedirectHandler, si el código de la respuesta es 301 llamará a la función http_error_301 con todos los parámetros. Si tú creas una clase hija puedes sobreescribir esa función para que cuando sea llamada haga lo que tú quieras, y de eso tratará, la idea es que cuando sea llamada no devuelva un objeto request sino un simple error.

Código Python:
Ver original
  1. import urllib2
  2. class redirigir(urllib2.HTTPRedirectHandler):
  3.     def http_error_301(self,req,fp,code,msg,headers):
  4.         return False
  5. try:
  6.     op = urllib2.build_opener(redirigir)
  7.     urllib2.install_opener(op)
  8.     r = urllib2.urlopen("http://ma40.zxq.net/reti.txt")
  9.     print r.read()
  10. except urllib2.HTTPError, e:
  11.     print "error"


Si el código fuera 301 llamaría a la función http_error_301, que devolvería False, por lo que sería automáticamente erróneo. Si el archivo no existiera la excepción sería HTTPError, e imprimiría error, si el código fuera correcto imprimiría la respuesta.

Un saludo.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor
  #14 (permalink)  
Antiguo 29/03/2013, 06:01
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 9 años, 3 meses
Puntos: 127
Respuesta: ¿Excepción de redireccionamiento???

Cita:
Iniciado por MA40 Ver Mensaje
¡Perfecto! Ahora sí.

Muchas gracias razpeitia.
Muchas gracias a ti también dontexplain.

Os he dado mi punto en todos los mensajes de este tema a los dos como agradecimiento.

Un cordial saludo.

P.D.: Por cierto, si tenéis curiosidad por lo que estoy haciendo, se puede ver aquí:
http://www.edicionesma40.com/blog/vi...de-ajedrez.htm
llegué tarde

Un saludo.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:53.