我有这个代码来获取 Twitter 用户的关注者:
followers=[]
for user in tweepy.Cursor(api.followers,id=uNameInput).items():
followers.append(user.screen_name)
但是,如果这用于具有多个关注者的用户,则脚本会获得速率限制并停止。我通常会在一段时间内把它说成是真的;尝试,除了其他中断循环,但不确定在这种情况下它会去哪里。
如果您想避免速率限制,您可以/应该在下一个关注页面请求之前等待:
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
并决定是等待还是继续。
希望有帮助。
使用新的 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)
这是我的代码
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