MSNからの訪問者(日本語対応)

前述したMSN検索キーワード抽出プログラムでは、日本語キーワードは「%A5%A4%A5%A4」などの文字列になっています。 これは、URLエンコード(もしくはURLエスケープ)と呼ばれる変換が行われた結果です。 この文字列の日本語としての意味を知るためにはURLエンコードされたデータをデコード(復号化)しないといけません。 ここでは、日本語のMSN検索キーワードをデコードする方法を説明したいと思います。

URLエンコード

HTTPプロトコルではURLとして使って良い文字と使ってはいけない文字が決まっています。 日本語の文字は使って良い文字に含まれていません。 そのため、日本語の文字をURLに含みたい場合には使ってはいけない文字部分を使っても良い文字に変換する必要があります。 この使える文字への変換はURLエンコードと呼ばれます。

URLエンコードされたreferer

アクセスログには、ホームページにたどり着いたリンク元を表すrefererというフィールドがあります。 MSNを経由したユーザのrefererは検索情報を残しています。 例えば、本ホームページへ「geekなぺーじ」という検索キーワードを使ってYahoo!経由で来たユーザは以下のreferer情報を残していきました。


http://search.msn.co.jp/results.aspx?q=geek%E3%81%AA%E3%81%BA%E3%83%BC%E3%81%98

上記リファラー情報のうち、「q=geek%E3%81%AA%E3%81%BA%E3%83%BC%E3%81%98」の部分が検索キーワードになります。 ローマ字で「geek」の部分は読み取れますが「%E3%81%AA%E3%81%BA%E3%83%BC%E3%81%98」は意味不明です。 これは「ぺーじ」という日本語がURLエンコードされたものですがさすがにデコードしないと普通の人には理解できません。 (ただし、日本語文字コードなどに詳しく、これを普通に読んでしまうツワモノも世の中には存在します。)

MSN日本語検索キーワード取得perlスクリプト

以下に、MSNからの訪問者が利用した日本語の検索キーワードをアクセスログから取得するperlスクリプト例を示します。


#!/usr/bin/perl

# 日本語の文字コード変換をしてくれるperlモジュール(Jcode.pm)です
# jcode.plの場合は多少方法が変わってきますが、詳細はここでは扱いません
use Jcode;

open(FILE, "access_log.txt") || die $! . "\n";
while (<FILE>) {
  /^(.*) (.*) (.*) \[(.*)\] "(.*)" (.*) (.*) "(.*)" "(.*)"/;

  # refererの情報を取得します
  $refer = $8;

  # 「http://search.msn」から始まるリファラー情報だけを表示します
  # search.yahooで留めているのはsearch.msn.co.jpと
  # search.msn.com両方に対応するためです
  if ($refer =~ /^http:\/\/search.msn/) {

    # %??の??部分をasciiの16進表示からバイナリに変換しています
    $refer =~ s/\%([A-Fa-f0-9]{2})/pack('C', hex($1))/seg;

    # 文字コードをsjisにしています。
    # windowsの場合はsjisが良いでしょう
    # unix系OSやlinuxの場合は、
    # jcode($refer)->euc; としてeucにした方が良い場合もあります
    # jisにしたい場合は jcode($refer)->jis;としてください
    $refer = jcode($refer)->sjis;

    # とりあえずprintしていますが、
    # 必要に応じてファイルにprintするなどして下さい
    print $refer;
    print "\r\n";
  }
}
close(FILE);

exit;

ここでは、とりあえずはリファラー情報からサーチエンジンの検索キーワードを抽出し、日本語部分をデコードするという処理しかしていません。 必要に応じてカスタマイズして下さい。


IPv6基礎検定

YouTubeチャンネルやってます!