API потоковой передачи Twitter: «Соединение прервано: IncompleteRead»

Я транслирую некоторые данные из Twitter через Streaming API на Python и Tweepy. Код можно увидеть ниже:

class TwitterStreamer():

    def __init__(self):
        pass

    def stream_tweets(self, twitter_data_title, key_words):
        # This handles Twitter authetification and the connection to Twitter Streaming API
        listener = StreamListener(twitter_data_title)
        auth = tweepy.OAuthHandler(api_key, api_secret_key)
        auth.set_access_token(access_token, access_secret_token)
        stream = tweepy.Stream(auth, listener)

        # This line filter Twitter Streams to capture data by the keywords: 
        stream.filter(track=key_words)

class StreamListener(tweepy.StreamListener):

    def __init__(self, twitter_data_title):
        self.fetched_tweets_filename = twitter_data_title

    def on_data(self, data):
        try:
            print(data)
        
            with open(self.fetched_tweets_filename, 'a') as tf:
                tf.write(data)
            return True
        except BaseException as e:
            print("Error on_data %s" % str(e))
        return True
      
    def on_error(self, status):
        print(status)


if __name__ == '__main__':
    twitter_streamer = TwitterStreamer()

Однако через некоторое время я всегда получаю сообщение об ошибке «Соединение прервано: IncompleteRead». Мне кажется, эта проблема может быть связана с более ранним сообщением (Twitter Streaming API - urllib3.exceptions.ProtocolError: ('Соединение прервано: IncompleteRead), однако я не понимаю, как он решил проблему. Как я могу отключить функцию таким образом, чтобы это стало менее затратным в вычислительном отношении?

Большое спасибо!


person Student    schedule 01.07.2021    source источник


Ответы (1)


Это была постоянная проблема при использовании API потоковой передачи Twitter на Tweepy (я не могу подтвердить, происходит ли это где-либо еще), с которой я также столкнулся.

Я потратил дни, пытаясь понять, как это исправить, но настоящего решения нет.

Вместо этого я использовал супервизор программы под названием Immortal, который немедленно перезапустил программу, если она остановилась. Я использую его уже больше года и у меня не было проблем с ним, он сразу же перезапускает мои программы.

После установки вы можете использовать его, просто набрав immortal, а затем добавив остальную часть вашей команды, например:

immortal python3 twitterbot.py

Когда ваша программа неизбежно выдает ошибку IncompleteRead, Immortal сразу же запустит ее!

person pigeonburger    schedule 02.07.2021