使用tweepy在流式API中搜索多个词并知道哪个匹配?
我正在尝试使用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]
...并把找到的匹配结果添加到流监听器返回的对象里。当然,这样会导致数据流变得更大,从而增加被限制访问的风险。