web-dev-qa-db-fra.com

Comment ajouter un filtre d'emplacement au module Tweepy

J'ai trouvé le morceau de code suivant qui fonctionne assez bien pour me laisser voir dans Python Shell le 1% standard 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 uniquement les tweets d'un certain emplacement? J'ai vu des gens ajouter du GPS à d'autres Twitter liés Python mais je ne trouve rien de spécifique à sapi dans le module Tweepy.

Des idées?

Merci

20
gdogg371

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

Les zones de délimitation n'agissent pas comme des filtres pour d'autres paramètres de filtre. Par exemple, track = Twitter & locations = -122.75,36.8, -121.75,37.8 correspondrait à tous les tweets contenant le terme Twitter (même les tweets non géographiques) OR provenant de la région de San Francisco.

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

Ce que vous pouvez faire, c'est demander à l'API de streaming des mots clés ou des tweets localisés, puis filtrer le flux résultant dans votre application en consultant chaque Tweet.

Si vous modifiez le code comme suit, vous capturerez les tweets au Royaume-Uni, puis ces tweets seront filtrés pour n'afficher 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])
26
Juan E.

Juan a donné la bonne réponse. Je filtre pour l'Allemagne uniquement 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)

Ceci est une boîte assez brute qui comprend des parties de certains autres pays. Si vous voulez un grain plus fin, vous pouvez combiner plusieurs cases pour remplir l'emplacement dont vous avez besoin.

Il convient de noter cependant que vous limitez un peu le nombre de tweets si vous filtrez par des géotags . Cela provient d'environ 5 millions de tweets de ma base de données de test (la requête doit renvoyer le% d'âge des tweets qui contiennent réellement une géolocalisation):

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

Donc, seulement 1,67% de mon échantillon du flux de 1% comprend une balise géographique. Cependant, il existe d'autres façons de déterminer l'emplacement d'un utilisateur: http://arxiv.org/ftp/arxiv/papers/1403/1403.2345.pdf

19
Kristian Rother