【问题标题】:twython search api rate limit: Header information will not be updatedtwython 搜索 api 速率限制:不会更新标头信息
【发布时间】:2014-07-16 22:34:53
【问题描述】:

我想处理 180 个请求/15 分钟的 Search-API 速率限制。我想出的第一个解决方案是检查标头中的剩余请求并等待 900 秒。看下面的sn-p:

results = search_interface.cursor(search_interface.search, q=k, lang=lang, result_type=result_mode)

while True:
    try:
        tweet = next(results)
        if limit_reached(search_interface):
            sleep(900)

        self.writer(tweet)


def limit_reached(search_interface):
    remaining_rate = int(search_interface.get_lastfunction_header('X-Rate-Limit-Remaining'))
    return remaining_rate <= 2

但似乎在到达剩余的两个请求后,标头信息并未重置为 180。

我想出的第二个解决方案是处理 twython 异常以限制速率并等待剩余时间:

results = search_interface.cursor(search_interface.search, q=k, lang=lang, result_type=result_mode)
while True:
    try:
        tweet = next(results)

        self.writer(tweet)
    except TwythonError as inst:
        logger.error(inst.msg)
        wait_for_reset(search_interface)
        continue
    except StopIteration:
        break


def wait_for_reset(search_interface):
      reset_timestamp = int(search_interface.get_lastfunction_header('X-Rate-Limit-Reset'))
      now_timestamp = datetime.now().timestamp()
      seconds_offset = 10

      t = reset_timestamp - now_timestamp + seconds_offset
      logger.info('Waiting {0} seconds for Twitter rate limit reset.'.format(t))
      sleep(t)

但是使用此解决方案,我收到此消息 INFO: Resetting dropped connection: api.twitter.com" 并且循环不会继续生成器的最后一个元素。有人遇到过同样的问题吗?

问候。

【问题讨论】:

    标签: python python-3.x twitter twython


    【解决方案1】:

    我的建议是自己限制速率(假设你不断达到限制......)

    QUERY_PER_SEC = 15*60/180.0  #180 per 15 minutes
    #~5 seconds per query
    class TwitterBot:
        last_update=0
        def doQuery(self,*args,**kwargs):
            tdiff = time.time()-self.last_update
            if tdiff < QUERY_PER_SEC:
                time.sleep(QUERY_PER_SEC-tdiff) 
            self.last_update = time.time()
            return search_interface.cursor(*args,**kwargs)
    

    【讨论】:

    • 我已经考虑过了。我是否正确,使用此解决方案我每 5 秒收到一条新的 Twitter 消息?这意味着,一天之内我可以获得 24*60*60 / 5 = 17280 条推文。那不是很多!您也对,这种方法对于未达到限制的关键字不是最佳的:/
    • 是的,这是最简单的答案...更复杂的是在过去 15 分钟内维护您自己的查询滑动窗口,当您等待 179 时...是的,因为我不知道您的域,您可能是对的……对于大多数我可能会使用它的应用程序来说,每天 17k 条推文似乎很多
    • 这是我在上面的sn-ps中所做的。函数 limit_reached 指示我是否达到了剩余空间的限制。这很好用。但是在 sleep 方法之后,剩余的请求仍然没有被重置。在界面中找到count参数:“每页返回的推文数,最多100条。”。这样就可以每 5 秒检索 100 条推文。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2016-05-20
    • 2012-03-08
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多