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 |

トラックバック

このエントリーのトラックバックURI: https://irusuka.sakura.ne.jp/mt/nuct.cgi/614

コメントを投稿

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

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

Powered by Movable Type Pro 7.1.2