Tweepy Hipchat API - 速率限制除外?

时间:2013-08-05 08:16:55

标签: python twitter tweepy

我有这个代码来获取Twitter用户的关注者:

followers=[]
for user in tweepy.Cursor(api.followers,id=uNameInput).items():
    followers.append(user.screen_name)

但是,如果对具有多个关注者的用户使用此选项,则脚本会获得速率限制并停止。我通常会把它放在一段时间之内;尝试,除了打破循环,但不确定在这种情况下它会去哪里。

3 个答案:

答案 0 :(得分:1)

如果您想避免速率限制,您可以/应该在下一个关注页面请求之前等待:

for user in tweepy.Cursor(api.followers, id=uNameInput).items():
    followers.append(user.screen_name)
    time.sleep(60)

看起来不漂亮,但应该有帮助。

UPD:根据官方twitter limits,您每15分钟只能发出30个请求才能获得followers

因此,您可以捕获速率限制异常并等待15分钟间隔结束,或者定义计数器并确保每15分钟间隙不超过30个请求。

以下是一个示例,如何捕获tweepy异常并等待15分钟后再转移到下一部分关注者:

import time
import tweepy

auth = tweepy.OAuthHandler(..., ...)
auth.set_access_token(..., ...)

api = tweepy.API(auth)
items = tweepy.Cursor(api.followers, screen_name="gvanrossum").items()

while True:
    try:
        item = next(items)
    except tweepy.TweepError:
        time.sleep(60 * 15)
        item = next(items)

    print item

不确定这是最好的方法。

UPD2:还有另一种选择:您可以查看rate_limit_status,查看followers的剩余请求数量,并决定是等待还是继续。

希望有所帮助。

答案 1 :(得分:0)

使用新的rate_limit_status'reset属性有一种更精确的方法。虽然@ alecxe的回答迫使你每次等待15分钟,即使窗口小得多,你也可以等待恰当的时间而不再做:

import time
import tweepy
import calendar
import datetime

auth = tweepy.OAuthHandler(..., ...)
auth.set_access_token(..., ...)

api = tweepy.API(auth)
items = tweepy.Cursor(api.followers, screen_name="gvanrossum").items()

while True:
    try:
        item = next(items)
    except tweepy.TweepError:
        #Rate limited. Checking when to try again
        rate_info = api.rate_limit_status()['resources']
        reset_time = rate_info['followers']['/followers/ids']['reset']
        cur_time = calendar.timegm(datetime.datetime.utcnow().timetuple())
        #wait the minimum time necessary plus a few seconds to be safe
        try_again_time = reset_time - cur_time + 5
        #Will try again in try_again_time seconds...
        time.sleep(try_again_time)

答案 2 :(得分:0)

这是我的代码

try:
    followers=[]
    for user in tweepy.Cursor(api.followers,id=uNameInput).items():
        followers.append(user.screen_name)
except: 
    errmsg = str(sys.exc_info()[1])
    printdebug(errmsg)
    if errmsg.find("'code': 88") != -1: # [{'message': 'Rate limit exceeded', 'code': 88}]
        print("Blocked.")
        time.sleep(60 * 60) # Wait 1 hour for unblock
        pass
    else:
        raise