Luego de investigar con especialistas en la materia, programadores de deferentes áreas y profesores dimos con la respuesta al problema y la plasmamos en esta publicación.
Solución:
Puede usar la solicitud HEAD en lugar de GET. Solo descargará el encabezado, pero no el contenido. Luego puede verificar el estado de respuesta de los encabezados.
Para python 2.7.x, puede usar httplib
:
import httplib
c = httplib.HTTPConnection('www.example.com')
c.request("HEAD", '')
if c.getresponse().status == 200:
print('web site exists')
o urllib2
:
import urllib2
try:
urllib2.urlopen('http://www.example.com/some_page')
except urllib2.HTTPError, e:
print(e.code)
except urllib2.URLError, e:
print(e.args)
o para 2.7 y 3.x, puede instalar requests
import requests
request = requests.get('http://www.example.com')
if request.status_code == 200:
print('Web site exists')
else:
print('Web site does not exist')
Es mejor verificar que el código de estado sea < 400, como se hizo aquí. Esto es lo que significan los códigos de estado (tomado de wikipedia):
1xx
– informativo2xx
– éxito3xx
– redirección4xx
– error del cliente5xx
– Error del Servidor
Si desea verificar si la página existe y no desea descargar toda la página, debe usar Head Request:
import httplib2
h = httplib2.Http()
resp = h.request("http://www.google.com", 'HEAD')
assert int(resp[0]['status']) < 400
tomado de esta respuesta.
Si desea descargar la página completa, simplemente haga una solicitud normal y verifique el código de estado. Ejemplo usando solicitudes:
import requests
response = requests.get('http://google.com')
assert response.status_code < 400
Ver también temas similares:
- ¿Script de Python para ver si existe una página web sin descargar toda la página?
- Verificar si un enlace está muerto o no usando Python sin descargar la página web
- ¿Cómo se envía una solicitud HEAD HTTP en Python 2?
- Hacer una solicitud HTTP HEAD con urllib2 desde Python 2
Espero que ayude.
from urllib2 import Request, urlopen, HTTPError, URLError
user_agent = 'Mozilla/20.0.1 (compatible; MSIE 5.5; Windows NT)'
headers = 'User-Agent':user_agent
link = "http://www.abc.com/"
req = Request(link, headers = headers)
try:
page_open = urlopen(req)
except HTTPError, e:
print e.code
except URLError, e:
print e.reason
else:
print 'ok'
Para responder al comentario de unutbu:
Debido a que los controladores predeterminados manejan redireccionamientos (códigos en el rango 300) y los códigos en el rango 100-299 indican éxito, por lo general solo verá códigos de error en el rango 400-599. Fuente
Si para ti ha resultado de utilidad este post, te agradeceríamos que lo compartas con el resto seniors y nos ayudes a difundir nuestra información.