2012-04-01 17 views
7

puedo usar urllib2 para hacer peticiones HEAD así: Python HTTP HEAD: ¿trata adecuadamente los redireccionamientos?

import urllib2 
request = urllib2.Request('http://example.com') 
request.get_method = lambda: 'HEAD' 
urllib2.urlopen(request) 

El problema es que parece que cuando esto sigue redirecciones, se utiliza GET en lugar de la cabeza.

El propósito de esta solicitud HEAD es verificar el tamaño y el tipo de contenido de la URL que estoy a punto de descargar para poder asegurarme de que no descargo ningún documento enorme. (La URL es suministrada por un usuario de Internet aleatorio a través de IRC).

¿Cómo podría hacer que utilice las solicitudes HEAD cuando se siguen los redireccionamientos?

+3

[Solicitudes] (http://docs.python-requests.org/en/latest/index.html) al menos pretende hacer esto el de manera correcta (al menos, documenta su comportamiento de redirección como que trabaja para métodos idempotentes, y llama a HEAD específicamente en los documentos). –

+0

una solución similar: http://stackoverflow.com/questions/9890815/python-get-headers-only-using-urllib2/9892207#9892207 – newtover

Respuesta

3

¡Buena pregunta! Si está configurado usando urllib2, querrá consultar this answer sobre la construcción de su propio controlador de redirección.

En pocas palabras (es decir: robado descaradamente de la respuesta anterior):

import urllib2 

#redirect_handler = urllib2.HTTPRedirectHandler() 

class MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler): 
    def http_error_302(self, req, fp, code, msg, headers): 
     print "Cookie Manip Right Here" 
     return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers) 

    http_error_301 = http_error_303 = http_error_307 = http_error_302 

cookieprocessor = urllib2.HTTPCookieProcessor() 

opener = urllib2.build_opener(MyHTTPRedirectHandler, cookieprocessor) 
urllib2.install_opener(opener) 

response =urllib2.urlopen("WHEREEVER") 
print response.read() 

print cookieprocessor.cookiejar 

Además, como se menciona en la fe de erratas, puede utilizar Python Requests.

+1

Terminé usando este controlador de redirección, basado en lo que encontraste: http://pastebin.com/m7aN21A7 ¡Gracias! – Krenair

+0

@Krenair ¡Me alegro de ayudar! – MrGomez

9

Usted puede hacer esto con la biblioteca requests:

>>> import requests 
>>> r = requests.head('http://github.com', allow_redirects=True) 
>>> r 
<Response [200]> 
>>> r.history 
[<Response [301]>] 
>>> r.url 
u'https://github.com/' 
Cuestiones relacionadas