Webサイトのreferer

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(ツイッター)である。