Webページへの訪問者がどのWebページのリンクをたどって来たのかは、referer(リファーラー)という名前の変数を調べればいいことになっている。参照元という意味の英語は本来は referrer だが、だれかが綴りを間違えたのが定着してしまったようである。
Apache の access_log には referer が記録されるように設定してあったのだが、SSL(TLS)になってからの設定はさぼっていた。先日、/etc/httpd/conf.d/ssl.conf の
TransferLog logs/ssl_access_log
の直前に
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
と書き込んだので、久しぶりに referer がチェックできるようになった。今回は Python で調べてみよう。
まず、ログの referer 部分だけをファイルに保存するには、次のプログラムを走らせればよい:
#! /usr/bin/env python3 import re with open("/var/log/httpd/ssl_access_log") as f: for line in f: r = re.search(r'^.* .* .* \[.*?\] ".*?" .* .* "(.*?)" ".*?"$', line) if r: print(r[1])
これの出力をファイルにリダイレクトして、解析用マシンに取ってくる。これを次のようにして読んで、referer のドメイン部分をカウントし、大きい順に出力する:
import re cnt = {} with open("ファイル名") as f: for line in f: r = re.search("^https?://(.*?)/", line) if r: if r[1] in cnt: cnt[r[1]] += 1 else: cnt[r[1]] = 1 for i in sorted(cnt.items(), key=lambda x:x[1], reverse=True): print(i[0], i[1])
次のような結果が得られた:
okumuralab.org 112392 www.google.com 4817 oku.edu.mie-u.ac.jp 1675 www.google.co.jp 959 t.co 415 search.yahoo.co.jp 355 texwiki.texjp.org 214 www.bing.com 154 ...
自分のサイトを除けば、やはり Google がトップで、次は t.co(ツイッター)である。