2012-01-11 11 views
18

Tengo el siguiente script de python y funciona muy bien.Python sigue los redireccionamientos y luego descarga la página?

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 doy pueden redirigirlo 2 o más veces. ¿Cómo puedo hacer que Python espere a que los redireccionamientos se completen 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 equvilant de golpear el botón de suerte im en una búsqueda en Google, me sale:

>>> url = 'http://www.google.com/search?hl=en&q=KEYWORD&btnI=1' 
>>> usick = urllib2.urlopen(url) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    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 intentado el (url, datos, tiempo de espera) sin embargo, no estoy seguro de qué poner allí.

EDIT: De hecho, me di cuenta si yo no redirigir y acabo de utilizar el encabezado de la primera articulación, puedo agarrar el lugar de la próxima redirección y usar eso como mi último eslabón

+0

Conoce usted 'HTTPRedirectHandler' – RanRag

+0

No lo era. Lo busqué en Google. Puedo ver cómo hacer que NO siga. Sin embargo, no puedo obligarlo a seguir – Cripto

+0

Sé que ha pasado un tiempo, pero ¿puedes profundizar en la bóveda de la memoria y decirme cómo resolviste este problema? ¡Gracias! – tmthyjames

Respuesta

15

Usted puede ser mejor con la biblioteca de solicitudes, que tiene mejores APIs para controlar redirigir la manipulación:

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

Solicitudes:

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

+0

No fue la respuesta correcta, pero me ayudó a encontrar lo que necesitaba. – Cripto

+3

@ user1048138: ¿Te importaría decirnos qué encontraste para resolver tu problema? –

+0

Esa característica simplemente BLEW mi mente. Además, es importante tener en cuenta para otras solicitudes (como HEAD), debe establecer allow_redirects en True para que esto funcione. – halflings

-2

No es absolutamente necesario hazlo de esa manera? ¿Qué le parece usar algo como twill (http://twill.idyll.org/)? Hace que lo que quiere hacer sea muy fácil (y es Python).

Cuestiones relacionadas