Как я могу изменить отфильтрованные слова в реальном времени в tweetstream (Python)? - PullRequest
1 голос
/ 07 ноября 2011

Мне нужно в реальном времени сохранять в базе данных все твиты из Twitter Streaming API, конечно же, фильтруя их по определенному списку слов. Я добился этого с помощью tweetstream , определив список слов , как это до вызова FilterStream ():

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

Что я хотел бы сделать, так это уметь добавлять / изменять / удалять любые из этих значений, , не останавливая сценарий . Для этого я создал простой текстовый файл, содержащий слова, которые я хочу отфильтровать, разделенные разрывом строки. Используя этот код, я получаю список слов просто отлично:

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

Я заставил эти строки работать, когда он запускается, но мне нужно, чтобы он делал это каждый раз, когда проверяется поток. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2011

Вы можете прочитать обновленный список слов в одном потоке и обработать твиты в другом, используя 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'.

0 голосов
/ 07 ноября 2011

Возможно, что-то подобное будет работать:

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 - это глобальный объект, который обновляется каждые несколько секунд во время работы фильтра.

...