Twitter流API-urllib3.exceptions.ProtocolError:('连接断开:IncompleteRead

时间:2018-11-15 19:45:21

标签: python twitter tweepy twitter-streaming-api

使用tweepy运行python脚本,该脚本在一分钟的英语推文样本中流式传输(使用twitter流式处理API)一分钟,然后交替搜索一分钟(使用twitter式搜索API),然后返回。我发现的问题是,大约40秒钟后,流媒体崩溃并出现以下错误:

完整错误:

  

urllib3.exceptions.ProtocolError:('连接断开:   IncompleteRead(读取0个字节)',IncompleteRead(读取0个字节))

读取的字节数可以在0到1000的范围内变化。

这是第一次看到流过早中断并且搜索功能提早开始,搜索功能完成后,它又回到流中,并且在第二次再次出现此错误时,代码崩溃。

我正在运行的代码是:

# 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的Try / Except块:
按照Error-while-fetching-tweets-with-tweepy

将Stall_Warning =设置为True:
按照Incompleteread-error-when-retrieving-twitter-data-using-python

删除英语过滤器。

2 个答案:

答案 0 :(得分:3)

已解决。

对于那些好奇的人或遇到类似问题的人:经过一番试验,我发现传入推文的积压是问题。每当系统收到一条推文时,我的系统都会运行一个实体识别和存储过程,这会花费一小段时间,并且在收集数百至数千条推文的过程中,此积压越来越大,直到API无法处理它并且抛出该错误。

解决方案::将您的“ on_status / on_data / on_success”功能剥离到基本要素上,并在流会话关闭后分别处理所有计算,即存储或实体标识。另外,您可以使计算效率更高,并让时间间隔变得不大,取决于您自己。

答案 1 :(得分:0)

我只是根据关注用户 Chris Cookman 的结果分享我的经验。按照他的建议去做后,我和你遇到的同样问题就消失了。但就我而言,我将它与 discord.py 一起使用。所以我所做的是创建一个通用列表 (status_list),每当 tweepy on_status 启动时,它就会附加到该通用列表中。

然后我设置一个@tasks.loop(seconds=10) 使用discord.py 来监控status_list 是否每隔几秒不为空,然后如果它检测到它有内容,它会循环遍历它然后在每个列表上启动进程。