サッカーを通じて観戦力と分析力を上げていくブログ

基本的にはサッカー×データに関して試してみたことをまとめています。最近はもっぱらPythonを使った可視化中心。時々自分の好きなガジェットも。

【Python】Twitter APIを使ってツイートデータを取得してみる

今回はスクレイピングとはまた違ったデータ取得方法についてです。最近流行りのAPI(アプリケーションプログラミングインターフェイス)を使って、Twitterのデータを取得して見たいと思います。その後のネットワーク分析を見据えて、ハッシュタグをリスト化するところまでをやってみます。

事前準備

まず前提としてTwitter APIを利用するためには開発者用のアカウントが必要になります。ちょっと面倒ですが、下記を参考に取得してみて下さい。

96lovefootball.hatenablog.com

開発用アカウントを取得できたら、APIを使うための「アプリ」なるものをTwitter Developerポータルで作っていきます。

https://developer.twitter.com/にアクセスしてログイン。画面右上のアカウント名から「Get Started」をクリック。

f:id:virgilvd:20190218003342p:plain

「Create an app」を選択。

f:id:virgilvd:20190218003614p:plain

f:id:virgilvd:20190218003633p:plain

ここから今回APIを利用するアプリの概要について、記載していきます。基本的には必須項目(required)だけで大丈夫です。(アプリ概要欄は下図ではすごく簡単に書いていますが、申請時の細かさからするともっと具体的に書いた方が良いです)

f:id:virgilvd:20190218003841p:plain

「App name」に関しては既存のものと被ってはいけないらしく、被っていると警告が出ました。

f:id:virgilvd:20190218004025p:plain

必須項目を入力したら「Create」ボタンを押して作成します。このタイミングで利用に関する注意が現れるので良く読んで進めましょう。

f:id:virgilvd:20190218004222p:plain

簡単に翻訳すると、1つ目が個人のプライベートな情報(宗教や性的指向など)を分析しないこと、2つ目が政府が監視目的で使用すること、3つ目がbotなどでTwitterへ高負荷をかけることをそれぞれ禁止しているようです。1つ目は少し前に世界中で話題になったFacebookの問題を彷彿とさせる規約ですね。

APIキーとトークンの取得

TwitterAPIを利用するには、「APIキー」と「アクセストークン」が必要になります。概要としては、APIキーが上で作成したアプリを識別するもの、トークンがユーザーを識別するものだそうです。Twitter APIを利用するにはこれらのキーに加えて、「APIシークレットキー」と「アクセストークンシークレット」も必要で、これらはそれぞれ「APIキー」と「アクセストークン」のパスワード的なものに当たります。

先ほど作成したアプリの画面から「Keys and Tokens」のタブを開きます。既に「API key」と「API secret key」は表示されているので、残りのトークン系を表示させるため「Create」をクリックします。

f:id:virgilvd:20190218011352p:plain

これで準備は完了です。

Twitter APIを使ってツイートデータを取得してみる

ここからPythonを使ってAPIを操作し、ツイートを取得していきます。と言ってもPythonでのTwitter APIの使い方は公式がサンプルコードを公開しているので、今回はそれを使ってみます。

f:id:virgilvd:20190218215019p:plain

▲公開しているサンプルコード。そのままコピペではダメでいくつか直さないとエラーになります。。

今回もPythonの実行環境はGoogle Colabを使います。まずは、APIを利用に必要な認証用のプロトコルOAuth2(オーオース ツー)を使うためのライブラリをインストール&インポートします。

!pip install oauth2
import oauth2

続いて、先ほど確認した認証時に必要な 4つのキーを変数に代入しておきます。

API_KEY='(ここにAPI Keyを入力)'
API_SECRET='(ここにAPI Secret Keyを入力)'

TOKEN_KEY='(ここにAccess Tokenを入力)'
TOKEN_SECRET='(ここにAccess Token Secretを入力)'

あとは、公式ページのサンプルを元に関数を定義しておきます。

def oauth_req(url, key, secret, http_method="GET", post_body="", http_headers=None):
    consumer = oauth2.Consumer(key=API_KEY, secret=API_SECRET)
    token = oauth2.Token(key=key, secret=secret)
    client = oauth2.Client(consumer, token)
    resp, content = client.request( url, method=http_method, body=post_body.encode('utf-8'), headers=http_headers )
    return content

公式ページだと、1行目の「post_body=""」のダブルクオーテーションが全角になっているので訂正する必要があります。また、5行目の「body=post_body.encode('utf-8')」部分はエンコードを指定しておかないと内部の処理でエラーになってしまいます。

いよいよここからTwitter APIを使ってデータを取得していきます。今回はチャンピオンズリーグ真っ只中と言うことで、「#CampionsLeague」の着いたツイートを取得してみます。この場合、APIに渡すURLは、「https://api.twitter.com/1.1/search/tweets.json?q=%23CampionsLeague」と言う形になるそうです。他のハッシュタグのデータを取得する場合は、末尾のucl部分を好きなハッシュタグに変更するだけでオッケイです。

url='https://api.twitter.com/1.1/search/tweets.json?q=%23CampionsLeague'
data=oauth_req(url, TOKEN_KEY, TOKEN_SECRET)

ここで取得したデータはJSON形式となっているため、データとして扱いやすいよう辞書型に変更します。

import json

data=json.loads(data) 

f:id:virgilvd:20190218233434p:plain

こんな感じでしっかり取得できています。どうやら20数件分のツイートが取得できているようです。

最後に、ネットワーク分析に向けて、このデータからツイート毎のハッシュタグのリストを作って終わりたいと思います。(コードの汚さから漂うコレジャナイ感がすごいですが、なにぶん実力不足でどう書けば良いのか分からないのです。。。)

[[d.get('text') for d in x] for x in [d.get('entities').get('hashtags') for d in data.get('statuses')]]

f:id:virgilvd:20190218233124p:plain

なんか思ってたよりかなり少ないけど、やりたかったことは一応出来ました!

戦術や分析に関して、こういう見方もあるよ、こうして見た方がいいよ、などご意見等ありましたら、コメントで教えていただけると幸いです。ぜひよろしくお願いいたします!