例えば検索エンジン来訪のみのログを取りたい場合などに便利な簡易アクセスログ取得用perlスクリプトを自作してみました。そのページにクローラーからのアクセスがあって初めてログとして取得でき、そのまま出力するへなちょこスクリプトです。例えばCGIが使えないレンタルサーバーの場合、ページ内HTMLにCGIがつかえる別ドメイン宛てにインラインフレームで仕掛けておけば、ある程度クローラーの挙動を知ることができます。
(ただしフレーム内にクローラーのアクセスがあったときしかログは取得されませんので、そういう意味では不便です。)
↓こんな感じになります
材料:
1. CGI使用可能で且つホストネームが取得可能なサーバースペース。
2. ログ保存用のファイル。(ここではhostdata.txtという名前のファイルを使用しています。初期状態は保存したい行数ぶんのデーターを予め入れておきます。)
↓5個まで保存ならこんなかんじで
<li>(10/26 08:40:12)<br>まだ
<li>(10/26 08:37:17)<br>きて
<li>(10/26 08:32:34)<br>いない
<li>(10/26 08:32:31)<br>みたい
<li>(10/26 08:32:28)<br>です。
3. 実行用cgiファイル(下のソース)
流れ#!/usr/bin/perl #--↓ホスト名取得 $host_name = &GetHostName($ENV{'REMOTE_ADDR'}); sub GetHostName { my($ip_address) = @_; my(@addr) = split(/\./, $ip_address); my($packed_addr) = pack("C4", $addr[0], $addr[1], $addr[2], $addr[3]); my($name, $aliases, $addrtype, $length, @addrs); ($name, $aliases, $addrtype, $length, @addrs) = gethostbyaddr($packed_addr, 2); return $name; } #--↓前回までのロボットホスト名のログfileを配列に代入 open(IN,"./hostdata.txt"); @hostdattmp = <IN>; close (IN); #-- ↓現在時刻取得 ($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time); $adtime = sprintf("(%01d/%01d %02d:%02d:%02d)",$mon+1,$mday,$hour,$min,$sec); #--↓来訪者が検索エンジンならば以下実行 if (($host_name =~ /google/i)||($host_name =~ /MSN/i)){ $host_name = "<li>$adtime<br>$host_name\n"; pop(@hostdattmp); unshift(@hostdattmp,$host_name); #----そのホスト名と時間をロボットホスト名fileに保存 open (OUT,"> ./hostdata.txt"); print OUT @hostdattmp; close (OUT); } #--↑ #--↓出力 print "Content-type:text/html\n\n"; print <<"HTML"; <html><head> <title>ろぼアクセスログ</title> <style type="text/css"> <!-- li{color:#F5FFFA;background:#000000;list-style-type:none;margin:2px; font-size:8pt;width:200px;padding:1px;} a{font-size:10px;color:#B0C4DE} --> </style> </head> <body style="margin:0px;padding:0px"> <div style="margin:0px;padding:0px;"> ロボ来訪履歴(googleとMSNのみ) HTML foreach (@hostdattmp){ $_ =~ s/\n/\n<br>/; print $_; } print "$adtime\n"; print "</div></body><html>\n"; exit;