Estoy buscando una forma rápida de obtener un código de respuesta HTTP de una URL (es decir, 200, 404, etc.). No estoy seguro de qué biblioteca usar.
82
Actualice utilizando la maravillosa biblioteca de solicitudes . Tenga en cuenta que estamos utilizando la solicitud HEAD, que debería suceder más rápidamente que una solicitud GET o POST completa.
import requests
try:
r = requests.head("https://stackoverflow.com")
print(r.status_code)
# prints the int of the status code. Find more at httpstatusrappers.com :)
except requests.ConnectionError:
print("failed to connect")
requests
proporciona403
su enlace, aunque todavía funciona en el navegador.Aquí hay una solución que usa en su
httplib
lugar.import httplib def get_status_code(host, path="/"): """ This function retreives the status code of a website by requesting HEAD data from the host. This means that it only requests the headers. If the host cannot be reached or something else goes wrong, it returns None instead. """ try: conn = httplib.HTTPConnection(host) conn.request("HEAD", path) return conn.getresponse().status except StandardError: return None print get_status_code("stackoverflow.com") # prints 200 print get_status_code("stackoverflow.com", "/nonexistant") # prints 404
fuente
except
bloque al menosStandardError
para no captar incorrectamente cosas comoKeyboardInterrupt
.curl -I http://www.amazon.com/
.Deberías usar urllib2, así:
import urllib2 for url in ["http://entrian.com/", "http://entrian.com/does-not-exist/"]: try: connection = urllib2.urlopen(url) print connection.getcode() connection.close() except urllib2.HTTPError, e: print e.getcode() # Prints: # 200 [from the try block] # 404 [from the except block]
fuente
http://entrian.com/
ahttp://entrian.com/blog
en mi ejemplo, el 200 resultante sería correcto a pesar de que implicaba una redirección ahttp://entrian.com/blog/
(observe la barra inclinada final).En el futuro, para aquellos que usan python3 y versiones posteriores, aquí hay otro código para encontrar el código de respuesta.
import urllib.request def getResponseCode(url): conn = urllib.request.urlopen(url) return conn.getcode()
fuente
La
urllib2.HTTPError
excepción no contiene ningúngetcode()
método. En su lugar, utilice elcode
atributo.fuente
Dirigiendo el comentario de @Niklas R a la respuesta de @ nickanor:
from urllib.error import HTTPError import urllib.request def getResponseCode(url): try: conn = urllib.request.urlopen(url) return conn.getcode() except HTTPError as e: return e.code
fuente
Aquí hay una
httplib
solución que se comporta como urllib2. Simplemente puede darle una URL y simplemente funciona. No hay necesidad de meterse en dividir las URL en nombre de host y ruta. Esta función ya hace eso.import httplib import socket def get_link_status(url): """ Gets the HTTP status of the url or returns an error associated with it. Always returns a string. """ https=False url=re.sub(r'(.*)#.*$',r'\1',url) url=url.split('/',3) if len(url) > 3: path='/'+url[3] else: path='/' if url[0] == 'http:': port=80 elif url[0] == 'https:': port=443 https=True if ':' in url[2]: host=url[2].split(':')[0] port=url[2].split(':')[1] else: host=url[2] try: headers={'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0', 'Host':host } if https: conn=httplib.HTTPSConnection(host=host,port=port,timeout=10) else: conn=httplib.HTTPConnection(host=host,port=port,timeout=10) conn.request(method="HEAD",url=path,headers=headers) response=str(conn.getresponse().status) conn.close() except socket.gaierror,e: response="Socket Error (%d): %s" % (e[0],e[1]) except StandardError,e: if hasattr(e,'getcode') and len(e.getcode()) > 0: response=str(e.getcode()) if hasattr(e, 'message') and len(e.message) > 0: response=str(e.message) elif hasattr(e, 'msg') and len(e.msg) > 0: response=str(e.msg) elif type('') == type(e): response=e else: response="Exception occurred without a good error message. Manually check the URL to see the status. If it is believed this URL is 100% good then file a issue for a potential bug." return response
fuente