使用tweepy中的Cursor处理速率限制异常

时间:2019-09-20 14:46:47

标签: python tweepy

在尝试使用Cursor对象遍历跟随者列表时,我试图找到正确的方法来处理速率限制。这是我正在尝试的:

while True:
    try:
        for follower in tweepy.Cursor(api.followers, id=root_usr).items():
            print(follower.id)
    except tweepy.TweepError:
        # hit rate limit, sleep for 15 minutes
        print('Rate limited. Sleeping for 15 minutes.')
        time.sleep(15 * 60 + 15)
        continue
    except StopIteration:
        break

这可能是不正确的,因为异常会使for循环从头开始。在所有root_usr的追随者中迭代同时处理速率限制问题的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

您可以在变量上构造 Cursor 实例并在 try-catch 中调用 next(cursor)。您可以通过这种方式处理 StopIteration 和 TweepError。

喜欢

cursor = tweepy.Cursor(api.followers, id=root_usr).items()
# or tweepy.Cursor(api.followers, id=root_usr).items().iter()
while True:
    try:
        follower = next(cursor)
        print(follower.id)
    except StopIteration:
        break
    except tweepy.TweepError:
        # Handle this, sleep, log, etc.
        pass

答案 1 :(得分:0)

code snippets section of the documentation 下有一个示例,建议创建一个包装函数来处理错误处理。

def limit_handled(cursor):
    while True:
        try:
            yield next(cursor)
        except tweepy.RateLimitError:
            time.sleep(15 * 60)
        except StopIteration:
            print("Done")
            break


for follower in limit_handled(tweepy.Cursor(api.followers, id=root_usr).items()):
    print(follower.id)

此外,我建议将计数设置为最大值 tweepy.Cursor(api.followers, id=root_usr, count=200).items(),以充分利用每个 API 调用。