我试图使用tweepy构建推文数据集。现在,我有一个流运行单个搜索词,但我想使用该库同时搜索不同的查询。我知道我能够为twitterStream.filter
函数提供一个列表而不仅仅是"迪士尼"术语,但是我不知道在这种情况下我怎么能看到哪个推文是返回哪个术语的结果。
以下代码搜索["Disney", "Pandabears", "Polarbears"]
而不仅仅是"Disney"
以及知道哪个查询返回了匹配内容有什么好的扩展?
我原则上可以想到两种方法:
1:在结果推文中搜索搜索字词并相应地标记它们。但是,这并没有真正解决问题,因为推文可能包含两个搜索词。 Described here
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"
有没有"好"解决这个问题的方法?
答案 0 :(得分:0)
我选择使用选项1并运行包含多个搜索字词的单个流,手动检查每个推文的匹配...
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]
...并在流侦听器返回的对象中添加结果匹配列表。当然,这会导致更大的间隙,增加了速率限制的危险。