使用tweepy和多个API密钥获取Twitter粉丝

时间:2013-12-06 15:29:30

标签: python twitter tweepy

我有多个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代码完成的,并且总是会尝试使用该代码。

我需要一种方法来旋转键并继续从前一个左侧开始。

2 个答案:

答案 0 :(得分:3)

您可以通过正在使用的迭代器上的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)

答案 1 :(得分:0)

我实际上不得不放弃使用cursored方法而转而手动设置下一个游标。关于这一点的好处是"非光学" method返回上一个和下一个光标作为其功能的一部分。

以下是我如何实现您的目标(注意:添加try / catch可能是有序的):

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.iterator.prev_cursor中。我认为这也是3.6.0的情况(见Cursor中的CursorIteratorcursor.py

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

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