naritoブログ

【お知らせ】
新ブログができました。今後そちらで更新し、このサイトは更新されません(ウェブサイト自体は残しておきます)
このブログの内容に関してコメントしたい場合は、新ブログのフリースペースに書き込んでください

このブログの内容を新ブログに移行中です。このブログで見つからない記事は、新ブログにありま

Djangoで、グーグルアナリティクスから人気ページを取得し表示する

約1209日前 2017年5月31日7:59
プログラミング関連
Django Python
Pythonで、グーグルアナリティクスから人気ページを取得する
https://torina.top/detail/357/

前回、グーグルアナリティクスから人気ページを取得する方法を書きました。
今回は、ブログなんかによくある、以下のような機能を作成します。右側に人気ページのリンクがありますね。



アナリティクスから過去一週間の人気ページを取得する必要があります。
これはコマンドとして登録し、cron等で指定した日付、時間に行うようにするとよいでしょう。

Djangoでcron
https://torina.top/detail/223/

アプリケーションのディレクトリ内に、「management」ディレクトリを
その中に「commands」を
そして、その中にいくつかファイルをおいていきます。
まずは前回取得した、「client_secrets.p12」を置きます。

次に過去一週間の人気ページを取得するスクリプトを起きます。
前回から少し変更していますが、ほとんど同じです。これを「api.py」として起きます。
SERVICE_ACCOUNT_EMAILと、VIEW_IDは自分のものを入れてください。

"""Hello Analytics Reporting API V4."""
import argparse
import os

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

import httplib2
from oauth2client import client
from oauth2client import file
from oauth2client import tools

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
KEY_FILE_LOCATION = os.path.join(BASE_DIR, 'client_secrets.p12')
SCOPES = ['https://www.googleapis.com/auth/analytics.readonly']
DISCOVERY_URI = ('https://analyticsreporting.googleapis.com/$discovery/rest')

# この2つをかきかえてね
SERVICE_ACCOUNT_EMAIL = 'サービスアカウントID'
VIEW_ID = 'ビューID'


def initialize_analyticsreporting():
"""Initializes an analyticsreporting service object.

Returns: analytics an authorized analyticsreporting service
object.

"""

credentials = ServiceAccountCredentials.from_p12_keyfile(
SERVICE_ACCOUNT_EMAIL, KEY_FILE_LOCATION, scopes=SCOPES)

http = credentials.authorize(httplib2.Http())

# Build the service object.
analytics = build('analytics', 'v4', http=http,
discoveryServiceUrl=DISCOVERY_URI)

return analytics


def get_report(analytics):
# Use the Analytics Service Object to query the Analytics Reporting API V4.
return analytics.reports().batchGet(
body={
'reportRequests': [
{
'viewId': VIEW_ID,
'pageSize': 10,
'dateRanges': [
{'startDate': '7daysAgo', 'endDate': 'today'}
],
'metrics': [
{'expression': 'ga:pageviews'},
],
'dimensions': [
{'name': 'ga:pagePath'}, {'name': 'ga:pageTitle'}
],
'orderBys': [
{'fieldName': 'ga:pageviews', 'sortOrder': 'DESCENDING'},
]
}]
}
).execute()


def get_10_popular():
"""過去1週間の人気ページを10件返す

URL、ページタイトル、PV数をyieldで返します

"""
analytics = initialize_analyticsreporting()
response = get_report(analytics)
for report in response.get('reports', []):
rows = report.get('data', {}).get('rows', [])
for row in rows:
url = row['dimensions'][0]
title = row['dimensions'][1]
page_view = row['metrics'][0]['values'][0]
yield url, title, int(page_view)


if __name__ == '__main__':
for url, title, page_view in get_10_popular():
print(url, title, page_view)



最後に、「execute.py」を起きます。
ファイル名はコマンド名に当たる部分となり、
python manage.py execute
で実行されます。
中身は以下のようにします。

"""python manage.py execute で呼ぶ処理を定義するモジュール."""
from django.core.management.base import BaseCommand
from app.models import PopularPost
from .api import get_10_popular


class Command(BaseCommand):
"""コマンド定義のためのクラス."""

def handle(self, *args, **options):
"""コマンド定義のための関数。実際の処理はapi.main()."""
# 過去一週間の人気データを全て削除し、新たに作り直す
PopularPost.objects.all().delete()
for url, title, page_view in get_10_popular():
PopularPost.objects.create(
url=url, title=title, page_view=page_view)


人気ページ10件をデータベースに保存しています。PopularPostという、URL、タイトル、PV数を持つシンプルなモデルです。
コマンドを実行すると、PopularPost.objects.all().delete()で前回の人気ページを一度初期化します。
これは絶対こうする必要はなく、例えば人気ページを実行した日付と関連付けて保存したままにしておくとか、色々できるはずです。
ただ、今回はシンプルにするため、この方法にしています。

その後はapi.pyから必要な情報を取得し、PopularPost.objects.createしています。シンプルです。
ファイルとディレクトリの構成を、もう一度整理しておきます。プロジェクト名は「project」、アプリケーション名は「app」で、実行コマンド名が「execute」の場合です。



今回人気ページを保存するために使ったモデルは以下のような感じです。

from django.db import models


class PopularPost(models.Model):
"""人気記事."""

title = models.CharField('タイトル', max_length=255)
url = models.CharField('URL', max_length=255)
page_view = models.IntegerField('ページビュー数')

def __str__(self):
return '{0} - {1} - {2}'.format(
self.url, self.title, self.page_view)



templateでは、以下のようにして呼びました。

<p>過去一週間の人気ページ</p>
{% for popular in popular_post_list %}
<p>
<a href="{{ popular.url }}">{{ popular.title }}</a>
- {{ popular.page_view }}View
</p>
<hr>
{% endfor %}
kurokuro 約427日前 2019年7月21日23:18
初めまして、narito様の記事を参考に制作をしているものですが、人気記事の取得の際に記事に関連するtagの取得は可能でしょうか?
ご教授頂けると幸いです。よろしくお願い致します。
なりと 約419日前 2019年7月29日17:10
この例だと、Googleアナリティクスから取得した記事のURLには記事のpkがあるので、まずそのpkを抜き出します。その後は、Post.objects.get(pk=取得したpk) のようにし、紐づくタグを取得できます。