【发布时间】:2017-05-10 14:14:57
【问题描述】:
使用tweepy python 库,如何在 x 秒后停止流式推文?
来自tweepy.streaming 的StreamListener 不断收集数据,直到用户手动关闭程序。但是,我只想在用户定义的时间间隔内收集推文。
【问题讨论】:
-
很多人都有同样的问题,但没有合适的解决方案。所以我决定发布我自己的 hack 来解决这个问题。
使用tweepy python 库,如何在 x 秒后停止流式推文?
来自tweepy.streaming 的StreamListener 不断收集数据,直到用户手动关闭程序。但是,我只想在用户定义的时间间隔内收集推文。
【问题讨论】:
有多种方法可以解决这个问题——多线程和创建用户定义的StreamListener。我将重点介绍解决此问题的一种方法,并解释为什么我认为它是最好的。
除非您想覆盖内置功能(用于存储推文),否则无需创建任何用户定义的类实例
import tweepy
import time
from tweepy import Stream, StreamListener, OAuthHandler
'''Authenticate user'''
CONSUMER_KEY = 'xxxxxx'
CONSUMER_SECRET = 'xxxxxx'
auth = OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
'''How long do you want to stream tweets (in seconds)'''
runtime = 60 #this means one minute
'''Start streaming'''
twitterstream = Stream(auth, StreamListener())
twitterstream.filter(track=['twitter'], async=True) #apply any filter you want
time.sleep(runtime) #halts the control for runtime seconds
twitterstream.disconnect() #disconnect the stream and stop streaming
这是一个简单而优雅的解决方案,适用于所有流。不涉及(复杂的)多线程。
我在 stackoverflow 和许多其他网站上发现的另一种常见方法是在用户定义的 StreamListener 中启动一个计时器,并在 self.on_data() 方法中检查是否超过了时间限制。虽然这是对大容量流的巧妙破解,但它仅在流接收到推文时检查时间限制。如果您正在流式传输低容量流(当没有多少人使用您应用的过滤器发推文时),这可能是一个非常大的问题。
【讨论】: