iMind Developers Blog

iMind開発者ブログ

GoogleアナリティクスからPythonでレポートを取得する

概要

アクセス数等をGoogleアナリティクスからPythonで取得する。

導入

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

参考サイト

https://developers.google.com/analytics/devguides/reporting/core/v4/quickstart/installed-py

前提条件

Googleアナリティクスのアカウントは既に開設されているものとする。

credentialの用意

https://console.developers.google.com/apis/credentials?project=stellar-arcadia-264509&folder=&organizationId=

上記URLから CREATE CREDENTIALS → OAuth Client IDと選択してOAuthのクライアントIDを生成する。

f:id:imind:20200110225729p:plain

作成したClient IDsを下記からダウンロードする。

https://console.developers.google.com/apis/credentials?project=stellar-arcadia-264509&folder=&organizationId=

f:id:imind:20200110230335p:plain

view idの取得

Google Analyticsのページから左下のAdmin → View Settingsから自身のView IDを確認できる。

サンプルコード

CLIENT_SECRETS_PATH = 'さっき落としたjsonファイルのパス'
VIEW_ID = 'さっき確認したview id'

import httplib2

from apiclient.discovery import build
from oauth2client import client
from oauth2client import file
from oauth2client import tools

SCOPES = ['https://www.googleapis.com/auth/analytics.readonly']
DISCOVERY_URI = ('https://analyticsreporting.googleapis.com/$discovery/rest')

# 認証周りのコード
flow = client.flow_from_clientsecrets(
        CLIENT_SECRETS_PATH,
        scope=SCOPES,
        message=tools.message_if_missing(CLIENT_SECRETS_PATH))
storage = file.Storage('analyticsreporting.dat')
credentials = storage.get()
if credentials is None or credentials.invalid:
    credentials = tools.run_flow(flow, storage)
http = credentials.authorize(http=httplib2.Http())
analytics = build('analytics', 'v4', http=http, discoveryServiceUrl=DISCOVERY_URI)

# 7日分のレポート取得
report = analytics.reports().batchGet(
      body={
        'reportRequests': [
        {
          'viewId': VIEW_ID,
          'dateRanges': [{'startDate': '7daysAgo', 'endDate': 'today'}],
          'metrics': [{'expression': 'ga:sessions'}]
        }]
      }
  ).execute()

実行するとブラウザが立ち上がって「認証されてないアプリだけど」とか言われるけど無視して許可する。

実行結果は下記。

{'reports': [{'columnHeader': {'metricHeader': {'metricHeaderEntries': [{'name': 'ga:sessions',
       'type': 'INTEGER'}]}},
   'data': {'rows': [{'metrics': [{'values': ['1838']}]}],
    'totals': [{'values': ['1838']}],
    'rowCount': 1,
    'minimums': [{'values': ['1838']}],
    'maximums': [{'values': ['1838']}]}}]}

metricsの指定

上記リクエストではmetricsパラメータに [{'expression': 'ga:sessions'}] を指定している。

expressionにga:sessionsとga:pageviews を指定すればセッション数とページビューが取れる。

report = analytics.reports().batchGet(
      body={
        'reportRequests': [
        {
          'viewId': VIEW_ID,
          'dateRanges': [{'startDate': '7daysAgo', 'endDate': 'today'}],
          'metrics': [
            {'expression': 'ga:sessions'},
            {'expression': 'ga:pageviews'},
            {'expression': 'ga:uniquePageviews'},
            {'expression': 'ga:users'},
            {'expression': 'ga:entrances'},
            {'expression': 'ga:exits'},
          ]
        }]
      }
  ).execute()

指定できるパラメータは下記などを参照。

https://ga-dev-tools.appspot.com/dimensions-metrics-explorer/

https://developers.google.com/analytics/devguides/reporting/core/v3/common-queries

日ごとの数値の取得

日毎の集計を取りたい場合は、'dimensions': [{'name': 'ga:date'}] を指定する。

下記は3日前から今日までの日毎のセッション数とPVを取得する例。

report = analytics.reports().batchGet(
      body={
        'reportRequests': [
        {
          'viewId': VIEW_ID,
          'dateRanges': [{'startDate': '3daysAgo', 'endDate': 'today'}],
          'dimensions': [{'name': 'ga:date'}],
          'metrics': [
            {'expression': 'ga:sessions'},
            {'expression': 'ga:pageviews'},
          ]
        }]
      }
  ).execute()

実行結果

{'reports': [{'columnHeader': {'dimensions': ['ga:date'],
    'metricHeader': {'metricHeaderEntries': [{'name': 'ga:sessions',
       'type': 'INTEGER'},
      {'name': 'ga:pageviews', 'type': 'INTEGER'}]}},
   'data': {'rows': [{'dimensions': ['20200108'],
      'metrics': [{'values': ['423', '485']}]},
     {'dimensions': ['20200109'], 'metrics': [{'values': ['482', '565']}]},
     {'dimensions': ['20200110'], 'metrics': [{'values': ['471', '566']}]},
     {'dimensions': ['20200111'], 'metrics': [{'values': ['23', '26']}]}],
    'totals': [{'values': ['1399', '1642']}],
    'rowCount': 4,
    'minimums': [{'values': ['23', '26']}],
    'maximums': [{'values': ['482', '566']}]}}]}

dimensionにはその他にも ga:browserやga:browserVersionでブラウザ別、ga:countryで国別、ga:operatingSystemやga:operatingSystemVersionでOS別の集計などが取れる。

30日分のデータをplotしてみる

pandasとmatplotlibが入っていること。

# 30daysAgoからtodayまで取得
report = analytics.reports().batchGet(
      body={
        'reportRequests': [
        {
          'viewId': VIEW_ID,
          'dateRanges': [{'startDate': '30daysAgo', 'endDate': 'today'}],
          'dimensions': [{'name': 'ga:date'}],
          'metrics': [
            {'expression': 'ga:sessions'},
            {'expression': 'ga:pageviews'},
          ]
        }]
      }
  ).execute()

# 取得したレポートをDataFrameに
import pandas as pd
from datetime import datetime
df = pd.DataFrame([
    {
        'date': pd.to_datetime(dim['dimensions'][0]),
        'session': int(dim['metrics'][0]['values'][0]),
        'pv': int(dim['metrics'][0]['values'][1])
    } 
    for dim in report['reports'][0]['data']['rows']
])

# plot
df.set_index('date').plot()

f:id:imind:20200111150832p:plain

改定履歴

Author: Masato Watanabe, Date: 2020-01-11, 記事投稿