2009-07-16 5 views

Respuesta

22

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] 
+3

Esto no es una solución válida porque urllib2 seguirá los redireccionamientos, por lo que no obtendrá ninguna respuesta 3xx. – sorin

+1

@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

63

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 
+13

+1 para solicitud HEAD: no es necesario recuperar toda la entidad para una verificación de estado. –

+7

Aunque realmente debería restringir ese bloque 'except' a al menos' StandardError' para que no pueda detectar cosas como 'KeyboardInterrupt' incorrectamente. –

+0

Buena idea, Ben. Lo actualicé en consecuencia. –

3

La excepción urllib2.HTTPError no contiene un método getcode(). Use el atributo code en su lugar.

+2

Lo hace por mí, usando Python 2.6. – RichieHindle

5

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() 
+2

Esto generará un HTTPError para códigos de estado como 404, 500, etc. –

63

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") 
+0

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

+5

httpstatusrappers.com ... ¡impresionante! ¡Mi código está en ese estado de Lil Jon, hijo! – tmthyjames

+1

Esta es la mejor solución. Mucho mejor que cualquiera de los otros. – Awn

1

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 
+1

No estoy seguro de por qué esto fue downvoted sin comentarios. Funciona con URLs HTTP y HTTPS. Utiliza el método HEAD de HTTP. –

Cuestiones relacionadas