【问题标题】:How can I change in real-time filtered words in tweetstream (Python)?如何更改推文流(Python)中的实时过滤词?
【发布时间】:2011-11-07 01:25:06
【问题描述】:

我需要将来自 Twitter Streaming API 的所有推文实时保存到数据库中,当然,通过特定的单词列表过滤它们。我通过使用tweetstream 实现了它,在调用FilterStream() 之前像这样定义列表words

words = ["word1","two words","anotherWord"]

我想做的是能够添加/更改/删除任何这些值,无需停止脚本。为此,我创建了一个纯文本文件,其中包含要过滤掉的单词,并用换行符分隔。使用此代码,我可以完美地得到列表 words

file = open('words.txt','r')
words = file.read().split("\n")

我让这些行在它开始时工作,但每次它要检查流时我都需要它来做。有什么想法吗?

【问题讨论】:

    标签: python twitter real-time


    【解决方案1】:

    您可以在一个线程中阅读更新的单词列表,并使用Queue 在另一个线程中处理推文以进行交流。

    示例:

    阅读推文的线程:

    def read_tweets(q):
        words = q.get()
        while True:
            with tweetstream.FilterStream(..track=words,..) as stream:
                 for tweet in stream: #NOTE:it requires special handling if it blocks
                     process(tweet)
                     try: words = q.get_nowait() # try to read a new word list
                     except Empty: pass
                     else: break # start new connection
    

    读单词的线程:

    def read_words(q):
        words = None
        while True:
            with open('words.txt') as file:
                newwords = file.read().splitlines()
            if words != newwords:
               q.put(newwords)
               words = newwords
            time.sleep(1)
    

    主脚本可能如下所示:

     q = Queue(1)
     t = Thread(target=read_tweets, args=(q,))
     t.daemon = True
     t.start()
     read_words(q)
    

    您可以使用inotify 或类似方法来监控'words.txt' 文件的更改,而不是轮询。

    【讨论】:

    • 太棒了!它很好用:D 我可能会添加一个基于时间的函数,以免因为连接被关闭并快速启动而被禁止。谢谢你,真的!
    【解决方案2】:

    也许这样的事情会起作用:

    def rebuild_wordlist(s):
        with open('words.txt','r') as f:
            return set(f.read().split('\n'))
    
    def match(tweet):
        return any(w in tweet for w in words)
    
    words, timestamp = rebuild_wordlist(), time.time()
    stream = tweetstream.SampleStream("username", "password")
    fstream = ifilter(match, stream)
    
    for tweet in fstream:
        do_some_with_tweet(tweet)
        if time.time() > timestamp + 5.0:
            # refresh the wordlist every 5 seconds
            words, timestamp = rebuild_wordlist(), time.time()
    

    words 集是一个全局变量,在过滤器运行时每隔几秒刷新一次。

    【讨论】:

    • 抱歉,我是在您编辑邮件后回复的。让我试试看:)
    • 好的,我无法让它工作,但我认为我应该使用 FilterStream 而不是 SampleStream,因为它应该使用第二个只是为了提供所有推文的一个样本,我想全部获取它们,这样我也可以节省一些我猜的流量(因为 SampleStream 会获取许多推文,将它们过滤掉并保存匹配一个,但 FilterStream 会获取很多并保存所有这些。
    猜你喜欢
    • 1970-01-01
    • 2017-05-21
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 2021-07-23
    • 2015-01-18
    相关资源
    最近更新 更多