Raspberry PiとPython3でMongoDBを使うでRaspberry PiのPython3でMongoDBが使用できるようになったので、TwitterのStreaming APIでツイートをリアルタイムに収集して、MongoDBに格納してみる。
Raspbian StretchとPython3.5.3。
Streaming APIを利用するには以下4つのAPIキーとトークンが必要で、なければTwitterの開発者向けのページで申請しておく。
・Consumer Key (API Key)
・Consumer Secret (API Secret)
・Access Token
・Access Token Secret
MongoDBのインストールやPython3で使用するための準備はRaspberry PiとPython3でMongoDBを使うを参照。あとは、MongoDBのtestデータベースにツイートを格納するsampleコレクションを作成しておく。
Raspberry PiとPython3とTwitterでOCRボットを作ると同様にRequests-OAuthlibを使ってツイートを収集するので、pipでインストールしておく。
以下のPython3コードで「ラーメン」を含むツイートのデータを収集する。APIではJSONでデータを取得できるのでそのままMongoDBのコレクションに格納する。ただし、リツイートは収集しない。
上記コードを実行してしばらく待つ。
MongoDBに格納されたデータを確認する。ツイートはtextフィールドに格納されている。
環境
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 件のコメント:
コメントを投稿