Google AnalyticsのデータをPython経由で収集する

2016.02.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Webサイトのアクセス状況を確認したり解析に用いる際にGoogle Analyticsは最も用いられる事の多い解析ツールになるかと思われます。従来の使い方であればGoogleのアカウントを利用してGoogle Analyticsのサイトにアクセスし、必要な情報を入手するという流れになるかと思いますが、状況によってはGoogle Analyticsの情報を他のリソースと併せて扱いたい、Webサイトにアクセスする事無く情報を入手したい、という要望も挙がってくるかもしれません。

Google Analyticsでは、そんな要望に応える事の出来る方法を『API Client Library』という形で提供しています。当エントリではAPI Client Libraryを利用するための手順と、『API Client Library for Python』を使ったデータアクセスサンプルコードについてご紹介してみたいと思います。

目次

0.事前準備

まず、利用するメールアドレスで所定のGoogle Analyticsにアクセス出来るように、Google Analytics管理者にアカウントの追加を依頼してください。以降の手順はその環境が整っている事を前提に行います。

1.プロジェクト及びサービスアカウントキーの作成

Googleアカウントにログインした状態で、以下『Google Developers Console』にアクセス。

メニューから[プロジェクトの作成]を選択。

setting-google-analytics-01

任意のプロジェクト名を指定し、[作成]を押下。

setting-google-analytics-02

プロジェクト作成後、[Google APIを利用する]のパートにある『APIを有効にして管理しましょう』の部分を選択。

setting-google-analytics-03

メニューの[認証情報]を選択し、[新しい認証情報]→[サービスアカウントキー]を選択。

setting-google-analytics-04

名前を任意の内容に、また、キーのタイプを[P12]で選択します。この際に表示される[サービスアカウントID]は後程APIを活用する際に必要となるので控えておいてください。

setting-google-analytics-05

サービスアカウントが作成されました。拡張子*.p12のファイルがこのタイミングで生成されていますので、こちらも忘れずにファイルを控えておいてください。

setting-google-analytics-06

サービスアカウントの一覧には、以下の様な形で表示されます。

setting-google-analytics-07

2.APIの有効化

作成したプロジェクトの[概要]メニューから、[Analytics API]をリンクを選択。

setting-google-analytics-08

遷移先に[APIを有効にする]のボタンが表示されているので、このボタンを選択します。

setting-google-analytics-09

3.サイトにサービスアカウントのアクセス権限を追加

次に、対象プロジェクトに上記作業で作成したアカウントのアクセス権限を付与します。Google Analyticsのページにアクセスし、[ログイン]を押下。メールアドレスの連携設定が行われていれば、そのままログイン出来るはずです。

ga-api_01

上部メニューの[アナリティクス設定]を選択。アカウント及びプロパティを選択し、所定のビューが選択されている事を確認後[ユーザー管理]のリンクをクリックします。

setting-google-analytics-10

権限を付与するユーザーに、上記手順で作成したサービスアカウントIDのメールアドレスを追加します。権限については(下記キャプチャでは全て選択してしまってますが)、今回の作業を行なうだけであれば必要最低限のものだけ(表示と分析)で問題ありません。

setting-google-analytics-11

[ビュー設定]に遷移し、"基本設定"欄に表示されているビューIDを控えておきます。

setting-google-analytics-12

4.実行環境の準備(API Client Library for Python)

API利用に必要な情報は上記作業で揃いました。

  • サービスアカウントキーのメールアドレス
  • サービスアカウントキー(拡張子『*.p12』のファイル)
  • ビューID

次に、これら認証情報を活用する為の環境を整えます。今回はPythonで要望を実現してみたいと思いますので、Python製のライブラリを活用する事にします。URL及び参照情報は以下の通りです。

ちなみにライブラリはPython以外にも様々な言語で用意されています。大枠の設定等は然程変わらないと思いますので、宜しければお好みの言語で試してみてはいかがでしょうか。

ga-api_02

所定の環境にpipを使ってライブラリをインストールします。この辺りについてはドキュメントそのままで一旦進めてみました。

$ sudo pip install --upgrade google-api-python-client

下記チュートリアルを参考に、HelloAnalytics.pyを手元の実行環境に作成します。

実行権限を付与した後、HelloAnalytics.py実行。しかしエラーが出てしまいました。

$ python HelloAnalytics.py 
Traceback (most recent call last):
  File "HelloAnalytics.py", line 114, in <module>
    main()
  File "HelloAnalytics.py", line 108, in main
    service = get_service('analytics', 'v3', scope, key_file_location, service_account_email)
  File "HelloAnalytics.py", line 40, in get_service
    service = build(api_name, api_version, http=http)
  File "/Library/Python/2.7/site-packages/oauth2client/util.py", line 140, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/Library/Python/2.7/site-packages/googleapiclient/discovery.py", line 196, in build
    cache)
  File "/Library/Python/2.7/site-packages/googleapiclient/discovery.py", line 242, in _retrieve_discovery_doc
    resp, content = http.request(actual_url)
  File "/Library/Python/2.7/site-packages/oauth2client/client.py", line 572, in new_request
    self._refresh(request_orig)
  File "/Library/Python/2.7/site-packages/oauth2client/client.py", line 842, in _refresh
    self._do_refresh_request(http_request)
  File "/Library/Python/2.7/site-packages/oauth2client/client.py", line 869, in _do_refresh_request
    body = self._generate_refresh_request_body()
  File "/Library/Python/2.7/site-packages/oauth2client/client.py", line 1551, in _generate_refresh_request_body
    body = urllib.parse.urlencode({
AttributeError: 'Module_six_moves_urllib_parse' object has no attribute 'urlencode'

エラーメッセージで情報を調べてみると、以下のネタを発見。どうやら最新バージョンでは上手く動かない様です...

ライブラリのインストールをバージョン指定で行い直すと、

$ sudo pip install -I google-api-python-client==1.3.2

サンプルプログラム実行も上手く行きました。これでプログラム実行環境が整いました。(ですのでライブラリ導入の際はバージョン指定でいきなり進めてしまって構いません)

$ python HelloAnalytics.py 
View (Profile): xxxx.xxxxxxxxxx.xxxx
Total Sessions: 999999

5.PythonによるGoogle Analytics情報取得の為のサンプルコード

以下プログラムがPythonライブラリによるGoogle Analyticsへのアクセス、情報取得のサンプルコードとなります。GAにアクセスし、TSVファイルを作成する所まで実行しています。

17〜20行目で各種認証情報を設定しています。

43〜48行目で情報取得の為のパラメータを設定し、49行目で実行、その後得られた結果をループで回しながらファイルに起こしている、という形です。

実行については、取得件数や項目指定の数に制限が設けられているようです。手元で試した感じでは、1回の処理で得られる件数の上限=10000件(パラメータ指定で件数範囲の指定を行なう事で10000件以上取得する事も可能の様です/下記サンプルコードでは20000と指定してますが結果としては得られる件数MAXは10000件となります)、ディメンションの指定=7個まで、メトリクスの指定=10個までという部分が引っ掛かりました。他にも制限はあるかと思いますので、下記情報などをご参考頂ければと思います。

$ cat GoogleAnalyticsDataGetter.py 
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import hello_analytics_api_v3_auth 
import HelloAnalytics
from apiclient.errors import HttpError
from oauth2client.client import AccessTokenRefreshError
import csv
import codecs
import subprocess
import datetime
import os

# information for call API.
scope = ['https://www.googleapis.com/auth/analytics.readonly']
service_account_email = 'xxxxxxxxxxxxx@xxxxxxxxxxxx.com'
key_file_location = '/path/to/google-analytics-key-file.p12'
view_id = '99999999'

# Authenticate and construct service.
service = HelloAnalytics.get_service('analytics', 'v3', scope, key_file_location, service_account_email)

args = sys.argv
arglen = len(args)
# コマンドライン引数の内容を確認
if (arglen < 2):
  # 引数[1]が無い場合はシステム日付を設定
  exec_date = datetime.datetime.today().strftime("%Y-%m-%d")
else:
  # 引数[1]がある場合はその引数を実行日付に設定
  exec_date = args[1]
  
print ""
print "exec_date:" + exec_date

#--------------------------------------------
# データ収集(Main)
# ページビューに関する情報を日単位で取得
#--------------------------------------------
results = service.data().ga().get(
  ids='ga:' + view_id,
  start_date=exec_date,
  end_date=exec_date,
  metrics='ga:pageviews,ga:pageValue,ga:entrances,ga:entranceRate,ga:pageviewsPerSession,ga:uniquePageviews,ga:timeOnPage,ga:avgTimeOnPage,ga:exits,ga:exitRate',
  dimensions='ga:pagePath',
  max_results=20000
).execute()
rows = results.get('rows')

# Write Output File(TSV)
tsvFileName = "GoogleAnalyticsData_" + exec_date + ".tsv"
fout = codecs.open(tsvFileName, 'w', 'utf-8')
filestr = "analysis_date" \
  + "\t" + "pagepath" \
  + "\t" + "pageviews" \
  + "\t" + "pageValue" \
  + "\t" + "entrances" \
  + "\t" + "entranceRate" \
  + "\t" + "pageviewsPerSession" \
  + "\t" + "uniquePageviews" \
  + "\t" + "timeOnPage" \
  + "\t" + "avgTimeOnPage" \
  + "\t" + "exits" \
  + "\t" + "exitRate" + "\n"
fout.write(filestr);

count = 0;
for row in rows:
  pagepath = row[0];
  pageviews = row[1];
  pageValue = row[2];
  entrances = row[3];
  entranceRate = row[4];
  pageviewsPerSession = row[5];
  uniquePageviews = row[6];
  timeOnPage = row[7];
  avgTimeOnPage = row[8];
  exits = row[9];
  exitRate = row[10];
  filestr = exec_date \
    + "\t" + "http://domainname.com" + pagepath \
    + "\t" + pageviews \
    + "\t" + pageValue \
    + "\t" + entrances \
    + "\t" + entranceRate \
    + "\t" + pageviewsPerSession \
    + "\t" + uniquePageviews \
    + "\t" + timeOnPage \
    + "\t" + avgTimeOnPage \
    + "\t" + exits \
    + "\t" + exitRate + "\n"
  
  fout.write(filestr)
  count = count+1;

print count;

6.Linux環境で動作確認する場合のTips

私が今回上記で動作確認したのはMac OS Xでした。しかし、別途環境(Linux/Amazon Linux)を用意し、その上で動かしてみた際には、以下の様なエラーが出てしまいました。証明書周りに関する環境がLinuxでは対応していないとの事です。

Traceback (most recent call last):
  File "/home/ec2-user/xxxxxxxxx.py", line 21, in <module>
    service = hello_analytics_api_v3_auth.get_service('analytics', 'v3', scope, key_file_location, service_account_email)
  File "/home/ec2-user/xxxxxxxxx.py", line 40, in get_service
    service = build(api_name, api_version, http=http)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/util.py", line 140, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/googleapiclient/discovery.py", line 198, in build
    resp, content = http.request(requested_url)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 572, in new_request
    self._refresh(request_orig)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 842, in _refresh
    self._do_refresh_request(http_request)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 869, in _do_refresh_request
    body = self._generate_refresh_request_body()
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 1549, in _generate_refresh_request_body
    assertion = self._generate_assertion()
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 1677, in _generate_assertion
    private_key, self.private_key_password), payload)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/_pycrypto_crypt.py", line 123, in from_string
    'PKCS12 format is not supported by the PyCrypto library. '
NotImplementedError: PKCS12 format is not supported by the PyCrypto library.
Try converting to a "PEM" (openssl pkcs12 -in xxxxx.p12 -nodes -nocerts > privatekey.pem)
or using PyOpenSSL if native code is an option.

手元の環境でPyOpenSSLをyumで導入してみましたが、状況は変わりませんでした。もう1つの方法である『証明書ファイルを.p12から.pemに変換』を行い、実行時の指定も変換を掛けた*.pemファイルに置き換える事で実行出来ました。

# パスワードは『notasecret』。
$ openssl pkcs12 -in xxxxxxxx.p12 -nodes -nocerts > xxxxxxxx.pem

まとめ

という訳でPythonライブラリによるGoogle Analyticsの情報収集に関する手順のご紹介でした。例えばTableauでは直接Google Analyticsに接続する事も可能ですが、この様な形で情報を収集出来れば、よりデータ加工の自由度も広がり、あとは分析環境にデータを突っ込むなり何なりやりたい放題ですね。こちらからは以上です。