web-dev-qa-db-fra.com

Requêtes Python: requests.exceptions.TooManyRedirects: 30 redirections dépassées

J'essayais d'explorer cette page à l'aide de la bibliothèque python-request

import requests
from lxml import etree,html

url = 'http://www.Amazon.in/b/ref=sa_menu_mobile_elec_all?ie=UTF8&node=976419031'
r = requests.get(url)
tree = etree.HTML(r.text)
print tree

mais j'ai eu l'erreur ci-dessus. (TooManyRedirects) J'ai essayé d'utiliser le paramètre allow_redirects mais la même erreur

r = requests.get(url, allow_redirects=True)

J'ai même essayé d'envoyer des en-têtes et des données avec URL, mais je ne suis pas sûr que ce soit la bonne façon de le faire.

headers = {'content-type': 'text/html'}
payload = {'ie':'UTF8','node':'976419031'}
r = requests.post(url,data=payload,headers=headers,allow_redirects=True)

comment résoudre cette erreur. J'ai même essayé beautiful-soup4 par curiosité et j'ai eu une erreur différente mais identique

page = BeautifulSoup(urllib2.urlopen(url))

urllib2.HTTPError: HTTP Error 301: The HTTP server returned a redirect error that would lead to an infinite loop.
The last 30x error message was:
Moved Permanently
14
user3628682

Amazon redirige votre demande vers http://www.Amazon.in/b?ie=UTF8&node=976419031, qui à son tour redirige vers http://www.Amazon.in/electronics/b?ie=UTF8&node=976419031, après quoi vous avez entré une boucle:

>>> loc = url
>>> seen = set()
>>> while True:
...     r = requests.get(loc, allow_redirects=False)
...     loc = r.headers['location']
...     if loc in seen: break
...     seen.add(loc)
...     print loc
... 
http://www.Amazon.in/b?ie=UTF8&node=976419031
http://www.Amazon.in/electronics/b?ie=UTF8&node=976419031
>>> loc
http://www.Amazon.in/b?ie=UTF8&node=976419031

Donc, votre URL d'origine A ne redirige pas une nouvelle URL B, qui redirige vers C, qui redirige vers B, etc.

Apparemment, Amazon fait cela en fonction de l'en-tête User-Agent, à quel moment il définit un cookie que les demandes suivantes doivent renvoyer. Les oeuvres suivantes:

>>> s = requests.Session()
>>> s.headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'
>>> r = s.get(url)
>>> r
<Response [200]>

Cela a créé une session (pour faciliter la réutilisation et la persistance des cookies), ainsi qu'une copie de la chaîne de l'agent utilisateur de Chrome. La demande aboutit (renvoie une réponse 200).

22
Martijn Pieters

Vous devez copier la valeur du cookie dans votre en-tête. Cela fonctionne de mon côté.

0
Rocky Chen

L'augmentation de max_redirect est possible en spécifiant explicitement le nombre, comme dans l'exemple ci-dessous:

session = requests.Session()
session.max_redirects = 60
session.get('http://www.Amazon.com')
0
PrabaKaran D