web-dev-qa-db-ja.com

Tweepyモジュールに場所フィルターを追加する方法

Python Twitterファイアホースの標準1%のシェル:

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

特定の場所からのツイートのみを解析するフィルターを追加するにはどうすればよいですか?他のTwitter関連のコードにGPSを追加する人々を見ましたPython=しかし、私はTweepyモジュール内でsapiに固有のものを見つけることができません。

何か案は?

ありがとう

20
gdogg371

ストリーミングAPIでは、場所とキーワードで同時にフィルタリングすることはできません。

境界ボックスは、他のフィルターパラメーターのフィルターとして機能しません。たとえば、track = Twitter&locations = -122.75,36.8、-121.75,37.8は、「Twitter」という用語を含むすべてのツイートに一致します(ジオ以外のツイートでも)ORサンフランシスコ地域から来ています。

ソース: 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])
26
Juan E.

フアンは正解を与えました。私はこれを使用してドイツのみをフィルタリングしています:

# 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万のツイートからのものです(クエリは、実際に位置情報を含むツイートの%ageを返す必要があります)。

> 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

19
Kristian Rother