我有多个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代码完成的,并且总是会尝试使用该代码。
我需要一种方法来旋转键并继续从前一个左侧开始。
答案 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中的CursorIterator和cursor.py)
对我来说,cursor.page_iterator.next_cursor返回:
AttributeError: 'Cursor' object has no attribute 'page_iterator'