それでは,本日はロボットの挙動を表示する部分をば.
どんな風に表示するかをまず考える.サイト内遷移の表示をベースに,滞在時間はいらんなとか,同じ検索エンジンのクローラーがいっぱい来るかもしれないから,それはひとまとめにしたいよな,と考え,
ロボットの説明
ユーザーエージェント名/IPアドレス
……
……
アクセスしたファイルのリスト
……
……
というのの繰り返しにしようと考える.そこで,作っておいたrobot_infoも利用して,以下のコードを書いた.
#サイト内遷移表示関数(ロボット用)
def trace_robot(file)
header_out("クローラー/オートパイロット-サイト内遷移")
robot_info = Crawler::robot_info #ロボット情報のハッシュ
ignore = Regexp.new("#{IGNORE_FILE_END}$|#{IGNORE_FILE}")
logfile = open(file)
#必要な行をとりあえずハッシュに保持
trace = Hash.new
while logline = logfile.gets
line = Accesslog.new(logline)
#無視するファイルは処理しない
unless ignore =~ line.requestURI
robot_info.each_key{|ua|
reg_robot = Regexp.new(ua) #クローラー情報にあるUAを正規表現にする.
if reg_robot =~ line.user_agent
#必要行をtrace[ua]に入れていく.
#traceはハッシュで,{Key => Array}.
unless trace.key?(ua)
trace[ua] = Array.new
end
#行を保持
trace[ua] << line
end
}
end
end
logfile.close
#得られた行を表示
trace.each{|ua, value|
print "<h3>#{robot_info[ua]}</h3>\n" #最初にロボットの説明を見出しにする.
#ユーザーエージェントとIPを表示する.
print "<h4>ユーザーエージェント【IPアドレス】</h4>\n"
print "<ol>\n"
#重複するUA/IPを削るための操作
ua_ip = value.collect{|rline| "#{rline.user_agent}【#{rline.ip}】"}
ua_ip.uniq.sort.each{|rua| print "<li>#{rua}</li>\n"}
print "</ol>\n"
print "<hr>\n" #区切り
#アクセスされたファイルを表示
print "<h4>リクエストファイル</h4>\n"
print "<ol>\n"
value.each_with_index{|line, i|
print "<li>#{line.requestURI}(#{line.month}月#{line.day}日"
print "#{line.hour}時#{line.minute}分)</li>\n"
}
print "</ol>\n"
print "</div>\n"
}
footer_out() #フッタ表示
end
最初,出力してみたら,見にくかったので,今回,CSSもちょっといじっている.出力サンプルいや,Googleクローラーのすごいこと,すごいこと.
しまった,気づいちゃいたんだけど,IPアドレスのままの物とDNSを引いてリモートホストに変換された物が入り交じってるけど,重複する物ってあるよな.
どうやったらIPを変換できるかなぁ.