使用tweepy在流式API中搜索多个词并知道哪个匹配?

1 投票
1 回答
3390 浏览
提问于 2025-04-18 16:44

我正在尝试使用tweepy来建立一个推文数据集。目前,我已经设置了一个流来监控一个搜索词,但我想同时使用这个库来搜索不同的查询。我知道我可以给twitterStream.filter函数提供一个列表,而不仅仅是“Disney”这个词,但我不太确定如何知道每条推文是哪个查询的结果。

那么,如何扩展以下代码,以便搜索["Disney", "Pandabears", "Polarbears"]而不仅仅是"Disney",并且知道是哪个查询返回了结果呢?

我能想到两种方法来解决这个问题:

1:在结果推文中搜索这些搜索词,并相应地标记它们。不过,这样并不能完全解决问题,因为一条推文可能包含两个搜索词。这里有详细描述

2:为每个搜索词运行一个流。不过,我不确定API是否允许同一个应用同时有多个活跃的流?

from tweepy import Stream
from tweepy import OAuthHandler
from tweepy.streaming import StreamListener
import time

ckey = "secret"
csecret="secret"
atoken="secret"
asecret="secret"
searchterm = "Disney"

class listener(StreamListener):

    def on_data(self, data):
        try:
            tweet = data.split(',"text":"')[1].split('","source')[0] 
            saveThis = str(time.time())+"::%::"+tweet    
            saveFile = open("tweets.csv", "a")
            saveFile.write(saveThis)
            saveFile.write("\n")
            saveFile.close()
            return True
        except BaseException, e:
            print "Failed on data", str(e)
            time.sleep(10) 
            return True # Don't kill the stream

    def on_error(self, status):
        print status
        time.sleep(5)
        return True # Don't kill the stream

try:
    auth = OAuthHandler(ckey, csecret)
    auth.set_access_token(atoken, asecret)
    twitterStream = Stream(auth, listener())
    twitterStream.filter(track=[searchterm])
except Exception:
    print "Failed in auth or streaming"

有没有什么“好”的方法来解决这个问题呢?

1 个回答

0

我选择了第一种方案,使用一个流来处理多个搜索词,然后手动检查每条推文是否有匹配的内容...

tweet = "I am a tweet"
terms = ["am","tweet"]
matches = []
for i, term in enumerate(terms):
                    if( term.lower() in tweet.lower() ):
                        matches.append(i)

matches
Out: [0, 1]

...并把找到的匹配结果添加到流监听器返回的对象里。当然,这样会导致数据流变得更大,从而增加被限制访问的风险。

撰写回答