¿Python sigue las redirecciones y luego descarga la página?

Tengo la siguiente secuencia de comandos de Python y funciona muy bien.

import urllib2 url = 'http://abc.com' # write the url here usock = urllib2.urlopen(url) data = usock.read() usock.close() print data 

sin embargo, algunas de las URL que le doy pueden redirigirlo 2 o más veces. ¿Cómo puedo hacer que Python espere a que se completen las redirecciones antes de cargar los datos? Por ejemplo, cuando se utiliza el código anterior con

 http://www.google.com/search?hl=en&q=KEYWORD&btnI=1 

que es el equivalente de pulsar el botón de suerte en una búsqueda de Google, obtengo:

 >>> url = 'http://www.google.com/search?hl=en&q=KEYWORD&btnI=1' >>> usick = urllib2.urlopen(url) Traceback (most recent call last): File "", line 1, in  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 126, in urlopen return _opener.open(url, data, timeout) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 400, in open response = meth(req, response) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 513, in http_response 'http', request, response, code, msg, hdrs) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 438, in error return self._call_chain(*args) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 372, in _call_chain result = func(*args) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 521, in http_error_default raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) urllib2.HTTPError: HTTP Error 403: Forbidden >>> 

He probado el (url, data, timeout) sin embargo, no estoy seguro de qué poner allí.

EDITAR: En realidad, descubrí que si no redirigía y solo usaba el encabezado del primer enlace, puedo tomar la ubicación del siguiente redireccionamiento y usarlo como mi enlace final

Es posible que esté mejor con la biblioteca de solicitudes, que tiene mejores API para controlar el manejo de redireccionamiento:

http://docs.python-requests.org/en/latest/user/quickstart/#redirection-and-history

Peticiones:

http://pypi.python.org/pypi/requests/ (reemplazo de urllib para humanos)

Utilice las requests como los otros estados de respuesta, aquí hay un ejemplo. La redirección estará en r.url . En el siguiente ejemplo, la http se redirige a https

Para HEAD:

 In [1]: import requests ...: r = requests.head('http://github.com', allow_redirects=True) ...: r.url Out[1]: 'https://github.com/' 

Olvidar:

 In [1]: import requests ...: r = requests.get('http://github.com') ...: r.url Out[1]: 'https://github.com/' 

Tenga en cuenta que para HEAD debe especificar allow_redirects pero si no lo hace, puede obtenerlo en los encabezados, pero no se recomienda hacerlo.

 In [1]: import requests In [2]: r = requests.head('http://github.com') In [3]: r.headers.get('location') Out[3]: 'https://github.com/' 

Para descargar la página , necesitará GET, luego puede acceder a la página usando r.content

¿Absolutamente tienes que hacerlo de esa manera? ¿Qué te parece usar algo como twill ( http://twill.idyll.org/ )? Hace que lo que quieras hacer sea muy fácil (y es Python).