一分钟后无法在 tweepy 中停止流式传输
Unable to stop Streaming in tweepy after one minute
我正在尝试使用 Stream.filter() 方法流式传输 Twitter 数据一段时间,比如 5 分钟。我将检索到的推文存储在 JSON 文件中。问题是我无法从程序中停止 filter() 方法。我需要手动停止执行。我尝试使用 time 包根据系统时间停止数据。我能够停止将推文写入 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
这些link很相似但是我没有直接回答我的问题
Stopping Tweepy steam after a duration parameter (# lines, seconds, #Tweets, etc)
Tweepy Streaming - Stop collecting tweets at x amount
我用这个link作为参考,
http://stats.seandolinar.com/collecting-twitter-data-using-a-python-stream-listener/
为了关闭流,您需要从 on_data()
return False
或 on_status()
.
因为 tweepy.Stream()
本身运行 while 循环,所以在 on_data()
.
中不需要 while 循环
初始化MyListener
时,没有调用父类的class__init__
方法,所以没有正确初始化。
所以对于你想要做的事情,代码应该是这样的:
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'])
访问变量 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
直播 class streaming.py
这意味着,要关闭连接,您只需在侦听器的 on_data() 方法上设置 return false。
我正在尝试使用 Stream.filter() 方法流式传输 Twitter 数据一段时间,比如 5 分钟。我将检索到的推文存储在 JSON 文件中。问题是我无法从程序中停止 filter() 方法。我需要手动停止执行。我尝试使用 time 包根据系统时间停止数据。我能够停止将推文写入 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
这些link很相似但是我没有直接回答我的问题
Stopping Tweepy steam after a duration parameter (# lines, seconds, #Tweets, etc)
Tweepy Streaming - Stop collecting tweets at x amount
我用这个link作为参考, http://stats.seandolinar.com/collecting-twitter-data-using-a-python-stream-listener/
为了关闭流,您需要从
on_data()
returnFalse
或on_status()
.因为
tweepy.Stream()
本身运行 while 循环,所以在on_data()
. 中不需要 while 循环
初始化
MyListener
时,没有调用父类的class__init__
方法,所以没有正确初始化。
所以对于你想要做的事情,代码应该是这样的:
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'])
访问变量 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
直播 class streaming.py
这意味着,要关闭连接,您只需在侦听器的 on_data() 方法上设置 return false。