如何在Twitter的API达到限制时打破while循环?

时间:2015-07-24 11:48:36

标签: python twitter tweepy

我正在编写一个程序来获取给定用户的关注者,然后使用关注者列表来获取他们的关注者等等。到目前为止我的代码如下所示:

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命中限制时,该程序应跳转到except循环的while部分,因此超时15分钟。有人可以帮忙吗? 干杯!

达尼

1 个答案:

答案 0 :(得分:1)

使用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_limitwait_on_rate_limit_notify

api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)

对源代码的快速浏览表明API将基于从Twitter返回的标头找出适当的等待期,例如: x-rate-limit-reset,但我没有使用此API,因此我无法确定它是否有效。

您的代码还存在其他问题,但这些问题超出了您的要求。