如何将位置过滤器添加到 tweepy 模块

Posted

技术标签:

【中文标题】如何将位置过滤器添加到 tweepy 模块【英文标题】:How to add a location filter to tweepy module 【发布时间】:2014-05-18 07:42:10 【问题描述】:

我发现以下代码非常适合让我在 Python Shell 中查看标准 1% 的 twitter firehose:

import sys
import tweepy

consumer_key=""
consumer_secret=""
access_key = ""
access_secret = "" 


auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth)


class CustomStreamListener(tweepy.StreamListener):
    def on_status(self, status):
        print status.text

    def on_error(self, status_code):
        print >> sys.stderr, 'Encountered error with status code:', status_code
        return True # Don't kill the stream

    def on_timeout(self):
        print >> sys.stderr, 'Timeout...'
        return True # Don't kill the stream

sapi = tweepy.streaming.Stream(auth, CustomStreamListener())
sapi.filter(track=['manchester united'])

如何添加过滤器以仅解析来自特定位置的推文?我见过有人将 GPS 添加到其他与 Twitter 相关的 Python 代码中,但我在 Tweepy 模块中找不到任何特定于 sapi 的内容。

有什么想法吗?

谢谢

【问题讨论】:

我认为我的问题是一个串联问题。 GPS过滤器的语法将是'sapi.filter(locations = [-122.75,36.8,-121.75,37.8])'但是将关键字与轨道过滤器结合起来似乎不适用于我正在使用的语法。 【参考方案1】:

流媒体 API 不允许同时按位置和关键字过滤。

边界框不充当其他过滤器参数的过滤器。例如 track=twitter&locations=-122.75,36.8,-121.75,37.8 将匹配任何包含 Twitter 一词(甚至是非地理推文)或来自旧金山地区。

来源:https://dev.twitter.com/docs/streaming-apis/parameters#locations

您可以做的是向流 API 询问关键字或定位的推文,然后通过查看每条推文来过滤您的应用程序中的结果流。

如果您将代码修改如下,您将捕获英国的推文,然后这些推文会被过滤以仅显示那些包含“曼联”的推文

import sys
import tweepy

consumer_key=""
consumer_secret=""
access_key=""
access_secret=""

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth)


class CustomStreamListener(tweepy.StreamListener):
    def on_status(self, status):
        if 'manchester united' in status.text.lower():
            print status.text

    def on_error(self, status_code):
        print >> sys.stderr, 'Encountered error with status code:', status_code
        return True # Don't kill the stream

    def on_timeout(self):
        print >> sys.stderr, 'Timeout...'
        return True # Don't kill the stream

sapi = tweepy.streaming.Stream(auth, CustomStreamListener())    
sapi.filter(locations=[-6.38,49.87,1.77,55.81])

【讨论】:

这解释了为什么我收到了关于 SF 和 United 的推文,但没有收到来自 SF 的仅关于曼联的推文。你有没有设法从开发文档中找到你的建议的语法?谢谢。 如果我将 sapi.filter 更改为 sapi.filter(track=['manchester united'], locations=[-122.75,36.8,-121.75,37.8]) 我会看到提到 MU all 的推文世界各地以及旧金山的推文不一定提到曼联。如果您想要来自 SF 的提及 MU 的推文,您有 2 种选择:1 - 您可以从 SF 请求推文,然后检查每条推文的文本以查看它是否包含子字符串“Manchester United”或 2 - 您可以使用关键字“请求推文”曼联”,然后查看他们是否已定位,纬度/经度是否在 SF 的边界框内。 对语法有什么建议吗? 我修改了答案,向您展示了第一个替代方案。 谢谢。我设法找到了一种类似的编码方式,但你的方法也同样有效。在这个例子中,我如何打印推文的地理位置?我尝试使用 'print "location = ", sapi.filter(locations)' 作为代码的最后一行。它不会导致错误,但也不会产生任何输出,我不知道为什么?【参考方案2】:

胡安给出了正确的答案。我只使用这个过滤德国:

# Bounding boxes for geolocations
# Online-Tool to create boxes (c+p as raw CSV): http://boundingbox.klokantech.com/
GEOBOX_WORLD = [-180,-90,180,90]
GEOBOX_GERMANY = [5.0770049095, 47.2982950435, 15.0403900146, 54.9039819757]

stream.filter(locations=GEOBOX_GERMANY)

这是一个相当粗糙的盒子,其中包含其他一些国家的部分地区。如果您想要更细的颗粒,您可以组合多个框来填写您需要的位置。

应该注意的是,如果您按地理标签过滤,您会相当多地限制推文的数量。这是来自我的测试数据库中大约 500 万条推文(查询应该返回实际包含地理位置的推文的百分比):

> db.tweets.find(coordinates:$ne:null).count() / db.tweets.count()
0.016668392651547598

因此,我的 1% 流样本中只有 1.67% 包含地理标签。但是,还有其他方法可以确定用户的位置: http://arxiv.org/ftp/arxiv/papers/1403/1403.2345.pdf

【讨论】:

位置预测论文真好用【参考方案3】:

您无法在流式传输时对其进行过滤,但如果您将推文写入文件,则可以在输出阶段对其进行过滤。

【讨论】:

【参考方案4】:

sapi.filter(track=['manchester united'],locations=['GPS Coordinates'])

【讨论】:

以上是关于如何将位置过滤器添加到 tweepy 模块的主要内容,如果未能解决你的问题,请参考以下文章

在 Drupal 7 中,如何使用“搜索视图”模块将搜索词过滤器添加到我的视图中?

Python,tweepy流

使用 tweepy 流式传输用户的时间线和过滤的推文

传入过滤关键字 | Python Tweepy API

在 Tweepy Streaming API 中包含过滤条件

仅在将用户添加到 ManyToManyFIeld 的位置过滤查询集