使用tweepy和多个API密钥获得twitter追随者



我有多个twitter开发密钥,用于从句柄列表中获取关注者。我有两种方法可以做到这一点,但两者都有问题。第一:

try:
    ....
    for user in tweepy.Cursor(api.followers, screen_name=screenName).items():
    ....
except tweepy.TweepError as e:
    errorCode = e.message[0]['code']
        if errorCode == 88:
            print "Rate limit exceeded."
            rotateKeys()

这里的问题是,每次我旋转关键点时,for循环都会从头开始,并再次获得关注者。我试图绕过这一点,但将for循环拆分:

try:
    items = tweepy.Cursor(api.followers, screen_name=s).items()

然后,我使用next(items) 手动循环浏览它们

然而,旋转api键不起作用,因为最初的调用是用第一个api代码完成的,并且将始终尝试使用该代码。

我需要一种方法来旋转关键点并从前面的左边继续。

实际上我不得不放弃cursored方法,转而手动设置下一个光标。这样做的好处是"非游标"方法返回上一个和下一个游标作为其函数的一部分。

以下是我如何实现您的目标(注意:添加尝试/捕获可能是为了实现):

users = ['user_one', 'user_two', 'user_three']
current_profile = 9 # I HAVE TEN IN AN ARRAY
tweepy_api = get_api(auth_profiles[current_profile]) #A FUNCTION I CREATED TO REINITIALIZE API'S
for user in users:
    next_cursor = -1 # START EVERY NEW USER RETRIEVAL WITH -1
    print 'CURRENT USER:', user, 'STARTING CURSOR:', next_cursor
    while next_cursor: # THAT IS, WHILE CURSOR IS NOT ZERO
        print 'AUTH PROFILE', current_profile, 'CURRENT CURSOR:', next_cursor
        # RETURNS A TUPLE WITH ELEMENT[0] A LIST OF IDS, ELEMENT [1][0] PREVIOUS CURSOR, AND ELEMENT[1][1] NEXT CURSOR
        ids, cursors = tweepy_api.followers_ids(screen_name=user, count=5000, cursor=next_cursor)
        next_cursor = cursors[1] # STORE NEXT CURSOR
        # FUNCTION I CREATED TO GET STATUS FROM API.rate_limit_status()
        status = get_rate_limit_status(tweepy_api, '/followers/ids')
        print 'ID'S RETRIEVED:', len(ids), 'NEXT CURSOR:', cursors[1], 'REMAINING:', status['remaining']
        if not status['remaining']: # IF STATUS IS REMAINING IS ZERO
            print ''
            print 'RATE LIMIT REACHED'
            if current_profile < len(auth_profiles) - 1: # IF THE CURRENT PROFILE IS LESS THAN NINE (IN MY CASE)
                print 'INCREMENTING CURRENT PROFILE:', current_profile, '<', len(auth_profiles) - 1
                current_profile += 1 # INCREMENT THE PROFILE
                print 'CURRENT PROFILE:', current_profile
            else: # ELSE, IT MUST EQUAL NINE (COULD BE NEG I SUPPOSE BUT...)
                print 'RESETTING CURRENT PROFILE TO ZERO:', current_profile, '=', len(auth_profiles) - 1
                current_profile = 0 # RESET CURRENT PROFILE TO THE BEGINNING
                print 'CURRENT PROFILE:', current_profile
            tweepy_api = get_api(auth_profiles[current_profile]) # GET NEW TWEEPY API WITH NEW AUTH
            print ''

输出应该是这样的(为了简单起见,我删除了一些打印语句):

CURRENT USER: user_one STARTING CURSOR: -1
AUTH PROFILE 9 CURRENT CURSOR: -1
ID'S RETRIEVED: 5000 NEXT CURSOR: 1594511885763407081 REMAINING: 14
…
ID'S RETRIEVED: 5000 NEXT CURSOR: 1582249691352919104 REMAINING: 0
RATE LIMIT REACHED
RESETTING CURRENT PROFILE TO ZERO: 9 = 9
CURRENT PROFILE: 0
ID'S RETRIEVED: 5000 NEXT CURSOR: 1580277475971792716 REMAINING: 14
…
ID'S RETRIEVED: 4903 NEXT CURSOR: 0 REMAINING: 7
CURRENT USER: user_two STARTING CURSOR: -1
AUTH PROFILE 0 CURRENT CURSOR: -1
ID'S RETRIEVED: 5000 NEXT CURSOR: 1592820762836029887 REMAINING: 6
…
ID'S RETRIEVED: 5000 NEXT CURSOR: 1592737463603654258 REMAINING: 0
RATE LIMIT REACHED
INCREMENTING CURRENT PROFILE: 0 < 9
CURRENT PROFILE: 1

顺便说一句,如果你要使用游标版本,至少在Tweepy 3.5.0中,prev_cursor和next_cursor存储在cursor.iterator.next_cursor、cursor.iternator.prev_cursor中。我认为3.6.0的情况也是如此(请参阅cursor.py中的cursor和CursorIterator)

对我来说,cursor.page_iterator.next_cursor返回:

AttributeError: 'Cursor' object has no attribute 'page_iterator'

您可以通过正在使用的迭代器上的next_cursor变量获取发生速率限制时使用的光标。当您使用新的API实例创建新的Cursor时,您可以将上一个游标作为参数传递:

current_cursor = cursor.iterator.next_cursor
# re-create the cursor using the new api instance
cursor = tweepy.Cursor(api.followers, screen_name=s, cursor=current_cursor)

最新更新