Apacheアクセスログと私(クローラーを捕まえてみる)

それでは,本日はロボットの挙動を表示する部分をば.

どんな風に表示するかをまず考える.サイト内遷移の表示をベースに,滞在時間はいらんなとか,同じ検索エンジンのクローラーがいっぱい来るかもしれないから,それはひとまとめにしたいよな,と考え,


ロボットの説明

ユーザーエージェント名/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を変換できるかなぁ.

日時: 2004年10月29日 | PC/Web > Ruby |

コメントを投稿

(空欄でもかまいません)

(メールアドレスは管理人に通知されますが,Web上には表示されません)

Powered by Movable Type