【问题标题】:Searching for multiple terms in the streaming API using tweepy and knowing which one hits?使用 tweepy 在流 API 中搜索多个术语并知道哪一个命中?
【发布时间】:2014-08-12 22:13:00
【问题描述】:

我正在尝试使用 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"

有解决这个问题的“好”方法吗?

【问题讨论】:

  • 由于 API 限制,您不能在同一应用程序中运行与术语一样多的流,您需要在具有不同密钥的不同机器上执行此操作。但是如果你这样做了,如果一条推文包含多个搜索词,你仍然会在多个流上获得相同的推文。您需要决定如何处理这种情况,然后使用术语列表编写相应的逻辑。如果它们包含多个术语,您可以丢弃它们,多次标记它们或设置标记优先级并且只使用一个标记。

标签: python twitter tweepy


【解决方案1】:

我选择使用选项 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]

...并将结果匹配列表添加到流侦听器返回的对象中。当然,这会导致更大的流,增加被速率限制的风险。

【讨论】:

    猜你喜欢
    • 2014-12-21
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多