【问题标题】:How to deal with <TooManyRedirects: Exceeded 30 redirects.> exception using requests in Python?如何使用 Python 中的请求处理 <TooManyRedirects: Exceeded 30 redirects.> 异常?
【发布时间】:2017-04-15 00:48:53
【问题描述】:

我使用的请求效果很好,但是使用这个特定的 url,我得到了重定向循环中断。

s = requests.Session()
page = s.get('http://pe.usps.gov/text/pub28/28apc_002.htm')
tree = html.fromstring(page.content)
street_type = tree.xpath(r"//*[@id='ep533076']/tbody/tr[2]/td[1]/p/a")
print(street_type)

我特别想知道是否有一种方法可以为请求分配标头以避免重定向。我已经测试了实际的 url,它看起来是有效的。

谢谢

【问题讨论】:

    标签: python url python-requests


    【解决方案1】:

    重定向是服务器发送的响应。它通常是一个 HTTP &lt;301&gt;&lt;302&gt; 响应,上面写着“嘿,我知道你在找什么,它就在这里……”并给你一个新的地方去寻找。是的,这些可以链接在一起,是的,你可以结束循环。这就是最大重定向限制的用途。

    您可以使用以下方法设置请求中允许的重定向次数:

    s.max_redirects = 50   # the default is 30
    

    但这并不能解决问题。在这种特殊情况下,服务器正在寻找您使用的浏览器类型,并在找不到所需内容时重定向您。您可以通过在标题中添加user-agent 字段来模仿浏览器。

    推荐用法:将标头设置为单个请求的通用浏览器

    session.get(url, headers={'user-agent': 'My app'})
    
    # returns:
    <Response [200]>
    

    原帖:设置整个会话的标题,不一定是你想要的。

    s.headers = {'user-agent': 'some app'}
    s.get('http://pe.usps.gov/text/pub28/28apc_002.htm')
    
    # returns:
    <Response [200]>
    

    【讨论】:

    • 在这种特殊情况下,您不需要欺骗浏览器用户代理,我建议您仅在必要时使用欺骗。而是包含一个特定于应用程序的用户代理;例如session.header['User-Agent'] = 'My App'
    • 这可能是真的。我只是从萤火虫那里复制的。
    • 另外,为了完成,您可能应该添加您可以使用 headers kwarg 将标头添加到单个请求而不是整个会话。 session.get(url, headers={'user-agent': 'My app'})
    • 也是headers 而不是header
    • 放置 User-Agent 很好,但我认为如果您请求很多网址,这将无法解决
    猜你喜欢
    • 1970-01-01
    • 2014-08-05
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多