Обход ошибки 104 и ограничение скорости Twitter

Я работаю над исследовательским проектом, который включает анализ больших объемов данных из Twitter. Проект строится на Python с использованием Tweepy. Как вы можете себе представить, я должен очень тесно работать в рамках ограничения скорости Twitter. Таким образом, мой код аутентификации выглядит следующим образом.

auth1 = tweepy.OAuthHandler("...", "...")
auth1.set_access_token("...", "...")
api1 = tweepy.API(auth1, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)  

Который делает замечательную работу остановки и ожидания, прежде чем я превышаю свой лимит на запросы на небольшой уменьшенный пробег. Однако, когда я пытаюсь запустить программу на своем полном наборе данных, я в конечном итоге получаю эту ошибку, когда программа находится в спящем режиме:

tweepy.error.TweepError: Failed to send request: ('Connection aborted.', error(104, 'Connection reset by peer'))

Мое исследование говорит мне, что это происходит, потому что Твиттер отключается, и мне нужно поймать ошибку. Как бы я уловил эту ошибку, переподключился, и моя программа начала с того места, где она остановилась? Любой совет приветствуется.

2 ответа

Ошибка отключения твиттера - исключение сокета, которое является частным случаем исключений IOError. Чтобы поймать это, вам нужно сделать что-то вроде

auth = tweepy.OAuthHandler(… # set up your oauth here
try:
    stream = tweepy.Stream(auth=auth, listener=SomeListener()) # start the stream
except IOError, ex:
    print 'I just caught the exception: %s' % ex

Если это работает, оберните цикл True с увеличивающимся откатом, чтобы обеспечить некоторую паузу между повторным соединением. Ссылка на ссылку

Я также пытался таким же образом обернуть вызовы Tweepy в цикл True, но у меня также были проблемы с переподключениями (в некоторых случаях это решение не позволяет в равной степени решить проблему). В противном случае, я подумал, чтобы переключить Auth (подключенный к экземпляру Tweepy API, здесь "twapi") в случае ошибки, и, похоже, он работает правильно:

...
while True:
    try:
        users_stream = twapi.lookup_users(screen_names=[scrname_list_here])
    except tweepy.error.TweepError, ex:
        time.sleep(120)
        global twapi
        global switch_auth
        if switch_auth == False:
            twapi = tweepy.API(auths[auth_id+1])  
            switch_auth = True
        elif switch_auth == True:
            twapi = tweepy.API(auths[auth_id])    
            switch_auth = False
        continue
    break
 ...

Используя переменную bool switch_auth возможно (в случае возникновения ошибки Tweepy, связанной с неудачным переподключением) "переключить" аутентификационный ввод модуля API Tweepy (можно предположить, что он хранится в auths список), чтобы решить проблему. Тот же метод можно использовать для "переключения" аутентификации при достижении предела скорости исследования. Надеюсь, это будет полезно, просто попробуйте!

Другие вопросы по тегам