Comment ajouter un filtre de localisation au module tweepy

j'ai trouvé le code suivant qui fonctionne assez bien pour me permettre de voir en Python Shell le standard 1% du firehose twitter:

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

comment ajouter un filtre pour analyser les tweets d'un endroit précis? J'ai vu des gens ajouter des GPS à d'autres codes Python liés à twitter, mais je ne trouve rien de spécifique à sapi dans le module Tweepy.

des idées?

Merci

17
demandé sur gdogg371 2014-04-06 05:57:40

3 réponses

L'API de streaming ne permet pas de filtrer par emplacement et mot clé simultanément.

boîtes Englobantes ne pas agir comme des filtres pour d'autres paramètres de filtre. Exemple piste=twitter&locations=-122.75,de 36,8,-121.75,de 37,8 correspond à n'importe quel tweets contenant le terme Twitter (même les tweets Non-geo) ou venant de la région de San Francisco.

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

ce que vous pouvez faire est de demander à l'API de streaming des mots clés ou des tweets localisés et ensuite filtrer le flux résultant dans votre application en regardant dans chaque tweet.

si vous modifiez le code comme suit vous capturerez les tweets au Royaume-Uni, alors ces tweets seront filtrés pour ne montrer que ceux qui contiennent "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])
21
répondu Juan E. 2014-04-06 14:41:25

Juan a donné la bonne réponse. Je filtre pour L'Allemagne seulement en utilisant ceci:

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

il s'agit d'une boîte assez rudimentaire qui inclut des parties de certains autres pays. Si vous voulez un grain plus fin, vous pouvez combiner plusieurs cases à remplir l'emplacement que vous avez besoin.

il faut noter cependant que vous limitez le nombre de tweets un peu si vous filtrez par géolocalisation. C'est à partir d'environ 5 millions de Tweets de ma base de données de test (la requête devrait retourner le %à l'âge de tweets qui contiennent en réalité une géolocalisation):

> db.tweets.find({coordinates:{$ne:null}}).count() / db.tweets.count()
0.016668392651547598
http://arxiv.org/ftp/arxiv/papers/1403/1403.2345.pdf

14
répondu Kristian Rother 2014-10-31 12:33:11

sapi.filtre(piste=['manchester united'],lieux=[Coordonnées GPS'])

-2
répondu gdogg371 2014-04-06 02:43:16