【问题标题】:Python Requests: requests.exceptions.TooManyRedirects: Exceeded 30 redirectsPython 请求:requests.exceptions.TooManyRedirects:超过 30 个重定向
【发布时间】:2014-07-02 08:22:18
【问题描述】:

我正在尝试使用 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

但我得到了上述错误。 (太多重定向) 我尝试使用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

【问题讨论】:

  • allow_redirects=True 是默认值;问题不在于您不遵循重定向,问题在于服务器一直在重定向您。可能是因为你不接受 cookie..
  • 会话似乎没有帮助。您正在访问的 URL 重定向到 http://www.amazon.in/b?ie=UTF8&node=976419031,后者重定向到 http://www.amazon.in/electronics/b?ie=UTF8&node=976419031。后者重定向到自己。

标签: python python-2.7 beautifulsoup python-requests


【解决方案1】:

亚马逊将您的请求重定向到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,等等。

显然,亚马逊是根据 User-Agent 标头执行此操作的,此时它设置了一个 cookie,后续请求应发回该 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 响应)。

【讨论】:

  • 这适用于我在 Windows 上,但不适用于 Ubuntu VM.. 任何想法为什么?
  • @ProgSnob 不,尤其是当你不告诉我它是如何不工作的时候,对不起。
【解决方案2】:

您需要将 cookie 值复制到您的标头。它对我有用。

【讨论】:

  • 我该怎么做?
【解决方案3】:

可以通过显式指定计数来增加max_redirect,如下例所示:

session = requests.Session()
session.max_redirects = 60
session.get('http://www.amazon.com')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 2021-08-25
    • 2012-02-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多