我使用tweepy来传输推文并将其存储在一个文件中。我正在使用python和flask。只需单击一个按钮,流就会开始获取推文。我想要的是,只需点击一下按钮就可以停止流。 我知道与计数器变量相关的答案,但我不想要获取特定数量的推文。
提前致谢
def fetch_tweet():
page_type = "got"
lang_list = request.form.getlist('lang')
print lang_list
#return render_template("index.html",lang_list=lang_list,page_type=page_type)
l = StdOutListener()
auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
stream = Stream(auth, l)
with open('hashtags.txt') as hf:
hashtag = [line.strip() for line in hf]
print hashtag
print request.form.getlist('fetchbtn')
if (request.form.getlist('stopbtn')) == ['stop']:
print "inside stop"
stream.disconnect()
return render_template("analyse.html")
elif (request.form.getlist('fetchbtn')) == ['fetch']:
stream.filter(track=lang_list, async=True)
return render_template("fetching.html")
答案 0 :(得分:3)
所以我假设你的初始按钮链接到初始化一个tweepy流(即调用stream.filter()
)。
如果您要在发送推文时允许您的应用程序运行,您需要收集推文异步(线程)。否则,一旦你打电话给stream.filter()
,它会在你收集推文时锁定你的程序,直到它达到你提供它的某个条件或者你输出等等。
要利用tweepy内置的线程,您只需将async
参数添加到流初始化中,如下所示:
stream.filter(track=['your_terms'], async=True)
这会线程化您的推文集合并允许您的应用程序继续运行。
最后,要停止推文收集,请将烧瓶调用链接到在disconnect()
对象上调用stream
的函数,如下所示:
stream.disconnect()
这将断开您的流并停止推文收集。 Here是面向对象设计中这种精确方法的一个示例(请参阅gather()
对象中的stop()
和Pyckaxe
方法。
编辑 - 好的,我现在可以看到您的问题,但我会将原来的答案留给可能会发现此问题的其他人。您的问题是创建stream
对象的位置。
每次通过flask调用fetch_tweet()
时,您正在创建一个新的stream
对象,因此当您第一次调用它时,它会创建一个初始对象,但第二次它在不同的流对象上调用disconnect()
。创建流的单个实例将解决问题:
l = StdOutListener()
auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
stream = Stream(auth, l)
def fetch_tweet():
with open('hashtags.txt') as hf:
hashtag = [line.strip() for line in hf]
print hashtag
print request.form.getlist('fetchbtn')
if (request.form.getlist('stopbtn')) == ['stop']:
print "inside stop"
stream.disconnect()
return render_template("analyse.html")
elif (request.form.getlist('fetchbtn')) == ['fetch']:
stream.filter(track=lang_list, async=True)
return render_template("fetching.html")
长话短说,您需要在stream
之外创建<{1}}对象 。祝你好运!