【问题标题】:How to break a while loop when reached limits on Twitter's API?达到 Twitter API 的限制时如何打破 while 循环?
【发布时间】:2015-07-24 20:42:29
【问题描述】:

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

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 部分。任何人都可以帮忙吗? 干杯!

丹妮

【问题讨论】:

    标签: python twitter tweepy


    【解决方案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
    

    注意不要使用 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,所以我不能确定它是否有效。

    您的代码还有其他问题,但是,这些问题超出了您的问题范围。

    【讨论】:

    • 谢谢 mhawke,我会试试你的建议。您还发现了哪些其他问题?
    • 不用担心。我可以确认 api 将在达到速率限制时等待。其他问题:@tswei 指出的深度处理;用户列表文件以只写方式打开,因此后续的username = list.read().splitlines() 将失败。即使以附加模式打开,您也需要查找(0)文件,然后读取到第一个未处理用户所在的位置。我不认为文件在这里有用,也许列表或字典会更好。
    • 你能解释一下seek(0)是什么意思吗?
    • 谢谢 mhawke。我已经尝试过您的解决方案并且它有效。现在我正在处理检索到的用户名的循环。
    猜你喜欢
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    相关资源
    最近更新 更多