我有这个代码来获取Twitter用户的关注者:
followers=[]
for user in tweepy.Cursor(api.followers,id=uNameInput).items():
followers.append(user.screen_name)
但是,如果对具有多个关注者的用户使用此选项,则脚本会获得速率限制并停止。我通常会把它放在一段时间之内;尝试,除了打破循环,但不确定在这种情况下它会去哪里。
答案 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