web-dev-qa-db-ja.com

Pythonリクエスト:requests.exceptions.TooManyRedirects:30リダイレクトを超えました

私はpython-requestsライブラリを使用してこのページをクロールしようとしていました

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

しかし、私は上記のエラーを得ました。 (TooManyRedirects)_allow_redirects_パラメータを使用しようとしましたが、同じエラーが発生しました

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

ヘッダーとデータをurlと一緒に送信しようとしましたが、これが正しい方法であるかどうかはわかりません。

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

このエラーを解決する方法。私は好奇心からbeautiful-soup4を試してみましたが、異なるが同じ種類のエラーが発生しました

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
_
16
user3628682

Amazonはリクエストをhttp://www.Amazon.in/b?ie=UTF8&node=976419031にリダイレクトし、次にhttp://www.Amazon.in/electronics/b?ie=UTF8&node=976419031にリダイレクトします。その後、ループに入ります。

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

したがって、元のURL Aは新しいURL Bをリダイレクトせず、Cにリダイレクトされ、Bにリダイレクトされます。

どうやら、AmazonはUser-Agentヘッダーに基づいてこれを行っているようです。この時点で、Amazonは後続のリクエストが送り返す必要があるCookieを設定します。以下の作品:

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

これにより、セッション(再利用を容易にし、Cookieを永続化するため)とChromeユーザーエージェント文字列。コピーは200応答を返します)が作成されました。

26
Martijn Pieters

以下の例のようにカウントを明示的に指定することにより、max_redirectの増加が可能です。

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

Cookieの値をヘッダーにコピーする必要があります。それは私の側で機能します。

0
Rocky Chen