tweepy wait_on_rate_limit无效

时间:2016-05-16 07:41:52

标签: python twitter tweepy

所以,首先,我意识到有关处理Twitter速率限制的一些问题。我不明白为什么,但到目前为止,我找到的那些都没有为我工作。

我正在使用tweepy。我正在尝试获取用户关注者的所有关注者列表。正如预期的那样,由于Twitter的速率限制,我不能一下子把所有东西都拉下来。我安装了tweepy v 3.5,因此指的是http://docs.tweepy.org/en/v3.5.0/api.html。要获取我使用的原始用户的关注者列表:

auth = tweepy.OAuthHandler(consumer_key,consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)

followerIDs = []
for page in tweepy.Cursor(api.followers_ids, screen_name=originatingUser, wait_on_rate_limit = True, wait_on_rate_limit_notify = True).pages():
    followerIDs.extend(page)

粉丝= api.lookup_users(粉丝)

这样做有点但很快变成:

tweepy.error.TweepError: [{u'message': u'Rate limit exceeded', u'code': 88}]

我的理论是,然后使用以下内容为每个followerID检索每个用户的关注者:

for followerID in followerIDs:
        for page in tweepy.Cursor(api.followers_ids, id=followerID, wait_on_rate_limit = True, wait_on_rate_limit_notify = True).pages():
                followerIDs.extend(page)

我遇到的另一个问题是当我试图查找用户名时。为此,它使用itertools的grouper函数将关注者分成100组(api.lookup_users一次只能接受100个id)并使用

followerIDs = grouper(followerIDs,100)
for followerGroup in followerIDs:
        followerGroup=filter(None, followerGroup)
        followers = api.lookup_users(followerGroup,wait_on_rate_limit = True)
        for follower in followers:
                print (originatingUser + ", " + str(follower.screen_name))

这会产生不同的错误,即:

 TypeError: lookup_users() got an unexpected keyword argument 'wait_on_rate_limit'

我发现这令人困惑,因为tweepy api suggests应该是一个被接受的论点。

关于我做错了什么的想法?

干杯 本。

3 个答案:

答案 0 :(得分:2)

我知道这可能有点晚了,但现在就去了。

您在wait_on_rate_limit构造函数中传递Cursor参数,而tweepy文档声明它应该在API()构造函数上传递。

答案 1 :(得分:0)

这里提到的twitter API有一个速率限制:https://dev.twitter.com/rest/public/rate-limiting

通过此快速解决方案可能会捕获速率限制错误并暂停您的应用程序一段时间,然后继续您离开的位置。

pages = tweepy.Cursor(api.followers_ids, id=followerID).pages()
while True:
    try:
        page = pages.next()
        followerIDs.extend(page)
    except TweepError:
        time.sleep(60 * 15)
        continue
    except StopIteration:
        break

应该做的伎俩。不确定这是否会按预期工作,但基本的想法是这样。

答案 2 :(得分:0)

wait_on_rate_limit argument 将在 API() 构造函数中传递。 在您的代码中,它看起来像:

api = tweepy.API(auth,wait_on_rate_limit=True)

还有另一个参数 wait_on_rate_limit_notify,它会在 tweepy 等待您的速率限制刷新时通知您。两者相加最终会成为一行:

api = tweepy.API(auth,wait_on_rate_limit=True,wait_on_rate_limit_notify=True)