如何在达到 Twitter API 的限制时打破 while 循环?
How to break a while loop when reached limits on Twitter's API?
我正在编写一个程序来获取给定用户的关注者,然后使用关注者列表获取他们的关注者等等。到目前为止,我的代码如下所示:
import tweepy
import time
#insert your Twitter keys here
consumer_key ='key'
consumer_secret='secret'
access_token='accesstoken'
access_secret='accesssecret'
auth = tweepy.auth.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)
list= open('/home/acrocephalus/GitHub/TweetViz/list.txt','w')
if(api.verify_credentials):
print '-------------------------\n*** You are logged in ***\n-------------------------'
#Set starting Twitter handle
username = ['moixera']
user = tweepy.Cursor(api.followers, screen_name=username).items()
#Set the number of levels to follow
depth=3
#Start extracting each level followers
while depth != 0:
for handle in username:
print '\n\n Getting followers from: @' + handle+'\n\n'
user = tweepy.Cursor(api.followers, screen_name=handle).items()
while True:
try:
u = next(user)
list.write(u.screen_name +'\n')
print u.screen_name
except:
time.sleep(15*60)
print 'We have exceeded the rate limit. Sleeping for 15 minutes'
u = next(user)
list.write(u.screen_name +'\n')
print u.screen_name
username = list.read().splitlines()
print 'Moving to next username'
depth = depth-1
list.close()
问题是它从第一个用户开始,获得了她的关注者,但没有继续关注她的关注者列表。我认为问题出在 while
循环中。当它完成获取关注者时,它会跳转到 except
部分。期望的行为是,当它完成检索追随者时,它跳转到 for
循环的开头。当程序达到 Twitter 的 API 命中限制并因此超时 15 分钟时,程序应该跳转到 while
循环的 except
部分。谁能帮忙?
干杯!
丹妮
使用 for
循环而不是 while
循环:
user_list = open('/home/acrocephalus/GitHub/TweetViz/list.txt','w')
for user in tweepy.Cursor(api.followers, screen_name=handle).items():
user_list.write(user.screen_name +'\n')
print user.screen_name
N.B。不要使用 list
作为变量名,因为它隐藏了 list
内置函数。
我认为 API 对速率限制有一些支持,尽管我没有在文档中看到它的详细信息。您可以在使用 tweepy.API()
初始化时启用它,请参阅 wait_on_rate_limit
和 wait_on_rate_limit_notify
:
api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
快速浏览一下源代码表明 API 将根据从 Twitter 返回的 headers 计算出适当的等待时间,例如x-rate-limit-reset
,但我没有用过这个API所以我不能确定它是否有效。
您的代码还有其他问题,但是,这些问题超出了您的问题范围。
我正在编写一个程序来获取给定用户的关注者,然后使用关注者列表获取他们的关注者等等。到目前为止,我的代码如下所示:
import tweepy
import time
#insert your Twitter keys here
consumer_key ='key'
consumer_secret='secret'
access_token='accesstoken'
access_secret='accesssecret'
auth = tweepy.auth.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)
list= open('/home/acrocephalus/GitHub/TweetViz/list.txt','w')
if(api.verify_credentials):
print '-------------------------\n*** You are logged in ***\n-------------------------'
#Set starting Twitter handle
username = ['moixera']
user = tweepy.Cursor(api.followers, screen_name=username).items()
#Set the number of levels to follow
depth=3
#Start extracting each level followers
while depth != 0:
for handle in username:
print '\n\n Getting followers from: @' + handle+'\n\n'
user = tweepy.Cursor(api.followers, screen_name=handle).items()
while True:
try:
u = next(user)
list.write(u.screen_name +'\n')
print u.screen_name
except:
time.sleep(15*60)
print 'We have exceeded the rate limit. Sleeping for 15 minutes'
u = next(user)
list.write(u.screen_name +'\n')
print u.screen_name
username = list.read().splitlines()
print 'Moving to next username'
depth = depth-1
list.close()
问题是它从第一个用户开始,获得了她的关注者,但没有继续关注她的关注者列表。我认为问题出在 while
循环中。当它完成获取关注者时,它会跳转到 except
部分。期望的行为是,当它完成检索追随者时,它跳转到 for
循环的开头。当程序达到 Twitter 的 API 命中限制并因此超时 15 分钟时,程序应该跳转到 while
循环的 except
部分。谁能帮忙?
干杯!
丹妮
使用 for
循环而不是 while
循环:
user_list = open('/home/acrocephalus/GitHub/TweetViz/list.txt','w')
for user in tweepy.Cursor(api.followers, screen_name=handle).items():
user_list.write(user.screen_name +'\n')
print user.screen_name
N.B。不要使用 list
作为变量名,因为它隐藏了 list
内置函数。
我认为 API 对速率限制有一些支持,尽管我没有在文档中看到它的详细信息。您可以在使用 tweepy.API()
初始化时启用它,请参阅 wait_on_rate_limit
和 wait_on_rate_limit_notify
:
api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
快速浏览一下源代码表明 API 将根据从 Twitter 返回的 headers 计算出适当的等待时间,例如x-rate-limit-reset
,但我没有用过这个API所以我不能确定它是否有效。
您的代码还有其他问题,但是,这些问题超出了您的问题范围。