当前位置: 首页 > 知识库问答 >
问题:

如何避免HTTP错误429(请求过多)python

范志勇
2023-03-14

我正在尝试使用Python登录一个网站并从多个网页收集信息,我收到以下错误:

Traceback (most recent call last):
  File "extract_test.py", line 43, in <module>
    response=br.open(v)
  File "/usr/local/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 203, in open
    return self._mech_open(url, data, timeout=timeout)
  File "/usr/local/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 255, in _mech_open
    raise response
mechanize._response.httperror_seek_wrapper: HTTP Error 429: Unknown Response Code

我用了时间。sleep(),它可以工作,但它似乎不明智且不可靠,还有其他方法可以避免这个错误吗?

这是我的代码:

import mechanize
import cookielib
import re
first=("example.com/page1")
second=("example.com/page2")
third=("example.com/page3")
fourth=("example.com/page4")
## I have seven URL's I want to open

urls_list=[first,second,third,fourth]

br = mechanize.Browser()
# Cookie Jar
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)

# Browser options 
br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)

# Log in credentials
br.open("example.com")
br.select_form(nr=0)
br["username"] = "username"
br["password"] = "password"
br.submit()

for url in urls_list:
        br.open(url)
        print re.findall("Some String")

共有3个答案

公良征
2023-03-14

正如MRA所说,您不应该试图回避429 Too Many Requests,而应该相应地处理它。根据您的用例,您有几个选项:

1) 睡眠您的进程。服务器通常在响应中包含一个Retry after头,其中包含重试前应等待的秒数。请记住,Hibernate进程可能会导致问题,例如在任务队列中,您应该稍后重试该任务,以释放工作线程进行其他操作。

2) 指数退避。如果服务器没有告诉您等待多长时间,您可以通过增加中间的暂停来重试请求。流行的任务队列芹菜内置了此功能。

3) 令牌存储桶。如果您提前知道在给定的时间内可以发出多少请求,则此技术非常有用。每次访问API时,您首先从存储桶中获取一个令牌。以恒定速率重新加注铲斗。如果bucket是空的,您知道在再次访问API之前必须等待。令牌桶通常在另一端(API)实现,但您也可以将其用作代理,以避免收到“429太多请求”。Celery的rate_limit特性使用令牌桶算法。

下面是一个使用指数回退和速率限制/令牌桶的Python/Celery应用程序示例:

class TooManyRequests(Exception):
"""Too many requests"""

@task(
   rate_limit='10/s',
   autoretry_for=(ConnectTimeout, TooManyRequests,),
   retry_backoff=True)
def api(*args, **kwargs):
  r = requests.get('placeholder-external-api')

  if r.status_code == 429:
    raise TooManyRequests()
傅树
2023-03-14

在请求时编写这段代码解决了我的问题:

requests.get(link, headers = {'User-agent': 'your bot 0.1'})

这是可行的,因为当没有提供用户代理时,站点有时会返回“请求过多 (429)”错误。例如,红迪的API仅在应用用户代理时才起作用。

谢叶五
2023-03-14

收到状态429不是一个错误,它是另一个服务器“友好地”请你停止垃圾邮件请求。很明显,你的请求率太高了,服务器不愿意接受。

你不应该试图“回避”这一点,甚至试图通过欺骗你的IP来绕过服务器安全设置,你应该尊重服务器的回答,不要发送太多请求。

如果一切都设置正确,您还将收到一个“重试后”标头以及429响应。这个标头指定了在进行另一个调用之前应该等待的秒数。处理这个“问题”的正确方法是阅读这个标头并让您的进程Hibernate那么多秒。

您可以在此处找到有关状态 429 的更多信息:https://www.rfc-editor.org/rfc/rfc6585#page-3

 类似资料:
  • 所以我有一个sub-reddits列表,我用urllib打开它们。在我仔细研究之后,urllib最终失败了: 做了一些研究,我发现reddit通过IP限制了对其服务器的请求数量: 每两秒钟不要提出超过一个请求。请求的突发有一定的空间,但要保持理智。一般来说,一分钟内不要超过30个请求。 所以我想我应该使用将我的请求限制在每10秒一页。这最终也失败了。 上面的引用是从reddit API页面获取的。

  • 我正在将oracle从10升级到12,对于这个特定的项目,我遇到了以下错误: 似乎它没有识别我在DataSource上添加的配置: 我们使用的是Java 8,我们对代码有这些依赖关系: 问题是它正在为另一个项目工作(与这个项目具有相同的结构,但由于某种原因它在这里不起作用) 是否有任何遗漏或我可以找到问题并解决问题的地方?

  • 问题内容: 我试图写一个近似平方根的函数(我知道有数学模块……我想自己做),但我被浮点运算搞砸了。如何避免这种情况? 使用它会产生以下结果: 我意识到我可以使用,但是我希望能够做到这一点非常准确。我希望能够计算出6或7位数字。如果我四舍五入,那将是不可能的。我想了解如何在Python中正确处理浮点计算。 问题答案: 这实际上与Python无关- 使用硬件的二进制浮点算法,您会在任何语言中看到相同的

  • 因此,我正在尝试为我运行的一个小的subreddit编写一个可执行JAR。 我有一篇文章,Jsoup连接并读取了该页面上的所有URL。在另一种方法中,它然后连接到所有这些URL(只是帖子上的注释),并从注释中获取HTML并将其保存到HashMap。 这很好,但是我收到429 HTTP错误。因此,为了解决这个问题,我添加了一个短短的5秒等待。现在我得到一个“读取超时”。一旦我将时间降低到3秒,我就在

  • 问题内容: 我有一段这样的代码 当我输入的查询超过一个词,例如“狗”时,出现以下错误。 谁能指出我做错了什么?提前致谢。 问题答案: “狗”返回400错误的原因是因为您没有转义URL的字符串。 如果您这样做: 会的。 但是,我强烈建议您使用请求,而不要使用urllib / urllib2 / httplib。这要容易得多,它将为您处理所有这一切。 这是与python请求相同的代码:

  • 当方法调用的嵌套层级过深,导致栈空间耗尽时,会抛出StackOverflowError错误。 尝试复现问题,代码如下: