如何在tweetstream(Python)中更改实时过滤的单词?

时间:2011-11-07 01:25:06

标签: python twitter real-time

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

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

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

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

我在启动时使这些线路工作,但是我每次要检查流时都需要它。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

您可以在一个主题中阅读更新的单词列表,并使用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'文件的更改,而不是轮询。