Top
Webalizerの漢字コード統一
突っ込み・指摘助言などがありましたら
掲示板までお願いします。
[追記 2007/07/11]
転送バイト数の集計がおかしくなるバグがありましたのでスクリプトを修正しました。
具体的には末尾の方で「$ref =~ s/\"/%22/g;」を追加し、リファラーに「"」が入らないようにしています。
Webalizerでログを処理させると、サーチエンジンで入力された文字列が
Search Stringsの欄に表示されます。
しかし、Webブラウザやサーチエンジン毎に使用される漢字コードは違うのですが、
Webalizer自身は漢字コードの違いについてはまったく面倒を見てくれません。
結果として、同じキーワードが別カウントになったり、
複数の漢字コードが混在する結果文字化けして表示されたりします。
調べてみた所、
- webalizerにログを食わせる前に、
Jcode.pmを使った簡単なスクリプトでログを処理して漢字コードを統一する。
(Google等で「webalizer コード」等で検索するといくつかヒットします)
- webalizerにパッチを当ててwebalizer自体に処理させる。
(webalizerの検索語の日本語対応の話)
という解決方法がありましたが、個人的には次のように感じました。
- どうせならもっと複雑な処理をさせてもいいのではないか。
- Unicodeに対応してない。またwebalizerのパッケージを作り直すのも、
Debianパッケージの利用に慣れてしまった身には面倒。
ということで「色々と凝ったコード変換その他を行うperlスクリプト」を作成してみました。
以下の特徴があります。
- 変換が不要なログはJcodeで処理しないので、
複雑な処理をやる割にはJcodeで単純に処理した場合と同じくらいの速度を実現。
(その代わり、スクリプトの一部を個人でカスタマイズする必要あり)
timeコマンドでベンチマークしてみました。
#これくらいのログの処理で勝負。
% wc -l webalizer.log
38957 webalizer.log
#このページのスクリプトで測定。
% time perl jconv webalizer.log > /dev/null
13.580u 0.350s 0:19.79 70.3% 0+0k 0+0io 421pf+0w
#自作スクリプトで測定。
% time perl webalizer-decode.pl webalizer.log > /dev/null
15.820u 0.360s 0:24.40 66.3% 0+0k 0+0io 424pf+0w
- URL中に漢字コードを特定する情報があればそれを利用し、
Jcode.pmでの変換時に入力漢字コードを指定する。
(Jcode.pmに漢字コードを自動識別させた時の誤認識を避ける)
- Googleが漢字コードの指定に「ie=」という引数を使用しているので、
これを解析する。
(2005/3/9 追加)
- 検索文字列としてよく登場するが、自動認識に必ず失敗する短い単語がある場合、
そのコードをソース中に埋め込んで比較し、漢字コードを特定する。
(2005/3/9 追加)
- サーチエンジンの引数に「utf-8」という文字列が含まれていたらUTF-8とみなす。
- 2byte 英文字は 1byte アルファベットに変換し、さらにアルファベットは小文字に統一する。
これにより例えば「ADSL」「adsl」「ADSL」「adsl」はすべて「adsl」に変換され、
同じキーワードとして認識される。
- キーワードの並びをソートする。
またソートのために 2byte 空白は 1byte 空白(ログ上では「+」)に変換し、キーワードの切れ目とする。
これにより例えば「adsl 固定ip」と「固定ip adsl」はソートにより「adsl 固定ip」に統一され、
同じキーワードとして認識される。
- webalizer.conf を読み込んで、SearchEngine ディレクティブで指定されているサーチエンジンと引数についてのみ漢字コードの統一処理を行う。
(上のアルファベット統一処理とかキーワードのソートのためにも必要な処理です)
- 入力されるログは Apache の combined ログであると仮定しています。
こんなやつね。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
- 仮にキーワード中に「+」や「&」が含まれていた場合、
それらはキーワードや引数の区切りとして処理されてしまいます。
(キーワードの処理手順を厳密に考慮してないため。手抜きです。^_^;)
Webalizerに日本のサーチエンジンを追加
上記のように Webalizer は SearchEngine ディレクティブでサーチエンジンの設定を行います。
いくつかの代表的なサーチエンジンについては標準の webalizer.conf に最初から設定されていますが、
日本国内のサーチエンジンについてはまったく登録されていないので追加設定する必要があります。
(さもないとSearch Stringsの欄にはほとんど何も表示されません)
以下が設定例です。
私のサイトにきているサーチエンジンについてのみ調査したので抜けはあるかと思います。
SearchEngine google.co.jp q=
SearchEngine search.yahoo.co.jp p=
SearchEngine goo.ne.jp MT=
SearchEngine infoseek.co.jp qt=
SearchEngine search.msn.co.jp q=
SearchEngine search.nifty.com Text=
SearchEngine search.biglobe.ne.jp q=
SearchEngine cache.yahoofs.jp w=
hiramoto@flatray.com (平本 光二/HIRAMOTO Kouji)