Mar*_*tyn 5 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()
Run Code Online (Sandbox Code Playgroud)
这里的问题是每次我旋转键时,for循环从头开始并再次开始获得追随者.我试图绕过这个,但拆分for循环:
try:
items = tweepy.Cursor(api.followers, screen_name=s).items()
Run Code Online (Sandbox Code Playgroud)
然后我使用手动循环它们 next(items)
但是,旋转api键不起作用,因为初始调用是使用第一个API代码完成的,并且将始终尝试使用该API.
我需要一种方法来旋转键并继续前一个左侧.
实际上,我最终不得不放弃光标方法,转而手动设置下一个光标。这样做的好处是“非游标”方法返回上一个和下一个游标作为其函数的一部分。
\n\n这是我如何实现你想要的(注意:添加 try/catch 可能是有序的):
\n\nusers = [\'user_one\', \'user_two\', \'user_three\']\n\ncurrent_profile = 9 # I HAVE TEN IN AN ARRAY\n\ntweepy_api = get_api(auth_profiles[current_profile]) #A FUNCTION I CREATED TO REINITIALIZE API\'S\n\nfor user in users:\n\n next_cursor = -1 # START EVERY NEW USER RETRIEVAL WITH -1\n\n print \'CURRENT USER:\', user, \'STARTING CURSOR:\', next_cursor\n\n while next_cursor: # THAT IS, WHILE CURSOR IS NOT ZERO\n\n print \'AUTH PROFILE\', current_profile, \'CURRENT CURSOR:\', next_cursor\n\n # RETURNS A TUPLE WITH ELEMENT[0] A LIST OF IDS, ELEMENT [1][0] PREVIOUS CURSOR, AND ELEMENT[1][1] NEXT CURSOR\n ids, cursors = tweepy_api.followers_ids(screen_name=user, count=5000, cursor=next_cursor)\n\n next_cursor = cursors[1] # STORE NEXT CURSOR\n\n # FUNCTION I CREATED TO GET STATUS FROM API.rate_limit_status()\n status = get_rate_limit_status(tweepy_api, \'/followers/ids\')\n\n print \'ID\\\'S RETRIEVED:\', len(ids), \'NEXT CURSOR:\', cursors[1], \'REMAINING:\', status[\'remaining\']\n\n if not status[\'remaining\']: # IF STATUS IS REMAINING IS ZERO\n\n print \'\'\n print \'RATE LIMIT REACHED\'\n\n if current_profile < len(auth_profiles) - 1: # IF THE CURRENT PROFILE IS LESS THAN NINE (IN MY CASE)\n\n print \'INCREMENTING CURRENT PROFILE:\', current_profile, \'<\', len(auth_profiles) - 1\n\n current_profile += 1 # INCREMENT THE PROFILE\n\n print \'CURRENT PROFILE:\', current_profile\n\n else: # ELSE, IT MUST EQUAL NINE (COULD BE NEG I SUPPOSE BUT...)\n\n print \'RESETTING CURRENT PROFILE TO ZERO:\', current_profile, \'=\', len(auth_profiles) - 1\n\n current_profile = 0 # RESET CURRENT PROFILE TO THE BEGINNING\n\n print \'CURRENT PROFILE:\', current_profile\n\n tweepy_api = get_api(auth_profiles[current_profile]) # GET NEW TWEEPY API WITH NEW AUTH\n print \'\'\nRun Code Online (Sandbox Code Playgroud)\n\n输出应该是这样的(为了简单起见,我删除了一些打印语句):
\n\nCURRENT USER: user_one STARTING CURSOR: -1\nAUTH PROFILE 9 CURRENT CURSOR: -1\n\nID\'S RETRIEVED: 5000 NEXT CURSOR: 1594511885763407081 REMAINING: 14\n\xe2\x80\xa6\nID\'S RETRIEVED: 5000 NEXT CURSOR: 1582249691352919104 REMAINING: 0\n\nRATE LIMIT REACHED\nRESETTING CURRENT PROFILE TO ZERO: 9 = 9\nCURRENT PROFILE: 0\n\nID\'S RETRIEVED: 5000 NEXT CURSOR: 1580277475971792716 REMAINING: 14\n\xe2\x80\xa6\nID\'S RETRIEVED: 4903 NEXT CURSOR: 0 REMAINING: 7\n\nCURRENT USER: user_two STARTING CURSOR: -1\nAUTH PROFILE 0 CURRENT CURSOR: -1\n\nID\'S RETRIEVED: 5000 NEXT CURSOR: 1592820762836029887 REMAINING: 6\n\xe2\x80\xa6\nID\'S RETRIEVED: 5000 NEXT CURSOR: 1592737463603654258 REMAINING: 0\n\nRATE LIMIT REACHED\nINCREMENTING CURRENT PROFILE: 0 < 9\nCURRENT PROFILE: 1\nRun Code Online (Sandbox Code Playgroud)\n\n附带说明一下,如果您要使用游标版本,至少在 Tweepy 3.5.0 中,prev_cursor 和 next_cursor 存储在cursor.iterator.next_cursor、cursor.iterator.prev_cursor 中。我认为 3.6.0 也是如此(请参阅cursor.py中的Cursor和CursorIterator)
\n\n对我来说,cursor.page_iterator.next_cursor 返回:
\n\nAttributeError: \'Cursor\' object has no attribute \'page_iterator\'\nRun Code Online (Sandbox Code Playgroud)\n
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)
Run Code Online (Sandbox Code Playgroud)