编程语言
首页 > 编程语言> > python-单击按钮时停止stream.filter()

python-单击按钮时停止stream.filter()

作者:互联网

我正在使用tweepy流推文并将其存储在文件中.我正在使用python和flask.单击按钮,流开始获取推文.我想要的是,单击按钮应停止流.
我知道与计数器变量有关的答案,但我不希望获取特定数量的tweet.

提前致谢

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")

解决方法:

所以我假设您的初始按钮链接到tweepy流的初始化(即,对stream.filter()的调用).

如果要允许您的应用程序在tweet收集发生时运行,则需要异步收集(线程化)tweets.否则,一旦您调用stream.filter(),它将在收集推文时锁定您的程序,直到达到您提供的某种条件或ctrl-c out等为止.

要利用tweepy的内置线程,只需要将async参数添加到流初始化中,如下所示:

stream.filter(track=['your_terms'], async=True)

这将使您的tweet集合成为线程,并允许您的应用程序继续运行.

最后,要停止您的tweet收集,请将flask调用链接到在流对象上调用connect()的函数,如下所示:

stream.disconnect()

这将断开您的信息流并停止收集鸣叫. Here是更面向对象的设计中这种精确方法的示例(请参阅Pyckaxe对象中的collect()和stop()方法).

编辑-好的,我现在可以看到您的问题,但是我将把原来的答案留给可能会发现此问题的其他人.您所发出的问题是您要创建流对象的位置.

每次通过flask调用fetch_tweet()时,您都在创建一个新的流对象,因此,当您第一次调用它来启动流时,它将创建一个初始对象,但是第二次它在另一个流对象上调用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")

简而言之,您需要在fetch_tweets()之外创建流对象.祝好运!

标签:flask,tweepy,python
来源: https://codeday.me/bug/20191120/2045860.html