にへるつおるぐ | src | ブログ | コンタクト | 統計 | 御串 | 小束 | 裏ミク | つ痛 | 顔本 |

10年ぶりに部屋に入るとコウモリや猫の巣窟だった

Status By Webalizer

2007-09-30 18:36:30 JST-9 | akebia | Webalizer | コメント | トラックバック | 履歴

a40402.pl

Webalizerの検索語の文字化けを軽減したり、サーチエンジンのキャッシュ、画像検索、翻訳機能の検索語にも対応できるようにするプログラムです。 自動判別できない文字コードをなるべく壊さないようにしているので、文字化けが残っても、手動で文字エンコーディングを選ぶ道が残されます。

1. 書式
2. オプション
3. 説明
4. 対応ログ形式
5. 対応検索エンジン
6. テスト環境
7. ご注意
8. 簡単な使い方
9. 詳しい説明
10. プログラムのカスタマイズ
10.1. @search_engineの書式
10.2. オペレータ
10.3. 補足
11. 更新履歴

1. 書式

perl a40402.pl [オプション]... < 入力ファイル > 出力ファイル

2. オプション

-n
半角カタカナを全角カタカナに、全角のアルファベット、数字、記号を半角に変換します。デフォルトでこの処理は行いません。

3. 説明

これは、日本語のWebサイトのApacheのアクセスログのリファラのURLエンコードをWebalizer向けにデコードするプログラムです。標準入力にApacheのアクセスログを流し込むとWebalizer向けにデコードされた状態で標準出力から出てきます。

4. 対応ログ形式

LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio

※common形式の場合には何も加工が行われずそのまま標準出力にスルーされます。

5. 対応検索エンジン

  • Google 検索 キャッシュ 画像 翻訳
  • goo 検索
  • Yahoo! 検索 キャッシュ
  • livedoor 検索
  • フレッシュアイ 検索
  • Excite 検索 キャッシュ
  • @nifty 検索
  • BIGLOBE 検索
  • msn 検索
  • CEEK.JP 検索
  • Ask.jp キャッシュ

6. テスト環境

  • xampp-win32-1.6.1 xampp-win32-perl-addon-5.8.8-2.2.4 Jcode-2.06
  • Debian GNU/Linux perl_5.8.8-7_i386 libjcode-pm-perl_2.06-1_i386 webalizer_2.01.10-32_i386

7. ご注意

  • プログラムはUTF-8で保存して下さい。
  • デコード結果の文字コードはUTF-8になります。
  • 文字化けは軽減されますが、完全には解消されません。例として、ここを参考にして下さい。
  • このプログラムはなるべく文字コードを壊さないようにしていますが、Webalizerの大文字を小文字に変換する機能で若干壊れてしまうのはどうしようもありません。
  • -nオプションを使うと文字コードを判別できなかった文字は完全に壊れます。おまけにデコード処理にそれなりに時間がかかるようになります。

8. 簡単な使い方

ここでは、Debian GNU/Linuxでの簡単な使い方を説明します。テスト環境の「Debian GNU/Linux…」に続けて書いてあるパッケージかその相当品を予めインストールしておいて下さい。

  1. 試しに手ごろなログをa40402.plの標準入力に流し込んでみて、プログラムが動作するか確認してみます。

    ./a40402.pl < /var/log/apache2/access.log

    エラーが出た場合は何か足りないと思われるパッケージをインストールしてみたりして対処します。

  2. webalizer.confに以下のような行を書き加えます。

    HTMLHead <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    ※Webサーバの設定で、既にこれに相当する設定がしてある場合、この設定は不要に思えますが、統計ページをダウンロードしてローカルで開く場合等を考えるとしておいた方が無難です。(UTF-8の自動判別は難しいので。)あけび猫が試したところ、統計ページにこの行が二重に出力されるみたいですが、細かいことは気にしないことにします。

    さらに「SearchEngine」で始まる行を次のようなのに置き換えます。

    SearchEngine    google          q=
    SearchEngine    yahoo.co.jp     p=
    SearchEngine    yahoofs.jp      p=
    SearchEngine    infoseek.co.jp  qt=
    SearchEngine    livedoor.com    q=
    SearchEngine    fresheye.com    kw=
    SearchEngine    excite.co.jp    search=
    SearchEngine    nifty.com       Text=
    SearchEngine    biglobe.ne.jp   q=
    SearchEngine    msn.co.jp       q=
    SearchEngine    live.com        q=
    SearchEngine    goo.ne.jp       MT=
    SearchEngine    baidu.jp        wd=
    SearchEngine    ask.jp          q=
    SearchEngine    mooter.co.jp    keywords=
    SearchEngine    ceek.jp         q=
    SearchEngine    alexa.com       q=
    SearchEngine    yahoo.com       p=
    SearchEngine    altavista.com   q=
    SearchEngine    lycos.com       query=
    SearchEngine    hotbot.com      query=
    SearchEngine    msn.com         q=
    SearchEngine    bing.com        q=
    SearchEngine    naver.jp        q=
    SearchEngine    netscape.com    query=
    SearchEngine    mamma.com       query=
    SearchEngine    alltheweb.com   q=
    SearchEngine    sensis.com.au   find=

    ※infoseek.co.jpは対応できていないので文字化けする頻度が高めです。

  3. /etc/cron.daily/webalizerを以下のように修正します。

    /etc/cron.daily/webalizer
    • 「A40402=/root/bin/a40402.pl」の部分は実際にa40402.plが置いてある所を示すように修正して下さい。
    • 「TMPFILE=/var/tmp/webalizer-daily」は一時ファイルです。必要であれば、各自の環境に合わせて調整して下さい。
    • 「${A40402} < ${LOGFILE} > ${TMPFILE}; ${WEBALIZER} -c ${i} -Q ${TMPFILE} …」の部分がキモです。似たような箇所が2箇所あります。a40402.plでの変換結果を一時ファイルに保存してから、webalizerに読ませます。webalizerの標準入力に直接流し込むのは、あけび猫が試したところ、うまくいきません。
  4. これで、元のwebalizerの設定よりも検索語の文字化けが軽減され多くの検索語が収集されることが期待できます。

9. 詳しい説明

このプログラムは詳しくは以下のような事をしています。

  • ログ形式がcombinedの場合にはログの各行の改行コードの直前に半角スペースを挿入します。あけび猫が試したところ、これをやらないと何故かxampp-win32のWebalizerではユーザエージェントの末尾が欠けることがありました。
  • リファラとユーザエージェントのエスケープ(\x...)を解除し、その結果ダブルクォーテーションが出てきた場合にはそれをURLエンコードします。
  • 画像検索等でURLエンコードが重複してかかっている場合にはそれを解除します。
  • キャッシュや画像検索等のリファラを通常の検索のものっぽく見えるように加工します。
  • 最終的にデコードすると「"%&=」の何れかの文字になるコードを半角スペースに置き換えます。これをやらないと、Webalizerが明後日のものを検索語として拾うかもしれません。
  • URLエンコードをデコードし、UTF-8以外の日本語文字コードをUTF-8に変換します。UTF-8か否か判別が難しい場合には文字コード変換はしません。
  • -nオプションが与えられていればノーマライズを行います。

10. プログラムのカスタマイズ

このプログラムは、「@search_engine」という二次元配列の定義を修正することにより、対応検索エンジンを増やしたり、検索エンジンの仕様変更に対応できることがあります。

10.1. @search_engineの書式

@search_engine = (['検索エンジン', 'パラメータ名', 'オペレータ', 'オペランド', …], …);

検索エンジン
検索エンジンのドメインとパスを示す正規表現です。リファラがこれと一致すると、オペレータによる処理が行われます。
パラメータ名
検索語を示すパラメータ名です。これは、webalizer.confのSearchEngineキーワードの2番目の文字列と同じような意味です。
オペレータ
色々なオペレータが指定できます。オペレータが無い場合、検索語はUTF-8への変換処理されます。
オペランド
オペレータの種類によりオペランドの意味や個数が異なります。オペランドが無いこともあります。

10.2. オペレータ

オペレータは左から右に順に評価されます。評価すべきオペレータが無くなると検索語はUTF-8への変換処理されます。オペレータにより評価が中断されるとURLエンコードをデコードする処理は行われますが、UTF-8への変換処理は行われません。

!
リファラにオペランド(正規表現)で示されたCGIパラメータが存在しなければ次のオペレータを評価します。さもなければ評価を中断します。オペランドは1つです。
=
リファラにオペランド(正規表現)で示されたCGIパラメータが存在すれば次のオペレータを評価します。さもなければ評価を中断します。オペランドは1つです。
n
!オペレータと同じ動作をします。ただし、CGIパラメータとマッチングされるリファラのURLエンコードをデコードした状態で行います。
e
=オペレータを同じ動作をします。ただし、CGIパラメータとマッチングされるリファラのURLエンコードをデコードした状態で行います。
.
評価を中断します。オペランドはありません。
;
評価を次の配列に飛ばします。オペランドはありません。
h
リファラのドメインをオペランドで示されたものに置換し、次のオペレータを評価します。オペランドは1つです。
s
リファラに対してPerlの文字列置換(s///)を実行し、次のオペレータを評価します。オペランドは文字列置換文の最初の「s」を除いたものです。オペランドは1つです。
u
リファラのURLエンコードをデコードし、次のオペレータを評価します。オペランドはありません。

10.3. 補足

  • リファラが@search_engineにマッチングすることなくスルーしてしまうと、リファラの加工が十分ではなく、webaliserが明後日のものを検索語として拾う可能性があるので、@search_engineの最後の配列は「['.*', '', '.']」として全てのリファラをマッチングさせておいて評価を中断してください。さすれば、文字コードの変換はされませんが、その他の雑多な処理が行われます。
  • 既存のオペレータで対応できない事態に陥った時には、check_encodeサブルーチンをいぢくってオペレータの種類を増やして下さい。

11. 更新履歴

2008-12-4
リファラに含まれる改行コードをスペースに変換するようにした。これは、デコード後のログに、時々不正なレコードができる問題の修正です。
2007-9-30
公開

MyMiniCity 人気ブログランキングへ

  1. webalizer SearchEngine bing (3)
  2. webalizer 正規表現 (3)
  3. combined combinedio awk (2)
  4. webalizer 設定 bing (2)
  5. アクセスログ urlデコード bingの文字コード (1)

Comments

No comments yet

Add Comment

Trackback

このトラックバックURL(右クリックして、リンクのURLをコピー)を使ってこの記事にトラックバックを送ることができます。もしあなたのブログがトラックバック送信に対応していない場合にはこちらのフォームからトラックバックを送信することができます。トラックバックの手動送信に失敗したり、拒否された場合には、あけび猫が入力しますので、こちらまでご連絡下さい。重複したトラックバックは、自動的に1つにまとめられるようなので、気軽に色々試してみて下さい。


http://2hz.org/akebia/