Pythonを使ってTwitterのタイムラインを収集する

「実践 機械学習システム」の第六章ではTwitterのタイムラインを使った感情分析を行っています。ただし英語のTweetを対象としているので、(たぶん)*1サンプルコードを実行してもあまり面白くはないのです。できることなら日本語でやりたい、というわけで自分のタイムラインからTweetを収集してみましょう。実行環境はPython3系を想定してますが、2系でも動くはずです。

基本的には↓のやり方を踏襲します。

qiita.com

必要なものは以下

  • Twitter APIの認証キー
  • PythonのOauthライブラリ(requests_oauthlib)
  • Pythonのデータ解析ライブラリ(Pandas)

Twitter APIの認証キーを取得する

Twitterのアプリケーションマネジメントサイトに行ってアプリケーションの登録を行います。

apps.twitter.com

"Create New App"から必要事項を入力していくと特に問題なく登録できるはず。最近は電話番号の登録を迫られるみたいです。営業電話でもかかってくるんだろうか。。

登録が完了したら"Consumer Key (API Key)"の欄にある"manage keys and access tokens"のリンクから先に進み、以下の4種類のキーを取得します。

これはコピペでどっかわかるところに保管しておきます。

Pythonライブラリの取得

pip使って導入。

pip3 install requests_oauthlib
pip3 install pandas

タイムラインの収集

Twitter APIでタイムラインを取得しますが、一度に取得できるTweet数の上限とAPI制限があるのでその辺と上手く付き合います。取得Tweetの上限が100件、API制限が15分に15回までとのこと。

分類器作る場合には10,000件ほどのTweetが欲しいので、パラメータで100件とってくるよう指定して、数分ごとに再取得を繰り返すようにしておきます。

CK、CS、AT、ASには先ほどコピペしたConsumer Key (API Key)、Consumer Secret (API Secret)、Access Token、Access Token Secretをそれぞれ入れておきます。

from requests_oauthlib import  OAuth1Session
import json
import time

CK = 'XXXXXXXXXXXXXXXXXXXXXX'
CS = 'XXXXXXXXXXXXXXXXXXXXXX'
AT = 'XXXXXXXXXXXXXXXXXXXXXX'
AS = 'XXXXXXXXXXXXXXXXXXXXXX'

url = "https://api.twitter.com/1.1/statuses/home_timeline.json"

params = {'count': 100}

TweetList = []

twitter = OAuth1Session(CK, CS, AT, AS)

for i in range(100):
    req = twitter.get(url, params = params)
    if req.status_code == 200:
        timeline = json.loads(req.text)
        for tweet in timeline:
            TweetList.append(tweet["text"])
    else:
        print ("Error: %d" % req.status_code)
    time.sleep(240)

4分もあればタイムラインが一巡しそうだったので、timeモジュールを使って240秒ごとに回るように指定をかけています。これを7時間ほど置いとくとTweetListにタイムラインが格納されていきます。

CSVで吐き出す

とってきたタイムラインをテキストデータとして加工したいので、Pandasを使ってデータフレームに落とし込み、それをCSVとして吐き出します。他にもやり方はありますが、型やエンコードで嵌らないのでPandasがおすすめです。

import pandas as pd

df = pd.DataFrame(TweetList)
df.to_csv('hogehoge.csv')

これで教師用データの収集はできたはず。後は発言にネガティブ/ポジティブ/そのほかのラベル貼りをやらないと。その辺は別枠で。

追記

Tweetは200件まで取れました。教えていただいてありがとうございます!

*1:実際に動かしてないのでホントのところは不明