httplib no está recibiendo todos los códigos de redirección

Estoy intentando obtener la url final de una página que parece redirigir más de una vez. Pruebe esta URL de muestra en su navegador y compárela con la URL final al final de mi fragmento de código:

Enlace que redirige más de una vez.

Y aquí está el código de prueba que estaba ejecutando, observe que la URL final que obtiene un código de 200 no es la misma que la de su navegador. ¿Cuáles son mis opciones?

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) [GCC 4.5.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import httplib >>> from urlparse import urlparse >>> url = 'http://www.usmc.mil/units/hqmc/' >>> host = urlparse(url)[1] >>> req = ''.join(urlparse(url)[2:5]) >>> conn = httplib.HTTPConnection(host) >>> conn.request('HEAD', req) >>> resp = conn.getresponse() >>> print resp.status 301 >>> print resp.msg.dict['location'] http://www.marines.mil/units/hqmc/ >>> url = 'http://www.marines.mil/units/hqmc/' >>> host = urlparse(url)[1] >>> req = ''.join(urlparse(url)[2:5]) >>> conn = httplib.HTTPConnection(host) >>> conn.request('HEAD', req) >>> resp = conn.getresponse() >>> print resp.status 302 >>> print resp.msg.dict['location'] http://www.marines.mil/units/hqmc/default.aspx >>> url = 'http://www.marines.mil/units/hqmc/default.aspx' >>> host = urlparse(url)[1] >>> req = ''.join(urlparse(url)[2:5]) >>> conn = httplib.HTTPConnection(host) >>> conn.request('HEAD', req) >>> resp = conn.getresponse() >>> print resp.status 200 >>> print resp.msg.dict['location'] Traceback (most recent call last): File "", line 1, in  KeyError: 'location' >>> print url http://www.marines.mil/units/hqmc/default.aspx //THIS URL DOES NOT RETURN A 200 IN ANY BROWSER I HAVE TRIED 

puede intentar configurar el encabezado User-Agent en User-Agent de su navegador.

ps: urllib2 redirige automáticamente

EDITAR:

 In [2]: import urllib2 In [3]: resp = urllib2.urlopen('http://www.usmc.mil/units/hqmc/') In [4]: resp.geturl() Out[4]: 'http://www.marines.mil/units/hqmc/default.aspx 

Puedes usar HttpLib2 para obtener la ubicación real de una URL:

 import httplib2 def getContentLocation(link): h = httplib2.Http(".cache_httplib") h.follow_all_redirects = True resp = h.request(link, "GET")[0] contentLocation = resp['content-location'] return contentLocation if __name__ == '__main__': link = 'http://podcast.at/podcast_url344476.html' print getContentLocation(link) 

La ejecución se ve así:

 $ python2.7 getContentLocation.py http://keyinvest.podcaster.de/8uhr30.rss 

Tenga en cuenta que este ejemplo también utiliza el almacenamiento en caché (que no es compatible con urllib ni con httplib). Así que esto se ejecutará repetidamente significativamente más rápido. Esto podría ser interesante para el rastreo / raspado. Si no desea el almacenamiento en caché, reemplace h = httplib2.Http(".cache_httplib") con h = httplib2.Http() .