[Python-es] validar accesibilidad a una URL sin hacer "download"

Boris Perez Canedo inf200523 en ucf.edu.cu
Vie Abr 2 21:30:03 CEST 2010






El 2 de abril de 2010 15:06, Jose Caballero jcaballero.hep en gmail.com> escribió:



El 2 de abril de 2010 11:45, Boris Perez Canedo inf200523 en ucf.edu.cu> escribió:

 



 
Hola,

quisiera poder comprobar que una determinada URL existe y es
accesible, pero sin 'descargar' su contenido, simplemente comprobar que el server
está activo, que el usuario no ha escrito mal la URL (sin 'typos'), etc., pero
sin tener que descargar su contenido. Podría hacer un simple wget the la URL y
ver si funciona, pero no me interesa. 

Intuyo que puedo usar el método
HEAD de HTTP que simplemente devuelve la metainformación contenida en el HEAD. En
principio eso seria suficiente. Ejemplo:

$ curl --head http://www.google.com
HTTP/1.0 200 OK
Date: Fri, 02 Apr
2010 15:00:37 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie:
PREF=ID=09c3639ccf643ace:TM=1270220437:LM=1270220437:S=lY6HpKCqZ3lZEW9_; expires=Sun,
01-Apr-2012 15:00:37 GMT; path=/; domain=.google.com
Set-Cookie:
NID=33=i_y0e-Tq2pAw8HxXMzD3KeH_H4Lqve81UH1WT_kQAwdJnRd0paMJz4KMZcp2cr1JqY35AkjVwYfK2UbPtlu_-9k4R0nFAuGe93JmxxebhGSdDtAxngWmq-FgfWELdfp0;
expires=Sat, 02-Oct-2010 15:00:37 GMT; path=/; domain=.google.com;
HttpOnly
Server: gws
X-XSS-Protection: 0
X-Cache: MISS from
httpproxy4.bnl.vip
X-Cache-Lookup: MISS from httpproxy4.bnl.vip:3128
Proxy-Connection: close

$ curl --head http://www.google.comm
HTTP/1.0 503 Service Unavailable
Server: squid/3.0.STABLE8
Mime-Version: 1.0
Date: Fri, 02 Apr 2010 15:08:02
GMT
Content-Type: text/html
Content-Length: 1823
Expires: Fri, 02 Apr
2010 15:08:02 GMT
X-Squid-Error: ERR_DNS_FAIL 0
X-Cache: MISS from
httpproxy4.bnl.vip
X-Cache-Lookup: MISS from httpproxy4.bnl.vip:3128
Proxy-Connection: close

Pero de esta forma es necesario hacer demasiado
'parsing', y no siempre la primera línea contiene "OK" aunque la URL
sea válida. No tengo demasiado claro cómo puedo validar la URL a partir de
este tipo de resultados. 

He estado mirando un poco las clases urllib y
urllib2, pero no acabo de ver cómo puedo hacer la validación sin que el
contenido de la URL se descargue cuando existe. Si alguien tiene algún 'link' a
un ejemplo de cómo validar una URL sin necesidad de descargar su contenido,
válido para python2.3, estaré eternamente agradecido. 


Muchas gracias. Saludos cordiales,

Jose



Hola Jose,

la primera linea no siempre contiene OK, pero no puedes obtener el
código de respuesta e interpretarlo?

En el primer caso el
código es 200
y en el segundo 503, utiliza las expresiones regulares.

Ejemplo:
(HTTP/\d\.\d)\s(\d{3})
en el grupo 1 tienes la versión
del protocolo y en el grupo 2 el código.

import re
reobj =
re.compile(r"(HTTP/\d\.\d)\s(\d{3})")

match =
reobj.search(primera_linea)

if match:
       version = match.group(1)
       codigo = match.group(2)

 



Saludos,
Boris.





 
Hola Boris,

eso podría valer. ¿Es siempre 200
cuando todo va bien? Si es siempre el mismo número, o al menos un conjunto
conocido de números, eso me vale. 


Gracias,
Jose






Me respondo yo mismo:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html


Muchas gracias por todo. 
Saludos,
Jose


Ok, fue un placer.


---
La mejor vacuna contra el virus A(H1N1) es la higiene personal
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20100402/7162e0e4/attachment.html>


Más información sobre la lista de distribución Python-es