Estoy buscando una forma rápida de obtener un código de respuesta HTTP desde una URL (es decir, 200, 404, etc.). No estoy seguro de qué biblioteca usar.¿Cuál es la mejor manera de obtener un código de respuesta HTTP de una URL?
Respuesta
Debe utilizar 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]
he aquí una solución que utiliza 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
+1 para solicitud HEAD: no es necesario recuperar toda la entidad para una verificación de estado. –
Aunque realmente debería restringir ese bloque 'except' a al menos' StandardError' para que no pueda detectar cosas como 'KeyboardInterrupt' incorrectamente. –
Buena idea, Ben. Lo actualicé en consecuencia. –
La excepción urllib2.HTTPError
no contiene un método getcode()
. Use el atributo code
en su lugar.
Lo hace por mí, usando Python 2.6. – RichieHindle
En el futuro, para aquellos que usan python3 y posterior, 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()
Esto generará un HTTPError para códigos de estado como 404, 500, etc. –
Actualiza usando el maravilloso requests library. 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("http://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")
solicitudes es mucho mejor que urllib2, para tal enlace: http://www.dianping.com/promo/208721#mod=4, urllib2 dame a 404 y las solicitudes dan 200 como lo que obtengo de un navegador. – WKPlus
httpstatusrappers.com ... ¡impresionante! ¡Mi código está en ese estado de Lil Jon, hijo! – tmthyjames
Esta es la mejor solución. Mucho mejor que cualquiera de los otros. – Awn
Aquí es una solución httplib
que se comporta como urllib2. Puedes darle una URL y simplemente funciona. No hay necesidad de preocuparse por dividir sus URL en el nombre de host y la ruta. Esta función ya lo hace.
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
No estoy seguro de por qué esto fue downvoted sin comentarios. Funciona con URLs HTTP y HTTPS. Utiliza el método HEAD de HTTP. –
- 1. cuál es la mejor manera de obtener la URL base de un controlador
- 2. ¿Cuál es la mejor manera de probar el código GWT
- 3. ¿Cuál es la mejor manera de documentar el código f #?
- 4. ¿Cuál es la mejor manera de descomprimir una respuesta de servidor gzip en Python 3?
- 5. ¿Cuál es la mejor manera de truncar una URL para que se ajuste a un diseño
- 6. ¿Cuál es la mejor manera de obtener la URL actual en Spring MVC?
- 7. ¿Cuál es la mejor manera de construir una NSCompoundPredicate compleja?
- 8. ¿Cuál es la mejor manera de verificar si una cadena contiene una URL en Java/Android?
- 9. ¿Cuál es la mejor manera de implementar un protocolo de solicitud/respuesta utilizando akka y scala?
- 10. ¿Cuál es la respuesta de código de estado HTTP apropiada para una solicitud general sin éxito (no es un error)?
- 11. ¿Cuál es la mejor manera de verificar si existe una URL en PHP?
- 12. código de respuesta HTTP después de redirigir
- 13. ¿Cuál es la mejor manera de leer GetResponseStream()?
- 14. ¿Cuál es la mejor manera de incrementar una enumeración?
- 15. ¿Cuál es la mejor manera de barajar un NSMutableArray?
- 16. Cómo obtener solo el código de respuesta de una solicitud HTTP en Ruby
- 17. ¿Cuál es la estructura de respuesta exacta para el código de estado HTTP 300 (opciones múltiples)?
- 18. Cuál es la mejor manera de autorizar una llave USB
- 19. ¿Cuál es la mejor manera de deducir una mesa?
- 20. ¿Cuál es la mejor manera de implementar un "temporizador"?
- 21. ¿Cuál es la mejor manera de almacenar un valor de URL usando MySQL?
- 22. ¿Cuál es la mejor manera de determinar un bucle invariante?
- 23. ¿Cuál es la mejor manera de almacenar un URL Slug único?
- 24. ¿Cuál es la mejor manera de declarar una variable global?
- 25. ¿Cuál es la mejor manera de perfilar una aplicación Sinatra?
- 26. ¿Cuál es la mejor manera de dividir una cadena para obtener todas las subcadenas de Ruby?
- 27. ¿La mejor manera de lograr URL multilingües?
- 28. ¿Cuál es la mejor manera de analizar una gramática simple?
- 29. Código de respuesta HTTP devuelto por el servidor: 400
- 30. ¿Cuál es la forma más rápida de obtener un código de estado de URL usando HttpClient
Esto no es una solución válida porque urllib2 seguirá los redireccionamientos, por lo que no obtendrá ninguna respuesta 3xx. – sorin
@sorin: Eso depende, es posible que ** quieras ** seguir las redirecciones. Tal vez quiera hacer la pregunta "Si tuviera que visitar esta URL con un navegador, ¿mostraría contenido o daría un error?" En ese caso, si cambiara 'http: // entrian.com /' a 'http: // entrian.com/blog' en mi ejemplo, los 200 resultantes serían correctos aunque implicara una redirección a' http:// entrian.com/blog/'(fíjese en la barra al final). – RichieHindle