2

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

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

但是,如果这用于具有多个关注者的用户,则脚本会获得速率限制并停止。我通常会在一段时间内把它说成是真的;尝试,除了其他中断循环,但不确定在这种情况下它会去哪里。

4

3 回答 3

1

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

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

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

UPD:根据官方twitter 限制,每 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并决定是等待还是继续。

希望有帮助。

于 2013-08-05T08:26:10.713 回答
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)
于 2014-07-05T16:42:48.423 回答
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
于 2014-08-07T09:49:57.357 回答