Как добавить фильтр местоположения в модуль tweepy

Я нашел следующий фрагмент кода, который очень хорошо работает для того, чтобы позволить мне просматривать в Python Shell стандартную 1% трясины 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 в другой код Python, связанный с Twitter, но я не могу найти что-то конкретное для sapi в модуле Tweepy.

Любые идеи?

Спасибо

Ответ 1

API потоковой обработки не позволяет одновременно фильтровать по ключевому слову И.

Ограничивающие поля не действуют как фильтры для других параметров фильтра. Например track = twitter & location = -122.75,36.8, -121.75,37.8 будут соответствовать любым твитам, содержащим термин Twitter (даже не-гео-твиты) ИЛИ прибывающий из области Сан-Франциско.

Источник: https://dev.twitter.com/docs/streaming-apis/parameters#locations

Что вы можете сделать, это спросить API потоковой передачи для ключевого слова или размещенных твитов, а затем фильтровать полученный поток в вашем приложении, просмотрев каждый твит.

Если вы измените код следующим образом, вы будете захватывать твиты в Соединенном Королевстве, затем эти твиты будут фильтроваться, чтобы отображать только те, которые содержат "manchester united"

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])

Ответ 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)

Это довольно грубая коробка, которая включает части некоторых других стран. Если вы хотите получить более тонкое зерно, вы можете объединить несколько ящиков, чтобы заполнить нужное место.

Следует отметить, что вы ограничиваете количество твитов совсем немного, если вы фильтруете по geotags. Это примерно от 5 миллионов твитов из моей тестовой базы данных (запрос должен вернуть% возраста твитов, которые фактически содержат геолокацию):

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

Таким образом, только 1,67% моей выборки 1% потока включают геотаг. Однако существуют и другие способы определения местоположения пользователя: http://arxiv.org/ftp/arxiv/papers/1403/1403.2345.pdf

Ответ 3

это было действительно полезно, но у меня есть еще один вопрос. Я пытаюсь получить твиты из Бразилии. Можете ли вы объяснить немного больше о том, как комбинировать коробки, чтобы получить более мелкое зерно страны? Thankss

Ответ 4

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