見出し画像

GoogleアナリティクスのデータをPythonを使って自動取得する。参考サイトをまとめた。

こんにちは(@t_kun_kamakiri)

昨日はGoogleAdsAPIを使って検索ボリュームの自動取得を行いました。

本日はブログアクセス数の自動取得をやっていました。

Googleアナリティクスのデータが自動で習得出来たら便利ではないですかね。
毎回Googleアナリティクスにアクセスして見に行くのではなくPythonで自動実行させたものをLINEやGoogleスプレッドシートにまとめるというのを勝手にやらせればいいというわけです。

画像1

本記事では「Googleアナリティクスのデータの自動取得」参考にした記事をご紹介します。

公式サイト

公式サイトを見ればおおよその手順が書いています。

しかし、公式ドキュメントはとてもわかりにくいので、わかりやすく書き直してくださっている方がいました。

Googleアナリティクスデータ自動取得までの手順のわかりやすいサイト

↓こちらの記事がとてもわかりやすかったですね。

基本的なことはこれでできるようになります。

直帰率と滞在時間も出力したい

ブログのアクセスのデータ分析には「直帰率(もしくは離脱率)」「滞在時間」も重要な指標です。

この2つの指標を見てブログ記事を書き直すかを考えるわけです。

滞在時間の出力の仕方は、こちらのサイトにわかりやすくまとまっていました。

↓その他に知りたい指標がある場合はこちらのサイトも参考になります。

全体のコード

全体のコードは公式サイトで配布されています。
今回は、直帰率と滞在時間も出力するように少し改良したコードにしました。

以下のコードで「ページビュー数、セッション数、直帰率、滞在時間」の出力ができます。

※ちなみに対象とする日付の設定はこちらです。

画像3

from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials

SCOPES = ['https://www.googleapis.com/auth/analytics.readonly']
KEY_FILE_LOCATION = 'daring-charmer.json'
VIEW_ID = '******' # viewID アカウントIDではない。


def initialize_analytics_reporting():
  credentials = ServiceAccountCredentials.from_json_keyfile_name(KEY_FILE_LOCATION, SCOPES)
  return build('analyticsreporting', 'v4', credentials=credentials)


def get_report(analytics):
  request_body = {
          'reportRequests': [{
              'viewId': VIEW_ID,
              'pageSize': 40,
              'dateRanges': [{'startDate': '2021-01-01', 'endDate': '2021-01-31'}],
           #    'dateRanges': [{'startDate': '2021-01-01', 'endDate': 'today'}],
              'metrics': [
                  {'expression': 'ga:pageviews'},
                  {'expression': 'ga:sessions'},
               #    {'expression': 'ga:uniquePageviews'},
               #    {'expression': 'ga:users'},
               #    {'expression': 'ga:exitRate'},
                  {'expression': 'ga:bounceRate'},
                  {'expression': 'ga:avgTimeOnPage'},
               #    {'expression': 'ga:entrances'},
               #    {'expression': 'ga:exits'},
               #    {"expression": "ga:transactions"}
                  ],
              'dimensions': [
               #    {'name': 'ga:date'},
                  {'name': 'ga:userType'}, 
                  {'name': 'ga:sourceMedium'},
               #    {'name': 'ga:landingPagePath'},
                  {'name': 'ga:pagePath'},
                  {'name': 'ga:pageTitle'},
               #    {'name': 'ga:cohortVisitDurationPerUser'}
                  ],
              'orderBys': [{'fieldName': 'ga:pageviews', 'sortOrder': 'DESCENDING'}]
          }]
  }
  return analytics.reports().batchGet(body=request_body).execute()


def print_response(response):
  for report in response.get('reports', []):
      column_header = report.get('columnHeader', {})
      dimension_headers = column_header.get('dimensions', [])
      metric_headers = column_header.get('metricHeader', {}).get('metricHeaderEntries', [])

      for row in report.get('data', {}).get('rows', []):
          print('-----------------------------')
          dimensions = row.get('dimensions', [])
          date_range_values = row.get('metrics', [])
          for header, dimension in zip(dimension_headers, dimensions):
              print(header + ': ' + dimension)
          for i, values in enumerate(date_range_values):
              for metricHeader, value in zip(metric_headers, values.get('values')):
                  if metricHeader.get('name') == 'ga:bounceRate':
                      print(f"{metricHeader.get('name')} : {str(round(float(value),1))} %")
                  elif metricHeader.get('name') == 'ga:avgTimeOnPage':
                      minu = int(float(value) // 60)
                      sec = int(float(value) - minu*60) 
                      print(f"{metricHeader.get('name')}: {str(minu)}{str(sec)}秒")
                  else:
                      print(f"{metricHeader.get('name')} : {value}")


def main():
  analytics = initialize_analytics_reporting()
  response = get_report(analytics)
  print_response(response)


if __name__ == '__main__':
  main()

画像2

これでできましたね(^^)

今後としては週一でLINEに通知するか、Googleスプレッドシートにまとめるように改良していきます。

ブログやっている方は是非Pythonで自動化をやってみてください(^^)/

Twitter➡@t_kun_kamakiri
Instagram➡kamakiri1225
ブログ➡宇宙に入ったカマキリ(物理ブログ)
ココナラ➡物理の質問サポートサービス

この記事が気に入ったらサポートをしてみませんか?