2018年5月19日土曜日

Raspberry Piでツイートをリアルタイム収集する

Raspberry PiとPython3でMongoDBを使うでRaspberry PiのPython3でMongoDBが使用できるようになったので、TwitterのStreaming APIでツイートをリアルタイムに収集して、MongoDBに格納してみる。


環境


Raspbian StretchとPython3.5.3。



Twitter APIのキーとトークンの取得


Streaming APIを利用するには以下4つのAPIキーとトークンが必要で、なければTwitterの開発者向けのページで申請しておく。

・Consumer Key (API Key)
・Consumer Secret (API Secret)
・Access Token
・Access Token Secret


MongoDBの準備


MongoDBのインストールやPython3で使用するための準備はRaspberry PiとPython3でMongoDBを使うを参照。あとは、MongoDBのtestデータベースにツイートを格納するsampleコレクションを作成しておく。



ツイートのリアルタイム収集


Raspberry PiとPython3とTwitterでOCRボットを作ると同様にRequests-OAuthlibを使ってツイートを収集するので、pipでインストールしておく。


以下のPython3コードで「ラーメン」を含むツイートのデータを収集する。APIではJSONでデータを取得できるのでそのままMongoDBのコレクションに格納する。ただし、リツイートは収集しない。
import json
import re
from requests_oauthlib import OAuth1Session, OAuth1
from pymongo import MongoClient

# Twitter APIの認証情報
# Twitterの開発者向けのページで取得したキーとトークンを使う
CONSUMER_KEY = 'Consumer Key'
CONSUMER_SECRET = 'Consumer Secret'
ACCESS_TOKEN = 'Access Token'
ACCESS_TOKEN_SECRET = 'Access Token Secret'

# 認証情報の設定
tw = OAuth1Session(CONSUMER_KEY,
                client_secret=CONSUMER_SECRET,
                resource_owner_key=ACCESS_TOKEN,
                resource_owner_secret=ACCESS_TOKEN_SECRET)

def streaming():
    #Twitterデータのリアルタイム検索
    url = 'https://stream.twitter.com/1.1/statuses/filter.json'
    # 検索キーワード(ラーメン)の指定
    data={'track':'ラーメン'}
    # Streaming APIを使うときはオプションstream=Trueを指定
    r = tw.post(url, data=data, stream=True)

    # MongoDBに接続
    # localhostの27017ポート(デフォルト)に接続
    client = MongoClient('localhost', 27017)
    # testデータベース
    db = client.test
    # testデータベースのsampleコレクション
    col = db.sample

    for line in r.iter_lines():
        if line:
            status = json.loads(line.decode('utf-8'))
        else:
            continue

        # リツイートは収集しない
        pat = re.compile('\ART @.*? ')
        match = pat.match(status['text'])
        if match: continue

        # ツイートを表示
        print(status['text'] + '\n')

        # APIで取得したデータ(JSON)をそのままコレクションに格納
        col.insert(status)

if __name__ == '__main__':
    streaming()

上記コードを実行してしばらく待つ。


収集したデータの確認


MongoDBに格納されたデータを確認する。ツイートはtextフィールドに格納されている。


0 件のコメント:

コメントを投稿