Обход ошибки 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
список), чтобы решить проблему. Тот же метод можно использовать для "переключения" аутентификации при достижении предела скорости исследования. Надеюсь, это будет полезно, просто попробуйте!