※このブログではサーバー運用、技術の検証等の費用のため広告をいれています。
記事が見づらいなどの問題がありましたらContactからお知らせください。


【Python3】GoogleAnalyticsReportingAPIでブログの月間ランキングを取得

python3 Django GoogleAPI python GoogleAnalyticsAPI GoogleAnalyticsReportingAPI wagtail

投稿日:2020年10月21日

このエントリーをはてなブックマークに追加
GoogleAnalyticsには自信のサイトの情報を取得するAPIが用意されています。このAPIを利用することでブログの人気記事ランキングを非常に柔軟なものにすることができます。この記事ではGoogleAnalyticsReporting APIの設定方法、Python3からの呼び出し方を実際の利用例を合わせて解説しています。

はじめに

この記事について

GoogleAnalyticsには自信のサイトの情報を取得するAPIが用意されています。このAPIを利用することでブログの人気記事ランキングを非常に柔軟なものにすることができます。この記事ではGoogleAnalyticsReporting APIの設定方法、Python3からの呼び出し方を実際の利用例を合わせて解説しています。

この記事では以下のことを前提に話をしていきます。

  • すでにWebサイト(ブログ)を所有している
  • サイトにはすでにページがいくつか存在している
  • GoogleAnalyticsに自信のサイトを登録している

GoogleAnalyticsアカウントの設定

まずはGoogleAnalyticsのアカウントからAPIを使用するための設定をする必要があります。

APIを有効化

まずはGoogleAPIConsoleに入り左上のプロジェクトコンソールから『新しいプロジェクト』をクリックし、対象のブログ用のプロジェクトを作成します。

▲新規プロジェクトを作成

APIとサービスを有効化をクリックしAPIライブラリのページに移動します。

そこで『Google Analytics Reporting API』を検索し有効化します。

▲APIを有効化

サービスアカウントを作成

作成したプロジェクトで、

認証情報 > 認証情報を作成 > サービスアカウント

を選択して認証情報作成画面を開きます。

作成画面では以下の情報を入力します。

  • サービスアカウント名(必須):自分が管理しやすい名前をつけましょう。
  • サービスアカウントID:グローバルで一意である必要のあるIDです。サービスアカウント名が入力されると自動で入力されるものを使用するのがいいでしょう。
  • サービスアカウントの説明:必須ではありませんが、自分の経験上この手のアカウントは後々何のアカウントかわからなくなるのでできるだけ詳しく書いておくことをオススメします。

あとはデフォルトのままで作成します。

認証情報のページにリダイレクトされます。

この画面で表示されるサービスアカウントのメールアドレスはこの後使うのでコピーしておくと良いでしょう。

サービスアカウントから先程作成したサービスアカウントの編集ボタン(鉛筆アイコン)をクリックします。

鍵を作成 > 新しい鍵を作成 

を選択しJSONにチェックを入れて作成をクリックしましょう。

▲鍵の作成

新しい秘密鍵のJSONファイルがローカルのPCにダウンロードされます。このJSONのファイル名はわかりづらいためりりネームしておくと良いでしょう。今回はga_service_account.jsonという名前にかえておきます。


GoogleAnalyticsの設定

GoogleAnalyticsの対象のサイトのプロジェクトを開きます。

サービスアカウントを追加

プロジェクトの左のメニューから管理を選択します。

管理ページが開くのでアカウント、またはプロパティ、ビューのいずれかのアカウントユーザーの管理からアカウント管理画面を開きます。

ここに現在のアカウント一覧が出るので新規追加ボタン(+マーク)をクリックし、ユーザーの追加を選択します。

▲認証情報追加画面を開く

情報として以下の値を入力します。

  • メールアドレス:サービスアカウントのメールアドレス
  • 新規ユーザーにメールで通知する:チェックをはずしておきます。
  • 権限:表示と分析にだけチェックをいれておきます。

最後に追加ボタンを押しましょう。

これでアカウントの設定は完了です。

ViewIDを調べる

AnalyticsAPIでは対象のビューのIDを指定する必要があります。

この値はGoogleAnalyticsの管理ページのビューで指定したいビューを選択した後、ビューの設定から確認できます。

▲ViewIDを取得

Python

ライブラリのインストール

まずは必要なライブラリをインストールします。

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

最終的にはランキングを取得し、それをDBに入れる処理を書いたのですがそれら全てのコードを説明すると流石に長くなってしまうため、

サンプルとして過去30日間の人気記事ランキングのUUID(自分の場合はURLパスの3番目の値とイコール)、タイトル、ビューカウントを表示する関数を作成してみます。

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

SCOPES = ['https://www.googleapis.com/auth/analytics.readonly']    # アカウントのアクセスの権利の範囲
KEY_FILE_LOCATION = './ga_service_account.json'                    # サービスアカウントの相対パス
VIEW_ID = '188763279'                                              # GoogleAnalyticsの対象ViewID

def get_monthly_ranking():
    """
    月間の人気記事ランキングを取得
    """
    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        KEY_FILE_LOCATION, SCOPES)
    analytics = build('analyticsreporting', 'v4', credentials=credentials)
    response = analytics.reports().batchGet(
          body={
            'reportRequests': [
            {
              'viewId': VIEW_ID,
              'dateRanges': [{'startDate': '31daysAgo', 'endDate': 'today'}],
              'metrics': [{'expression': 'ga:pageviews'}],
              'dimensions': [
                  {'name': 'ga:pagePathLevel3'},
                  {'name': 'ga:pageTitle'},
              ],
               "orderBys":
          [
            {"fieldName": "ga:pageviews", "sortOrder": "DESCENDING"},
            ]
          }]
        }
      ).execute()
    data = response.get("reports")[0]["data"]
    # 実際の処理はここでDBにデータをインサート
    for i, page_data in enumerate(data["rows"]):
        dimensions = page_data["dimensions"]
        metrics = page_data["metrics"]
        uuid = dimensions[0].replace("/","")
        title = dimensions[1]
        views = metrics[0]["values"][0]
        print("{}位:[{}]【{}】 {}".format(i + 1, views, uuid, title))

実際に実行すると以下のようにランキングを表示できます。

>>> get_monthly_ranking()
1位:[357]【29305a78-1753-4f3d-9b53-6267e0f77018】 Ubuntuでexeファイルを実行する方法解説|MarsquaiBlog
2位:[286]【069dcbe1-02d1-4edd-a0e4-98ea46443600】 IIYAMAノートPC(STYLE-15FH052-i7-FE)のメモリ増設方法解説|MarsquaiBlog
3位:[215]【d57608c7-9718-4a57-9c03-5f7caf477ab4】 【2019年11月版】WindowsでDjangoの開発環境を構築しよう!|MarsquaiBlog
4位:[190]【dfc90725-b59c-47c4-84c3-4ba08194e7fa】 Unity 2019.1のUnityWebRequestの使い方解説|MarsquaiBlog
5位:[138]【b2deae90-5afc-4bcf-9159-722dfd1aadec】 Django2:ログのローテーションの方法について解説|MarsquaiBlog
6位:[138]【e7ae3563-d771-4420-8c34-ded8ec6273ef】 PythonでGoogleの2段階認証を実装する方法解説|MarsquaiBlog
7位:[97]【bc1bf9fe-9870-4491-b720-cf5d88ef82fa】 Python用SeleniumをDockerコンテナで作成する方法の解説|MarsquaiBlog
8位:[65]【de4d464b-1e55-47f4-b993-85dad837dcab】 Django2:独自のパスワード認証を作る際に便利なメソッド紹介|MarsquaiBlog
9位:[53]【71e724cd-212c-4301-b6d9-378312479f34】 docker-composeでbuildができなくなる問題の解決策メモ|MarsquaiBlog
10位:[47]【dc98d0af-f9e3-414d-ab2c-486a4057b87e】 Python3.6でカラー画像をモノクロ・グレー画像にする方法解説|MarsquaiBlog
11位:[43]【94569559-0b33-4d2d-8ccf-75b0a6458074】 【初心者チュートリアル】Django2でブログ作成(Part1)〜プロジェクトを作成〜|MarsquaiBlog

このAPIで取得できるデータにはブログ記事以外のページ(検索結果のページなど)も含まれているため、これを除外するために実際の処理はもう少し複雑になりますね。

それはそれとして、このブログの月間人気ランキングにはじっさいにこの機能が組み込まれています。

参考程度にこのブログで月間人気ランキングを更新するコードを載せておきます。

環境は以下のとおりです

  • Django==2.2.4
  • Wagtail==2.6.3
  • oauth2client==4.1.3
  • google-api-python-client==1.12.4
from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
from django.conf import settings
from blog.models import BlogPage


# 設定ファイルの読み込み
SCOPES            = settings.GA_SCOPES
KEY_FILE_LOCATION = settings.GA_KEY_FILE_LOCATION
VIEW_ID           = settings.GA_VIEW_ID
THROTTLE          = settings.THROTTLE_MONTHLY_VIEW_UPADTE

def update_view_count(is_all = True):
    """ 全てのページの中からランダムに5つページを選び
    閲覧数を更新する関数
    is_all = Falseの場合はDjangoのsettingファイルで設定した
    THROTTLE_MONTHLY_VIEW_UPADTEの数のページが更新される
    記事は更新日時の古い順に選ばれる
    記事データが大量になった際には
    大量のレコードデータを一気に更新しないようにis_all=Falseにする
    
    THROTTLE_MONTHLY_VIEW_UPDATEは数が多すぎると
    マックスサイズエラーになるので注意
    """
    # 認証情報を初期化
    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        KEY_FILE_LOCATION, SCOPES)
    analytics = build('analyticsreporting', 'v4', credentials=credentials)
    if is_all:
        # 全てのデータを取得
        pages = BlogPage.objects.all()
    else:
        # 対象のページを最終編集日の古い順にTHROTTLE文だけ取得
        pages = BlogPage.objects.order_by("edited")[:THROTTLE]

    # フィルターを作成
    
    filters_expressions = ""
    if is_all == False:
        for page in pages:
            if filters_expressions:
                filters_expressions += ","
            filters_expressions += "ga:pagePath=={}".format(page.get_relative_url())

    
    
    # リクエストを送信
    response = analytics.reports().batchGet(
          body={
            'reportRequests': [
            {
              'viewId': VIEW_ID,
              'dateRanges': [{'startDate': '31daysAgo', 'endDate': 'today'}],
              'metrics': [{'expression': 'ga:pageviews'}],
              'dimensions': [
                  {'name': 'ga:pagePath'},
              ],
                "filtersExpression": filters_expressions,
          }]
        }
      ).execute()
      # データを取得
    data = response.get("reports")[0]["data"]
    
    # ページのパスから閲覧数にマッピングする辞書を作成
    data_dict = { row["dimensions"][0] : int(row["metrics"][0]["values"][0]) for row in data["rows"] }

    # ページデータを更新
    for i,page in enumerate(pages):
        page_path = page.get_relative_url()
        if page_path in data_dict.keys():
            pages[i].view_count_monthly = data_dict[page.get_relative_url()]

    # バルクアップデート
    BlogPage.objects.bulk_update(pages, fields=['view_count_monthly',])

自分の場合はこのコードを定期実行で1日おきに実行しています。


さいごに

Google Analytics Reporting APIは非常に正確なレポートを出してくれるため、このような人気ランキングをつくるにはとても便利そうですね!

他にもいろいろなAPIがあるので使ってみても良いかも??


参考書籍

このエントリーをはてなブックマークに追加


関連記事

記事へのコメント