これはperlだから、pythonだからどうこう以前の問題である。
ログのrefererから検索語を抽出するところである。
主にしていることは以下の通りである。
- 検索エンジンの識別
- 検索キーワードの抽出
- 検索キーワードのURLデコード
- URLデコードした文字列の文字コード識別(utf8以外)
ちょっと困ったのは文字コードの識別である。
ほとんどはutf8なのだが、EZの検索だとsjisになる。
これはEZの場合無条件にsijisとしてデコードするのでよい。
問題は、googleでもsjisの場合があることである。
referer内に「Shift_jis」などのキーワードがくっついている場合はそれを見てsjisと判断できるが、そのようなキーワードがないのにsjisの場合がまれにだが、ある。
pythonの場合、「utf8でデコードしてエラーを例外で捕捉しエラーならsjisでデコードし失敗したら不明」という風にした。
perlの場合、Encode::decodeでsjisの文字列をutf8でデコードしてもエラーにならない。
それじゃあ、と、Encode::Guessを使ってみる。
必ずではないがutf8の文字列をguessさせるとエラーになる場合がある。shiftjisの判別は成功するようである。
そこで、エラーは例外で捕捉し、guessに失敗した場合は何もせず、成功してshiftjisだったらshiftjisでデコード、という風にした。
最近のログだと、検索エンジンはgoogle, yahoo, ez, bingのみだ。ezが結構多い。
goo.ne.jpとか baiduとかはもう来なくなった。
数えてみたら、google 60%、yahoo 30%、ez 8%、bing 2% だった。
これをグラフで出すcgiもあとで作ろう。