网站反爬虫策略

    反爬虫策略,表面上看彷佛跟WEB系统优化没有关系,通过分析,发现该策略是能够归到WEB性能优化的系列之中。javascript

    经过分析apache日志发现,某系统40%的带宽和服务器资源都消耗在爬虫上,若是除去10%-15%搜索引擎的爬虫,作好反爬虫策略,能节省20%-25%的资源,实际上是变向优化了web系统。java

1、爬虫请求与正经常使用户请求的区别web

    爬虫请求是相似httpClient的机制或curl,wget的命令,用户请求通常走浏览器。shell

    区别:爬虫请求通常不会执行页面里的异步JavaScript操做,而用户请求则执行Jquery提供的异步JavaScript操做,具体以下:apache

<script type="text/javascript">
$(document).ready(function(){
alertFunTest();
}
function alertFunTest() {
alert(“异步”);
}
</script >

 代码alert(“异步”)通常不会被爬虫请求执行。网页爬虫

2、分析系统有多少爬虫行为后端

  某系统某天的日志分析以下:浏览器

cat access20110421.log | wc -l
2156293

cat page_access20110421.log | sort | uniq -c | sort -nr | head -n20
441421 /读帖页 20.4%
374274 /弹出框 17.3%
266984 /帖子点击数 12.3%
213522 /读取支持数和反支持数 9.9%
207269 /其它 9.6%
203567 /帖子列表页 9.4%
185138 /刷新功能 8.5%
164884 /帖子列表点击 7.6%

如上所示,帖子点击数请求是不会被爬虫执行的。缓存

(读帖页数-帖子点击数)/ 读帖页数=爬虫执行读帖页次数的比例性能优化

(441421 - 266984 )/ 441421=39.6%

结论:近40% 帖子的读取操做是爬虫行为,读帖占系统85%以上的操做,也就是说近1/3以上的网络和服务器资源在为爬虫服务。

3、请求在不一样层面对应的反抓策略

(一)防火墙层面

   经过netstat80端口的tcp链接量判断IP是否非法。

   WEB系统都是走http协议跟WEB容器连通的,每次请求至少会产生一次客户端与服务器的tcp链接。经过netstat命令,就能够查看到当前同时链接服务器所对应的IP以及链接量。

   命令  /bin/netstat -nat -n | grep 80   通常都几百或几千个。

   同一个IP对应的链接数超过咱们观察到的一个阀值时,就可判断为非正常的用户请求。阀值设定相当重要,大型网吧或同一个学校、公司出来的IP也可能会被误判为非法请求。

  此策略我写了两个定时脚本去,一个定时封IP( tcpForbidCmd.sh ),一个定时释放IP ( tcpReleaseCmd.sh ),分别是每隔5分钟和40分钟各执行一次

tcpForbidCmd.sh参考代码以下:

#!/bin/sh
file=/home/songlin.lu/shell/log/forbid-ips-tmp.log
myIps=/home/songlin.lu/shell/log/noforbid_ips.log
today=`date +'%Y%m%d'`
logForbidIp=/home/songlin.lu/shell/log/forbid-iptables-logs-$today.log
netstatFile=/home/songlin.lu/shell/log/forbid-netstat-nat-tmp.log
/bin/netstat -nat -n > $netstatFile
nowDate=`date +'%Y-%m-%d %H:%M'`
/bin/awk -F: '/tcp/{a[$(NF-1)]++}END{for(i in a)if(a[i]>90)print i}' $netstatFile > $file
drop_ip=`cat $file |awk '{print $2}'`
for iptables_ip in $drop_ip
do
if [ $iptables_ip != $0 ] && [ -z "` iptables -L -n | grep DROP | awk '{print$4}'|grep $iptables_ip`" ] && [ -z "` cat $myIps |grep $iptables_ip`"];then
/sbin/iptables -A INPUT -s $iptables_ip -p tcp --dport 80 -j DROP
echo $iptables_ip >> /home/songlin.lu/shell/log/release-forbid-logs-tmp.log
echo '--------------------'$nowDate'----'$iptables_ip >> $logForbidIp
fi
done

文件/home/songlin.lu/shell/log/noforbid_ips.log为白名单列表

tcpReleaseCmd.sh参考代码以下:

#!/bin/sh
today=`date +'%Y%m%d'`
logReleaseIpLog=/home/songlin.lu/shell/log/release-iptables-log-$today.log
iptables=/home/songlin.lu/shell/log/release-iptables-save-tmp.log
tmpFile=/home/songlin.lu/shell/log/release-forbid-logs-tmp.log
/sbin/iptables-save > $iptables
drop_ips=`cat $tmpFile`
nowDate=`date +'%Y-%m-%d %H:%M'`
for iptables_ip1 in $drop_ips
do
if [ ! -z "`cat $iptables |awk /DROP/'{print $4}' | grep $iptables_ip1`" ]
then
/sbin/iptables -D INPUT -s $iptables_ip1 -p tcp --dport 80 -j DROP
echo '--------------------'$nowDate'----'$iptables_ip1 >> $logReleaseIpLog
fi
done
> $tmpFile

  此策略至关于给咱们的系统设定了门槛,相似公路交通系统内,某马路设定限高4米栏杆,高于4米的车不能在此通行。该策略能预防恶意的或新手写的请求频率不规则的爬虫。

(二)WEB服务器容器层面

a.User-Agent判断      b. connlimit模块判断

    每一个爬虫会声明本身的User-Agent信息,咱们能够经过判断爬虫的User-Agent信息来识别,具体查看相关文档

    Apache做connlimit须要mod_limitipconn来实现,通常须要手动编译。

  编辑httpd.conf文件,添加以下配置

ExtendedStatus On
LoadModule limitipconn_module modules/mod_limitipconn.so
< IfModule mod_limitipconn.c >
< Location / > # 全部虚拟主机的/目录
  MaxConnPerIP 20 # 每IP只容许20个并发链接
   NoIPLimit image/* # 对图片不作IP限制
< /Location>  
< /IfModule>

    Nginx做connlimit,限制ip并发数,比较简单

     添加limit_conn  这个变量能够在http, server, location使用  如:limit_conn   one  10;

(三)日志层面

  经过日志和网站流量分析识别爬虫

      用awstats分析服务器日志,用流量统计工具,如Google Analytics来统计IP对应的流量记录,流量统计在网页里面嵌入一段js代码。把统计结果和流量统计系统记录的IP地址进行对比,排除真实用户访问IP,再排除咱们但愿放行的网页爬虫,好比Google,百度,youdao爬虫等。最后的分析结果就获得爬虫的IP地址。

(四)程序层面

      时时反爬虫过滤机制

      实现起来也比较简单,咱们能够用memcached或本地内存来作访问计数器,在缓存过时以前的时间段内(如3分钟),每一个IP访问一次,计数器加1,缓存的KEY包括IP,经过计数器获得的值,判断超过一个阀值,这个IP极可能有问题,那么就能够返回一个验证码页面,要求用户填写验证码。若是是爬虫的话,固然不可能填写验证码,就被拒掉了,保护了后端的资源。

     阀值的设定也是很重要的,不一样的系统不同。

     咱们将这个过滤机制改进一下,将更加准确。 即咱们在网页的最下面添加一个JS的异步请求,此异步请求用来减计数器的值,进页面时对IP进行加值,出页面时减值,生成一个差值。 根据咱们以前的分析,爬虫不会执行异步JS减值请求。 这样能够从生成的值的大小上判断这个IP是否为爬虫。

     程序逻辑以下图所示:

      

[文章做者:狂奔的鹿(陆松林)本文版本:v1.0  转载请注明原文连接:http://www.cnblogs.com/dynamiclu/]

相关文章
相关标签/搜索