web-dev-qa-db-fra.com

Python suit les redirections puis télécharge la page?

J'ai le script python suivant et cela fonctionne à merveille. 

import urllib2

url = 'http://abc.com' # write the url here

usock = urllib2.urlopen(url)
data = usock.read()
usock.close()

print data

cependant, certaines des URL que je lui donne peuvent le rediriger 2 fois ou plus. Comment faire en sorte que python attende la fin des redirections avant de charger les données. Par exemple, lorsque vous utilisez le code ci-dessus avec 

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

ce qui équivaut à appuyer sur le bouton de la chance sur une recherche google, je reçois:

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

J'ai essayé le (URL, données, délai d'attente) cependant, je ne sais pas quoi mettre là.

EDIT: En fait, j’ai découvert que si je ne redirige pas et que j’utilisais juste l’en-tête du premier lien, je peux saisir l’emplacement de la prochaine redirection et l’utiliser comme dernier lien

21
Cripto

Vous aurez peut-être intérêt à utiliser la bibliothèque Requests, qui dispose de meilleures API pour contrôler la gestion des redirections:

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

Demandes:

http://pypi.python.org/pypi/requests/ (remplacement d'urllib chez l'homme)

18
Mikko Ohtamaa

Utilisez requests comme autres états de réponse, voici un exemple. La redirection sera dans r.url. Dans l'exemple ci-dessous, la http est redirigée vers https

Pour HEAD:

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

Out[1]: 'https://github.com/'

Oublier:

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

Out[1]: 'https://github.com/'

Remarque pour HEAD, vous devez spécifier allow_redirects. Sinon, vous pouvez l’obtenir dans les en-têtes, mais cela n’est pas conseillé.

In [1]: import requests

In [2]: r = requests.head('http://github.com')

In [3]: r.headers.get('location')
Out[3]: 'https://github.com/'

Pour télécharger la page vous aurez besoin de GET, vous pouvez ensuite accéder à la page en utilisant r.content

1
Glen Thompson