过滤从状态/过滤器(流API)收到的推文

use*_*964 5 python twitter tweepy tweetstream

我有N个跟踪的不同关键字(为简单起见,让N = 3).所以在GET状态/过滤器中,我将在"track"参数中给出3个关键字.

现在我将收到的推文可以来自我提到的3个关键词中的任何一个.问题是我想解决哪个推文对应哪个关键字.即推文和关键字之间的映射(在"track"参数中提到).

显然,没有对收到的推文进行任何处理就没有办法做到这一点.

所以我想知道进行这种处理的最佳方法是什么?在推文文本中搜索关键字?不区分大小写的情况怎么样?当同一个关键词中存在多个单词时,例如:"Katrina Kaif"?

我目前正在尝试制定一些正则表达式......

我认为最好的方法是使用与最初使用的状态/过滤器API相同的逻辑(正则表达式等).如何知道Twitter API状态/过滤器本身使用什么逻辑来匹配推文到关键字?

建议吗?救命?

PS:我使用的是Python,Tweepy,Regex,MongoDb/Apache S4(用于分布式计算)

ale*_*cxe 2

我想到的第一件事是为每个关键字创建一个单独的流并在单独的线程中启动它,如下所示:

from threading import Thread
import tweepy


class StreamListener(tweepy.StreamListener):
    def __init__(self, keyword, api=None):
        super(StreamListener, self).__init__(api)
        self.keyword = keyword

    def on_status(self, tweet):
        print 'Ran on_status'

    def on_error(self, status_code):
        print 'Error: ' + repr(status_code)
        return False

    def on_data(self, data):
        print self.keyword, data
        print 'Ok, this is actually running'


def start_stream(auth, track):
    tweepy.Stream(auth=auth, listener=StreamListener(track)).filter(track=[track])


auth = tweepy.OAuthHandler(<consumer_key>, <consumer_secret>)
auth.set_access_token(<key>, <secret>)

track = ['obama', 'cats', 'python']
for item in track:
    thread = Thread(target=start_stream, args=(auth, item))
    thread.start()
Run Code Online (Sandbox Code Playgroud)

如果您仍然想在单个流中自己通过关键字区分推文,这里有一些关于twitter 如何使用track请求参数的信息。有一些边缘情况可能会导致问题。

希望有帮助。

  • 问题是 Twitter API 建议我们应该尽可能减少单个流的数量。因为如果来自同一 IP/帐户的流连接过多,则会被列入黑名单。请参阅:https://dev.twitter.com/discussions/921 (2认同)