API потоковой передачи Twitter - urllib3.exceptions.ProtocolError: ('Соединение разорвано: IncompleteRead - PullRequest
0 голосов
/ 15 ноября 2018

Запуск сценария Python с использованием tweepy, который в течение минуты (используя API потокового твиттера) в произвольной выборке английских твитов в течение минуты, а затем в течение минуты чередует поиск (используя API поиска в твиттере) и затем возвращает результат. Проблема, которую я обнаружил, заключается в том, что примерно через 40 с лишним секунд потоковая передача прекращается и выдает следующую ошибку:

Полная ошибка:

urllib3.exceptions.ProtocolError: ('Соединение разорвано: IncompleteRead (0 байт прочитано) ', IncompleteRead (0 байт прочитано))

Количество прочитанных байтов может варьироваться от 0 до нуля в тысячах.

В первый раз, когда это замечено, потоковая передача прерывается преждевременно, и функция поиска запускается рано, после того, как функция поиска завершена, она возвращается к потоку еще раз, и при повторном появлении этой ошибки происходит сбой кода.

Код, который я использую:

# Handles date time calculation
def calculateTweetDateTime(tweet):
    tweetDateTime = str(tweet.created_at)

    tweetDateTime = ciso8601.parse_datetime(tweetDateTime)
    time.mktime(tweetDateTime.timetuple())
    return tweetDateTime

# Checks to see whether that permitted time has past.
def hasTimeThresholdPast():
    global startTime
    if time.clock() - startTime > 60:
        return True
    else:
        return False

#override tweepy.StreamListener to add logic to on_status
class StreamListener(StreamListener):

    def on_status(self, tweet):
        if hasTimeThresholdPast():
            return False

        if hasattr(tweet, 'lang'):
            if tweet.lang == 'en':

                try:
                    tweetText = tweet.extended_tweet["full_text"]
                except AttributeError:
                    tweetText = tweet.text

                tweetDateTime = calculateTweetDateTime(tweet)

                entityList = DataProcessing.identifyEntities(True, tweetText)
                DataStorage.storeHotTerm(entityList, tweetDateTime)
                DataStorage.storeTweet(tweet)


    def on_error(self, status_code):
        def on_error(self, status_code):
            if status_code == 420:
                # returning False in on_data disconnects the stream
                return False


def startTwitterStream():

    searchTerms = []

    myStreamListener = StreamListener()
    twitterStream = Stream(auth=api.auth, listener=StreamListener())
    global geoGatheringTag
    if geoGatheringTag == False:
        twitterStream.filter(track=['the', 'this', 'is', 'their', 'though', 'a', 'an'], async=True, stall_warnings=True)

    if geoGatheringTag == True:
        twitterStream.filter(track=['the', 'this', 'is', 'their', 'though', 'a', 'an', 'they\'re'],
                             async=False, locations=[-4.5091, 55.7562, -3.9814, 55.9563], stall_warnings=True)



# ----------------------- Twitter API Functions ------------------------
# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# --------------------------- Main Function ----------------------------

startTime = 0


def main():
    global startTime
    userInput = ""
    userInput.lower()
    while userInput != "-1":
        userInput = input("Type ACTiVATE to activate the Crawler, or DATABASE to access data analytic option (-1 to exit): \n")
        if userInput.lower() == 'activate':
            while(True):
                startTime = time.clock()

                startTwitterStream()

                startTime = time.clock()
                startTwitterSearchAPI()

if __name__ == '__main__':
    main() 

Я сократил функцию поиска и аспекты обработки базы данных, учитывая, что они разделены и чтобы не загромождать код.

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


Решения, которые я пробовал:
Попробуйте / исключите блок с http.client.IncompleteRead:
Согласно Ошибка при получении твитов с твипи

Установка Stall_Warning = на True:
Согласно Неполная непрочитанная ошибка при получении-twitter-data-using-python

Снятие фильтра английского языка.

1 Ответ

0 голосов
/ 17 ноября 2018

решаемая.

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

Решение: Обрезать вашу функцию "on_status / on_data / on_success" до базовых элементов и обрабатывать любые вычисления, т.е. сохранение или идентификацию объекта, отдельно после закрытия сеанса потоковой передачи. В качестве альтернативы вы могли бы сделать свои вычисления намного более эффективными и сделать разрыв во времени несущественным, до вас.

...