2017-02-06 11 views
1

Я использую nirgs forked version of Tweepy, что мне нужно использовать для получения твитов между 2017-01-31 и 2017-02-01. Мой код работает, и из-за ограничений скорости Twitters мне приходится переключаться между несколькими обработчиками auth, чтобы иметь возможность работать с твитами, даты которых находятся так далеко, как упоминалось ранее. Я использую this instruction, но после достижения Rate Limit и пытается перейти к следующему обработчику Идент с помощью api.auth_idx += 1 я получаю следующее сообщение об ошибке:Tweepy multi auth handler

File "build/bdist.macosx-10.11-intel/egg/tweepy/api.py", line 45, in auth_idx 
IndexError: Index out of bounds 

Основной код выглядит примерно так:

oauth_keys = [["consumer_key_1", "consumer_secret_1", "access_token_1", "access_token_secret_1"], ["consumer_key_2", "consumer_secret_2", "access_token_2", "access_token_secret_2"]] 

auths = [] 
for consumer_key, consumer_secret, access_key, access_secret in oauth_keys: 
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret) 
    auth.set_access_token(access_key, access_secret) 
    auths.append(auth) 

api = tweepy.API(auths, monitor_rate_limit=True) 

while True: 
    try: 
     for tweet in tweepy.Cursor(api.search, q='bitcoin', since=datetime.date(2017, 1, 31), lang='en').items(3000): 
      ... 
    except tweepy.TweepError as e: 
     api.auth_idx += 1 
     continue 

Я не знаю, что я делаю неправильно. Любая помощь очень ценится!

ответ

2

Вот решение.

Ошибка заключалась в индексировании самого объекта. Я должен был создать переменную в качестве индекса:

switch += 1 
api.auth_idx = switch 

А вот полный код, в случае, если кто-то попытается построить такое же приложение:

oauth_keys = [ 
    ["consumer_key_1", "consumer_secret_1", "access_token_1", "access_token_secret_1"], 
    ["consumer_key_2", "consumer_secret_2", "access_token_2", "access_token_secret_2"] 
    ] 

auths = [] 
for consumer_key, consumer_secret, access_key, access_secret in oauth_keys: 
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret) 
    auth.set_access_token(access_key, access_secret) 
    auths.append(auth) 

# api 
api = tweepy.API(auths) 
currentCursor = tweepy.Cursor(api.search, q = 'bitcoin', since='2017-02-01', until='2017-02-02', lang='en') 
c = currentCursor.items() 

switch = 0 
api.auth_idx = switch 
tweets = [] 
early_dt_val = datetime.datetime.strptime('2017-01-31 22:34:48', '%Y-%m-%d %H:%M:%S') 
later_dt_val = datetime.datetime.strptime('2017-02-01 01:25:30', '%Y-%m-%d %H:%M:%S') 
maxId = 0 

while True: 
    try: 
     #for tweet in tweepy.Cursor(api.search, q='bitcoin', since=datetime.date(2017, 1, 31), lang='en').items(3000) 
     for tweet in c: 
      tweets.append(tweet) 
      maxId = tweet.id 

     for tweet in reversed(tweets): 
      tweetTime = tweet.created_at 
      if tweetTime < later_dt_val and tweetTime > early_dt_val: 
       print('Date: ' + str(tweet.created_at)) 
       print('Tweet: ' + tweet.text) 

    except tweepy.TweepError as e: 
     print e 
     print "---------------------------Rate limit exceeded.---------------------------" 
     print "switching keys..." 
     switch += 1 
     if switch > 4: 
      print "Limit reached" 
      break 
     else: 
      api.auth_idx = switch   # naechster Key 
      currentCursor = tweepy.Cursor(api.search, q='bitcoin', since='2017-02-01', until='2017-02-02', lang='en', max_id=maxId) 
+1

выглядит хорошо для меня, хотя вы можете просто хотите для инициализации объекта API с параметрами блокировки/ожидания, как показано ниже, а не для обработки самого переключения: 'api = tweepy.API (auths, retry_count = 3, retry_delay = 5, retry_errors = set ([401, 404, 500, 503]), monitor_rate_limit = True, wait_on_rate_limit = True) ' В любом случае это нормально. – nirg