Запуск сценария 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
Снятие фильтра английского языка.