Python 一分钟后无法停止tweepy中的流

Python 一分钟后无法停止tweepy中的流,python,twitter,tweepy,Python,Twitter,Tweepy,我正在尝试使用stream.filter()方法将twitter数据流化5分钟。我将检索到的tweet存储在一个JSON文件中。问题是我无法在程序中停止filter()方法。我需要手动停止执行。我尝试使用时间包根据系统时间停止数据。我能够停止向JSON文件写入tweet,但stream方法仍在继续,但无法继续下一行代码。 我正在使用IPython笔记本编写和执行代码。 代码如下: auth = OAuthHandler(consumer_key, consumer_secret) auth.se

我正在尝试使用stream.filter()方法将twitter数据流化5分钟。我将检索到的tweet存储在一个JSON文件中。问题是我无法在程序中停止filter()方法。我需要手动停止执行。我尝试使用时间包根据系统时间停止数据。我能够停止向JSON文件写入tweet,但stream方法仍在继续,但无法继续下一行代码。 我正在使用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
auth=OAuthHandler(使用者密钥,使用者密钥)
授权设置访问令牌(访问令牌,访问密钥)
api=tweepy.api(auth)
从tweepy导入流
从tweepy.streaming导入StreamListener
类MyListener(StreamListener):
定义初始时间(自身、开始时间、时间限制=60):
self.time=开始时间
self.limit=时间限制
def on_数据(自身、数据):
while(time.time()-self.time)=self.limit:
打印“时间已过”
返回错误
def on_错误(自身、状态):
如果(time.time()-self.time)>=self.limit:
打印“时间已过”
返回错误
其他:
打印(状态)
返回真值
开始时间=time.time()
stream\u data=stream(auth,MyListener(开始时间,20))
stream_data.filter(track=['name1','name2',…list…,'name n'])#我要跟踪的字符串列表
这些链接是相似的,但我不直接回答我的问题

我用这个链接作为参考,

  • 要关闭流,您需要从\u data()上的
    或\u status()上的
    返回
    False

  • 因为
    tweepy.Stream()
    本身运行一个while循环,所以不需要在\u data()上的
    中使用while循环

  • 初始化
    MyListener
    时,您没有调用父类的
    \uuuu init\uuu
    方法,因此它没有正确初始化

  • 因此,对于您尝试执行的操作,代码应该如下所示:

    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'])
    
    类MyStreamListener(tweepy.StreamListener):
    定义初始(自身,时间限制=60):
    self.start\u time=time.time()
    self.limit=时间限制
    self.saveFile=open('abcd.json','a')
    超级(MyStreamListener,self)。\uu初始化
    def on_数据(自身、数据):
    如果(time.time()-self.start\u time)
    访问变量myListener.running,而不是直接将myListener传递到Stream创建一个变量,如下所示:

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

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

    基本上重要的部分是:

    def _data(self, data):
        if self.listener.on_data(data) is False:
            self.running = False
    
    streaming.py中的流上类


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

    您有一个有效的问题,无需担心。问题的意思是我无法在程序中停止filter()方法。你想暂停这条流吗?或者更改过滤关键字?@Leb我希望流在需要运行时运行,比如每小时运行一次。如果我让它永远运行,它只会达到API限制并停止工作。我希望在代码中以编程方式打开和关闭流。