python搜索api速率限制:标题信息将不会更新



我想处理180个请求/15分钟的搜索api速率限制。我想到的第一个解决方案是检查报头中剩余的请求并等待900秒。请看下面的代码片段:

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。

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

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: reset dropped connection: api.twitter.com",循环将不会继续与生成器的最后一个元素。有人遇到过同样的问题吗?

致意。

我的建议是限制自己的速度(假设你经常达到极限…)

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)

最新更新