我需要将来自Twitter Streaming API的所有推文实时保存到数据库中,当然可以通过一定的单词列表来过滤它们。我已经使用tweetstream实现了它,在调用FilterStream()之前定义了这样的列表 words :
words = ["word1","two words","anotherWord"]
我想做的是,能够添加/更改/删除任何这些值,而不会停止脚本。为此,我创建了一个纯文本文件,其中包含我想要过滤掉的单词,用换行符分隔。使用此代码,我可以完美地获得单词列表:
file = open('words.txt','r')
words = file.read().split("\n")
我在启动时使这些线路工作,但是我每次要检查流时都需要它。有什么想法吗?
答案 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'
文件的更改,而不是轮询。