【问题标题】:Stop stream.filter() on button click单击按钮时停止 stream.filter()
【发布时间】:2015-04-25 23:13:24
【问题描述】:

我正在使用 tweepy 流式传输推文并将其存储在文件中。我正在使用 python 和烧瓶。单击按钮后,流开始获取推文。我想要的是,单击一个按钮,流应该停止。 我知道与计数器变量相关的答案,但我不希望获取特定数量的推文。

提前致谢

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

【问题讨论】:

    标签: python flask tweepy


    【解决方案1】:

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

    如果您要让应用程序在推文收集过程中运行,您需要异步(线程化)收集推文。否则,一旦你调用stream.filter(),它就会在收集推文时锁定你的程序,直到它达到你提供的条件或者你按 ctrl-c 退出,等等。

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

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

    这将线程化您的推文集合并允许您的应用程序继续运行。

    最后,要停止您的推文收集,请将烧瓶调用链接到在您的 stream 对象上调用 disconnect() 的函数,如下所示:

    stream.disconnect()
    

    这将断开您的信息流并停止收集推文。 Here 是在更加面向对象的设计中采用这种精确方法的一个示例(请参阅 Pyckaxe 对象中的 gather()stop() 方法)。


    编辑 - 好的,我现在可以看到您的问题,但我会将最初的答案留给可能会发现此问题的其他人。您的问题是您在哪里创建 stream 对象。

    每次通过烧瓶调用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")
    

    长话短说,您需要在fetch_tweets()外部 创建您的stream 对象。祝你好运!

    【讨论】:

    • 请看我的回答我已经分享了这段代码
    • 当你说它“仍然没有效果”时,你究竟是什么意思?什么是失败?您可以编辑您的问题以包含整个函数吗?
    • 我已经添加了这段代码。 “仍然没有效果”意味着流仍在获取推文并且不会停止。
    • 抱歉,如果您已经看过,请再次查看。我为 Flask/functions 量身定制了更多答案。
    • 谢谢兄弟,问题出在流对象的范围上。你的解决方案对我有用。再次感谢
    猜你喜欢
    • 2012-10-17
    • 2015-10-04
    • 1970-01-01
    • 2020-04-11
    • 2013-02-20
    • 2016-11-07
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多