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
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).
Vous devez copier la valeur du cookie dans votre en-tête. Cela fonctionne de mon côté.
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')