ロボットのアクセスを分けることにする.特に,ページ内遷移は,人のアクセスだったら「どのぐらいの時間を掛けてるのかな~」と思うけど,クローラーなら一瞬でどんどん読み込んでいっちゃうんだろうから滞在時間なんていらない.
実のところ,だんだん慣れてきたので,コードを書くのはそれほど大変じゃなかった.大変だったのは,どのユーザーエージェントがロボットで,そのロボットはどういう検索エンジンのロボットかを調べることだった.調べている最中にメールアドレス収集ロボットのUAをいくつか知ったので,.htaccessではねておいた.
ま,そいつはともかく,調べた結果を,「ユーザーエージェント名」,「その説明」のタブ区切りテキストにした.このファイルの名前をrobotsinfo.txtにして,定数ROBOT_TXTに読み込んでおく.
それから,ロボット情報読み込みのためのモジュールを作っておく.
#クローラー情報関連読み込み関数
module Crawler
#クローラー情報メソッド:返り値はハッシュで,{ roboto_ua => comment }
def robot_info
r = Hash.new
robotfile = open(ROBOT_TXT)
while roboline = robotfile.gets
robo = roboline.chomp.split(/\t/)
r[robo[0]] = robo[1]
end
robotfile.close
return r
end
module_function :robot_info
#クローラーのUserAgent名を返すメソッド:返り値は正規表現
def robot_name
robot_ua = ""
robotfile = open(ROBOT_TXT)
while roboline = robotfile.gets
robo = roboline.chomp.split(/\t/)
robot_ua = robot_ua + robo[0] + "|"
end
robotfile.close
return Regexp.new(robot_ua.chop)
end
module_function :robot_name
end
いまいち,何をクラスにして,何をメソッドにして,何をモジュールにしたらいいのか分かってないんだよなぁ……
ともかく,ロボットの情報を書いたファイルを読み込んで,変数に入れていくメソッドを作ってみた.(robot_infoは,今回はまだ使わない)
似たようなことしてるんだけど,これって1つにできないのかなぁ.
ま,それは置いといて,あとは簡単で,呼び出し側に robot_re = Crawler::robot_name
と書いておいて,無視ファイルを決めているunless文にunless ignore =~ line.requestURI || robot_re =~ line.user_agent
と書き入れる.
これでおしまい.今回は簡単だったな.