一分钟后无法停止流媒体播放

时间:2015-11-03 12:18:55

标签: python twitter tweepy

我正在尝试使用Stream.filter()方法将Twitter数据流式传输5分钟。我将检索到的推文存储在JSON文件中。问题是我无法从程序中停止filter()方法。我需要手动停止执行。我尝试使用时间包根据系统时间停止数据。我能够停止向JSON文件编写推文,但是流方法仍在继续,但它无法继续下一行代码。 我正在使用IPython笔记本来编写和执行代码。 这是代码:

auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)

from tweepy import Stream
from tweepy.streaming import StreamListener

class MyListener(StreamListener):

    def __init__(self, start_time, time_limit=60):
        self.time = start_time
        self.limit = time_limit

    def on_data(self, data):
        while (time.time() - self.time) < self.limit:
            try:
                saveFile = open('abcd.json', 'a')
                saveFile.write(data)
                saveFile.write('\n')
                saveFile.close()
                return True
            except BaseException as e:
                print 'failed ondata,', str(e)
                time.sleep(5)
        return True

    def on_status(self, status):
        if (time.time() - self.time) >= self.limit:
            print 'time is over'
            return false

    def on_error(self, status):
        if (time.time() - self.time) >= self.limit:
            print 'time is over'
            return false
        else:
            print(status)
            return True

start_time = time.time()
stream_data = Stream(auth, MyListener(start_time,20))
stream_data.filter(track=['name1','name2',...list ...,'name n'])#list of the strings I want to track

这些链接类似但我没有直接回答我的问题

Tweepy: Stream data for X minutes?

Stopping Tweepy steam after a duration parameter (# lines, seconds, #Tweets, etc)

Tweepy Streaming - Stop collecting tweets at x amount

我用这个链接作为参考, http://stats.seandolinar.com/collecting-twitter-data-using-a-python-stream-listener/

3 个答案:

答案 0 :(得分:17)

  1. 要关闭流,您需要从Falseon_data()返回on_status()

  2. 由于tweepy.Stream()本身会运行while循环,因此on_data()中不需要while循环。

  3. 初始化MyListener时,您没有调用父级的__init__方法,因此未正确初始化。

  4. 因此,对于您要做的事情,代码应该是这样的:

    class MyStreamListener(tweepy.StreamListener):
        def __init__(self, time_limit=60):
            self.start_time = time.time()
            self.limit = time_limit
            self.saveFile = open('abcd.json', 'a')
            super(MyStreamListener, self).__init__()
    
        def on_data(self, data):
            if (time.time() - self.start_time) < self.limit:
                self.saveFile.write(data)
                self.saveFile.write('\n')
                return True
            else:
                self.saveFile.close()
                return False
    
    myStream = tweepy.Stream(auth=api.auth, listener=MyStreamListener(time_limit=20))
    myStream.filter(track=['test'])
    

答案 1 :(得分:0)

访问变量myListener.running但不是直接将MyListener传递给Stream创建变量,如下所示:

myListener = MyListener()
timeout code here... suchas time.sleep(20)
myListener.running = False 

答案 2 :(得分:0)

所以,我也遇到了这个问题。幸运的是Tweepy是开源的,因此很容易深入研究这个问题。

基本上重要的是这里:

def _data(self, data):
    if self.listener.on_data(data) is False:
        self.running = False

在streaming.py中的Stream类

这意味着,要关闭连接,您只需要在侦听器的on_data()方法上返回false。