【问题标题】:Tweepy error with response status code 429响应状态代码为 429 的 Tweepy 错误
【发布时间】:2018-05-26 20:02:50
【问题描述】:

我正在使用 tweepy API 来提取推文并将其显示在网页上。尽管我每 1 小时自动刷新一次代码以提取推文,但在代码连续运行大约 24 小时后,我最终得到了以下 TweepError。 错误:

tweepy.error.TweepError:Twitter 错误响应:状态码 = 429

我了解此代码意味着对 API 的请求过多。有没有办法处理这个错误?我什至尝试将刷新率间隔增加到 2 小时,但似乎仍然不起作用。

以下是提取推文并存储在 CSV 中的代码:

def extract_tweet(self):
   consumer_key = 'XXX'
   consumer_secret = 'XXX'
   access_token = 'YYY'
   access_token_secret = 'YYY'

   auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
   auth.set_access_token(access_token, access_token_secret)

   api = tweepy.API(auth)

   csvFile = open('HELLOTWITTER.csv', 'w',  newline='', encoding='utf-8')
   csvWriter = csv.writer(csvFile)
   for tweet in tweepy.Cursor(api.search,q="#cybersecurity OR #InfoSec", since="2017-10-20",lang="en").items(10):    
       csvWriter.writerow([tweet.text, tweet.created_at])
   csvFile.close()

我查看了 API 文档并偶然发现了 wait_on_rate_limit,但不明白这是否是解决此错误的方法。 请帮忙!谢谢。

【问题讨论】:

  • 你可以Retrying包。它有很多选项来处理发生错误时的重试行为。
  • @GarbageCollector :那个包看起来是个不错的解决方案!但我无法将它写入我的代码。你能告诉我如何将它集成到问题中的功能中吗?

标签: python tweepy


【解决方案1】:

有几个选项可以实现重试装饰器。重试装饰器查看方法中是否引发异常。以下示例使用指数退避重试。这将在每次重试之间等待 2^x * 1000 毫秒,最多 10 秒,然后再等待 10 秒,其中 x 是重试尝试的次数。

from retrying import retry

@retry(wait_exponential_multiplier=1000, wait_exponential_max=10000)
def extract_tweet(self):
    consumer_key = 'XXX'
    consumer_secret = 'XXX'
    access_token = 'YYY'
    access_token_secret = 'YYY'

    try:
        auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
        auth.set_access_token(access_token, access_token_secret)

        api = tweepy.API(auth)

        csvFile = open('HELLOTWITTER.csv', 'w',  newline='', encoding='utf-8')
        csvWriter = csv.writer(csvFile)

        for tweet in tweepy.Cursor(api.search,q="#cybersecurity OR #InfoSec", since="2017-10-20",lang="en").items(10):    
          csvWriter.writerow([tweet.text, tweet.created_at])
          csvFile.close()
    except tweepy.error.TweepError:
          raise

【讨论】:

  • 将 csvFile.close() 与循环结束对齐。因此得到“对已关闭文件的 I/O 操作”
猜你喜欢
  • 1970-01-01
  • 2017-06-06
  • 2018-04-27
  • 1970-01-01
  • 2021-05-17
  • 2020-02-20
  • 1970-01-01
  • 2015-04-10
  • 2021-10-21
相关资源
最近更新 更多