Python で Googleアナリティクスの API からデータを取得する - Core Reporting API v4 対応 / How to get Google Analytics data from Core Reporting API v4
** Sorry, this note is Japanese only, but please take a look at some code snippets. Hope it helps you a bit!
Googleアナリティクスのデータといえば Web の世界では基本中の基本。
API からデータを取り出せるということもあり、なんとか pandas.DataFrame の形でデータを取り出せないかな?と思っていた。
だけどそれ以前に、そもそも Python で Google アナリティクスのデータを取り出す方法がよくわかんない。
あまつさえ、最近 Googleアナリティクスの API は v4 という新しいバージョンに更新(注:リンク先はGoogleアナリティクスの Developer Guide。英語です。)しようとしてるらしい・・・。
そこで、Googleアナリティクスの API の使い方を学ぶとともに、新しいバージョンの API - Core Reporting API v4 をさわってみた。
Googleアナリティクス Core Reporting API v4 を使うための手順
参考にしたのはココ。
この記事は Core Reporting API v3 のためのものなんだけど、大まかな作業の流れ変わらない。
その手順は大まかに次のような感じです。
- Googleアナリティクス API 用のサービスアカウントを作る
- サービスアカウントをデータを取り出したい Googleアナリティクス のユーザーとして追加する
- 必要なパッケージをインストールする
- コードを書く・その1:元になるコード HelloAnalytics.py をダウンロードする
- コードを書く・その2:gav4-python の機能を使って v3 -> v4 対応へとコードを修正する
Googleアナリティクス API 用のサービスアカウントを作る
サービスアカウントってのは、Googleアナリティクス の API にアクセスする、仮想的なユーザーみたいなものらしい。
ちなみに、Googleアナリティクス だけじゃなくて Google の API は全部(ほぼ?)このサービスアカウントという仕組みに対応してるみたいです。
Using OAuth 2.0 for Server to Server Applications | Google Identity Platform | Google Developers(英語)
このリンクから Google API コンソールとかいうサービスを作ってサービスアカウントを作る。
なにやらプロジェクトという概念があるらしいので、既存のプロジェクトを作ったことある人はその中から選択、初めての人はここで作成をします。画面に沿ってやればすんなり出来た。
サービスアカウント名とサービスアカウントID を設定し、「秘密鍵を発行」にチェックチェック。
キーのタイプは上の Developer Guide に従って p12 にしました。JSON が推奨とか書いてるけど大丈夫かな・・・
で、サービスアカウントの作成をすると、キーのファイルがダウンロードされるので、これをこれから書くコードと同じ場所にわかりやすい名前で保存しておく。ここでは client_secrets.p12 とする。
また、この API コンソールってやつで、いろんな API の ON/OFF を設定することができるらしいです。
今回は Google アナリティクス のAPI ということで、「 Analytics API 」 と、後新しいバージョン v4 の API 「 Analytics Reporting API V4 」を ON にしておきましょう。
サービスアカウントをデータを取り出したい Googleアナリティクス のユーザーとして追加する
上の方法で発行したサービスアカウントには、メールアドレスがあるのでこれを Googleアナリティクスの管理画面から、利用者として追加する。
Googleアナリティクスにログインして、上の「管理」ってとこをクリック、「ビュー」の中の「ユーザー管理」のところから、上記のサービスアカウントを追加。追加する際の権限は「表示と分析」にした。
必要なパッケージをインストールする
Googleアナリティクス の API を Python から使うには、Google API Client Library for Python を使うと便利。
pip でインストールできるらしいので、デベロッパーガイドに沿ってインストールする。
$ pip install --upgrade google-api-client-python
また、上記のライブラリは、Googleアナリティクス の API だと古いバージョン v3 にしか対応していないので、追加で v4 へのバージョンアップを助けてくれる Python モジュールもインストールします。
ここで配布してるみたいですが、直接 pip でインストールしちゃいましょう。
$ pip install --upgrade git+https://github.com/googleanalytics/gav4-python
コードを書く・その1:元になるコード HelloAnalytics.py をダウンロードする
デベロッパーガイドにもリンクがありますが、ここからサンプルコードをダウンロードします。そんなに大したことができるコードじゃないですが、シンプルなのでわたしのようなビギナーにはかえってわかりやすい。
次に、このコードの中の「 Replace with your service account email address. 」「 Replace with /path/to/generated/client_secrets.p12 」の部分を、自分の環境に合わせて変更します。
ここまで出来たら、とりあえず古い API でちゃんと動くか試してみましょう。
12345678
View (Profile): ビューの名前
Total Sessions: 123
みたいな感じで、ビューの ID、名前、そして、セッション数が表示されれば成功です。ちなみに、コードによるとここで表示してるセッション数は直近7日分らしいです。
コードを書く・その2:gav4-python の機能を使って v3 -> v4 対応へとコードを修正する
いよいよコードを最新の Googleアナリティクスの API である Core Reporting API v4 に対応させるために修正します。
まず、冒頭で gav4-python のモジュールをインポート。
import gav4
次に、service というオブジェクトを取得してる部分を修正します。具体的には、
service = get_service('analytics', 'v3', scope, key_file_location, service_account_email)
となってるのを
service = get_service('analyticsreporting', 'v4', scope, key_file_location, service_account_email)
と修正します。
また、その次の profile を取得する部分ですが、これは、Management API というやつを通じて、さっきサービスアカウントを登録した Googleアナリティクス のビューのIDを勝手に取ってくるのですが、この Management API ってのが v4 には対応していないので、あらかじめ調べておいた値を直接設定します。
profile = 'YOUR_VIEW_ID'
最後は、gav4.convert_request というメソッドを使って、v3 用のリクエストの内容を、v4 用に変換し、gav4.service.reports().batchGet().execute() メソッドを実行してデータを取得します。実際のコードはこんな感じです。
v3_request = { "ids": 'ga:' + profile_id, "start_date": '7daysAgo', "end_date": 'today', "metrics": 'ga:sessions'} v4_request = gav4.convert_request(**v3_request) v4_response = service.reports().batchGet(body=v4_request).execute()
・・・が!ここで一つ落とし穴が・・・!
エラー TypeError: convert_request() takes 0 positional arguments but 1 was given に怒られる
gav4 の readmeでは、convert_request のところは
v4_request = gav4.convert_request(v3_request)
となってますが、このまま実行すると TypeError が発生し、
TypeError: convert_request() takes 0 positional arguments but 1 was given
と怒られてしまいます。メッセージの通りで、gav4.convert_request() メソッドは位置の引数はとらないので、このように書くとエラーとなります。
なので、上の例のように **v3_request を引数に設定してみてください。
コードの修正はこれで OK、ちゃんと動くかな・・・?
・・・
・・・
やりました! API からのレスポンスが dict 型のデータとして帰ってきました。
なんか、慣れると古いバージョンよりも新しい Core Reporting API v4 の方が、書き方は今風なのかもしれません。
コード全体はこんな感じです。
Googleアナリティクス 関係のその他の記事
http://datalove.hatenadiary.jp/entry/google-analytics/N_sample_reports_you_must_check_out_on_Google_Analytics_demo_accountdatalove.hatenadiary.jp datalove.hatenadiary.jp datalove.hatenadiary.jp datalove.hatenadiary.jp