schedule2018-07-27

リクエスト情報から訪問者の情報を集めてみる[Python Flask + DynamoDB]-1.設計編

2018年12月にブログを移行した際にこの機能は削除しました。

はじめに

解析の勉強のため、このブログの統計情報を集めようと思い立ちました。

手始めに、記事のアクセス時刻や利用しているブラウザなどの情報を取得します。 本ブログは、Python + Flaskで構築しているため、Flask requestを利用します。

この記事では、記事のページを見るユーザーの情報をFlask requestで集め、DynamoDBに保存するところまで設計します。

普段使っている、Google Analyticsが高機能すぎますね。 調べると、Core Reporting APIで色々できるみたいです。 追々差別化できるようにしないと。。。

実装編はこちら

リクエスト情報から訪問者の情報を集めてみる[Python Flask + DynamoDB]-2.実装編

概要

Flaskは、request.environにアクセス元の情報がまとめられています。 そこから情報を取り出し、DynamoDBに保存します。

Flaskについては、以前の記事[Python] Flask入門とサーバレスアーキテクチャをご覧下さい。

環境

$ python --version
Python 3.6.5
$ pip show Flask
Name: Flask
Version: 1.0.2

request.environの中身

ちょうど良いドキュメントが見つからないので、直接見てしまいましょう!

print(request.environ)

これで表示したものを、見やすくjsonに加工したものが以下になります。

{
    "wsgi.version": (1,0),
    "wsgi.url_scheme": "http",
    "wsgi.input": <_io.BufferedReader name=5>,
    "wsgi.errors": <_io.TextIOWrapper name="<stderr>" mode="w" encoding="UTF-8">,
    "wsgi.multithread": True,
    "wsgi.multiprocess": False,
    "wsgi.run_once": False,
    "werkzeug.server.shutdown": <function WSGIRequestHandler.make_environ.<locals>.shutdown_server at 0x10f00c950>,
    "SERVER_SOFTWARE": "Werkzeug/0.14.1",
    "REQUEST_METHOD": "GET",
    "SCRIPT_NAME": "",
    "PATH_INFO": "/article/8",
    "QUERY_STRING": "",
    "REMOTE_ADDR": "127.0.0.1",
    "REMOTE_PORT": 62057,
    "SERVER_NAME": "127.0.0.1",
    "SERVER_PORT": "5000",
    "SERVER_PROTOCOL": "HTTP/1.1",
    "HTTP_HOST": "127.0.0.1: 5000",
    "HTTP_CONNECTION": "keep-alive",
    "HTTP_PRAGMA": "no-cache",
    "HTTP_CACHE_CONTROL": "no-cache",
    "HTTP_UPGRADE_INSECURE_REQUESTS": "1",
    "HTTP_USER_AGENT": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
    "HTTP_ACCEPT": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
    "HTTP_REFERER": "http://127.0.0.1:5000/contents/Google%20Adsence",
    "HTTP_ACCEPT_ENCODING": "gzip, deflate, br",
    "HTTP_ACCEPT_LANGUAGE": "ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7",
    "HTTP_COOKIE": "gsScrollPos-1901=; gsScrollPos-2345=0; gsScrollPos-1735=0; _ga=GA1.1.1286324805.1530497168; session=eyJ1c2VybmFtZSI6ImFkbWluIn0.Dh3nXg.HvlJWyVbh3Zsa2-6fEi_lMVaDJo; _gid=GA1.1.316787490.1532584271; _gat_gtag_UA_106883433_1=1",
    "werkzeug.request": <Request "http://127.0.0.1:5000/article/8" [GET]>
}

※ local環境でChromeからテストした情報です。

httpのヘッダーの情報が入っていることがわかります。 Google Analyticsもきっと、ヘッダーの情報を収集しているんでしょうね。

貯めておくと面白そうな情報が色々ありました。

key 説明 value
REMOTE_ADDR IPアドレス 127.0.0.1
HTTP_USER_AGENT ブラウザやOSの情報 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
HTTP_CONNECTION 継続したコネクションかどうか keep-alive
PATH_INFO URLのパス /article/8

取得する項目とDynamoDBのテーブル設計

以下の項目を取得します。 DynamoDBのテーブル設計も兼ねます。

Table: page_view_logs

field name primary key 説明
article_id hash key 記事のID
view_at range key 閲覧時刻'%Y-%m-%d %H:%M:%s'日本時間
remote_addr   IPアドレス
browser   利用したブラウザ
user_os   osの種類
is_keep_alive   継続したコネクションか

記事毎に集計できるように、記事IDと閲覧時刻をプライマリーキーにしました。この2項目は、URLとdatetimeから得ます。

6項目を取得していきます。


実装編はこちら

リクエスト情報から訪問者の情報を集めてみる[Python Flask + DynamoDB]-2.実装編


本ブログの構成について