使用 tweepy 运行一个 Python 脚本,该脚本使用 twitter 流 API 随机获取英文推文并进行一分钟的流式传输,然后切换到使用 twitter 搜索 API 进行一分钟的搜索,然后返回。我发现的问题是,在大约 40 秒左右,流媒体会崩溃并给出以下错误:
完整的错误信息如下:
urllib3.exceptions.ProtocolError: ('Connection broken: IncompleteRead(0 bytes read)', IncompleteRead(0 bytes read))
读取的字节数量可能为 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()
为避免代码混乱,我删除了搜索功能和数据库处理方面的内容。
如果有人知道出现这种情况的原因以及我该如何解决,请告诉我,我会很感激。
我尝试过的解决方案:
在try/except块中使用http.client.IncompleteRead:
参考Error-while-fetching-tweets-with-tweepy
将Stall_Warning设置为True:
参考Incompleteread-error-when-retrieving-twitter-data-using-python
删除英语语言过滤。
def on_status(self, tweet):"
我提供的其他名称,如on_data/on_success,是该类型函数常用的替代名称。无论您选择什么名称,关键是在流处于活动状态时尽量减少对数据进行的处理强度,因为这可能会使其超载并导致崩溃。读取数据的任何函数都将被归类为“on_data”函数。 - Chris Cookman