検索後抽出アルゴリズムの改善

perlで書いたcgiをpythonに移植していて、元のコードのアラが見えたので直した。

これは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もあとで作ろう。