我试图使用tweepy来构建推文数据集。现在,我有一个流运行一个搜索词,但我想使用库来搜索不同的查询在同一时间。我知道我能够为twitterStream.filter
函数提供一个列表,而不仅仅是"迪士尼"术语,但是我不确定如何才能看到哪个tweet是在这种情况下返回哪个术语的结果。
下面的代码的一个很好的扩展是搜索["Disney", "Pandabears", "Polarbears"]
而不是仅仅"Disney"
,并知道哪个查询返回命中?
原则上我可以想到两种方法:
1:在结果tweet中搜索搜索词并相应地标记它们。然而,这并不能真正解决问题,因为tweet可能包含两个搜索词。这里描述
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,使用多个搜索词运行单个流,手动检查每条tweet的匹配…
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]
…并将结果匹配列表添加到流侦听器返回的对象中。当然,这会导致更大的流,增加速率限制的危险。