当前位置

从Apache访问日志统计IP访问数,发现采集者屏蔽

James Qi 在 2013年11月8日 - 15:31 提交
内容摘要:在Drupal网站中使用PHP程序来屏蔽采集者效果还不错,可以自己任意设定判断标准。不过我们以前的MediaWiki平台上的网站还没有使用这套PHP程序来屏蔽,最近发现采集又太多了,搞得服务器负载太高......

  在Drupal网站中使用PHP程序来屏蔽采集者效果还不错,可以自己任意设定判断标准。不过我们以前的MediaWiki平台上的网站还没有使用这套PHP程序来屏蔽,最近发现采集又太多了,搞得服务器负载太高,老是从Apache日志人工排查太麻烦、太慢(以前的办法见博文《Apache中设置屏蔽IP地址和URL网址来禁止采集》),今天花一些时间编写了一个小程序来统计日志中的IP访问数,程序很简短,如下:

<?php
/*
* 统计Apache日志文件的IP,找出访问最多的IP地址,方便发现采集者
* James Qi 2013-11-8
*/

//0、设置
$file=$argv[1];//文件名称
$number=50;//需要获取IP的数量

//1、读取
$fp=fopen($file,"r");//以只读的方式打开文件
$ip_array=array();//IP数组赋空值
while(!(feof($fp))) {//循环读取文件中所有行
$line=fgets($fp);//读取文件的一行
if (strpos($line,'HTTP/1.1" 200 ')!=false) {//只寻找访问成功的,排除已经被屏蔽的
  $ip=strtok($line,' ');//取前面的IP地址
  $ip_array[]=$ip;//添加到数组中
}
}

//2、统计
$count_array=array_count_values($ip_array);//统计生成带计数的新数组
asort ($count_array);//带指针排序
$output_array=array_slice($count_array,-$number);//取后面的设置数量的IP

//3、输出
foreach ($output_array as $output_ip=>$output_count) {//循环遍历输出数组
$output_host=gethostbyaddr($output_ip);//获取host name
$output_line="$output_ip : $output_count - $output_host\n";//组合输出行
print $output_line;//打印输出行
}
$output_line="output_ip : output_count - output_host\n";//组成标题行
print $output_line;//打印标题行

//4、结束
?>

  输出如下:

122.146.207.159 : 27 - 122.146.207.159
115.196.76.138 : 28 - 115.196.76.138
121.237.123.91 : 29 - 91.123.237.121.broad.nj.js.dynamic.163data.com.cn
14.114.33.12 : 30 - 14.114.33.12
157.55.33.31 : 30 - msnbot-157-55-33-31.search.msn.com
123.202.147.103 : 32 - 123202147103.ctinets.com
157.56.93.150 : 33 - msnbot-157-56-93-150.search.msn.com
180.158.138.101 : 33 - 180.158.138.101
67.128.22.254 : 34 - 67.128.22.254
112.230.96.7 : 34 - 112.230.96.7
1.36.80.43 : 34 - 1-36-80-043.static.netvigator.com
203.218.185.20 : 36 - pcd395020.netvigator.com
61.15.142.137 : 36 - cm61-15-142-137.hkcable.com.hk
173.243.112.214 : 46 - ded4u.com
183.159.73.30 : 52 - 183.159.73.30
122.238.225.66 : 59 - 122.238.225.66
41.190.2.41 : 73 - 41.190.2.41
157.56.93.42 : 120 - msnbot-157-56-93-42.search.msn.com
157.55.33.111 : 128 - msnbot-157-55-33-111.search.msn.com
157.55.34.25 : 221 - msnbot-157-55-34-25.search.msn.com
91.237.52.132 : 3333 - 91-237-52-132.greendata.pl
output_ip : output_count - output_host

  如果host name不是搜索引擎,就可以屏蔽。

  可以专门建个deny.conf,内容为:

Order allow,deny
Deny from 113.97.135.10 118.249.151.175 180.140.161.253
Deny from 185.24.233.4182.149.62.217 58.60.196.51 183.0.85.6
Allow from all

  然后把这个文件包含到需要的虚拟主机设置中:

Include conf/deny.conf

  再重启Apache就可以生效了。

  这个程序以后还可以设法做得更完善、更智能一些。

添加新评论

Plain text

  • 不允许使用HTML标签。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
验证码
本问题用于测试您是否为人类访问者,避免自动垃圾发贴。
图形验证
键入显示在图片中的字符