前段时间Guang.com常常受到恶意spider攻击,疯狂抓取网站内容,一系列机器人spam发广告,对网站性能有较大影响。html
下面我说说一些反恶意spider和spam的策略和思路。python
1. 经过日志分析来识别恶意爬虫/攻击redis
less guang.com_access.log | awk -F- '{print $1}' | sort | uniq -c | sort -rn | head -n 50
首先分析access log,类聚统计出访问量前50 IP
shell
排除白名单IP 和正常spider(baidu,google...)浏览器
host 112.94.32.135 //查看可疑ip是否是baidu、google等常规爬虫。
分析能够ip 请求时间、频率、路径等,你能够很容易发现这是不是一个spider,下面那明显是一个spider。服务器
less access.log | grep '112.94.32.135' | less 112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /baobei/1888476 HTTP/1.1" 200 107876 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /baobei/1922742 HTTP/1.1" 200 110053 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /u/1437104 HTTP/1.1" 200 10751 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /baobei/1733527 HTTP/1.1" 200 98099 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /u/1437105 HTTP/1.1" 200 10891 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /baobei/1646377 HTTP/1.1" 200 95527 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /u/1437106 HTTP/1.1" 200 10681 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:51 +0800] "GET /baobei/1922741 HTTP/1.1" 200 98356 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:51 +0800] "GET /baobei/1733526 HTTP/1.1" 200 97690 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:51 +0800] "GET /u/1437107 HTTP/1.1" 200 10765 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:51 +0800] "GET /baobei/1888475 HTTP/1.1" 200 96415 "-" "Mozilla/4.0"
既然发现spider,固然要动用iptables来封杀这IP, 但不少时候仅仅封一个IP是不够的,由于通常爬虫都是运行在托管机房里面(多台服务器轮换)或者家里ADSL(从新拨号换IP),因此封整个C网段会直接有效得多,固然这样作有可能影响极小数正经常使用户访问,因此建议一段时间后从新解封这c网段。session
iptables -A INPUT -i eth0 -j DROP -p tcp --dport 80 -s 112.94.32.0/24
以上能够写成个shell/python脚本,天天执行一次。less
2. 实时反爬虫tcp
通过日志分析来识别恶意爬虫/攻击,没法即时屏蔽这些spider,对网站影响仍是在的。再说,假若有人采用分布式的spider(几百个代理服务器一块儿过 来爬),网站颇有可能没法访问,分析日志也不能及时解决问题。必须采起实时反爬虫策略,实时识别和封锁恶意爬虫的访问。分布式
实现思路:用redis来记录每一个IP的访问频度,在单位时间以内,若是访问频率超过一个阀值,就认为这个IP颇有可疑,而后就能够返回一个验证码页面,要求用户填写验证码。若是是爬虫的话,固然不可能填写验证码,若是该IP地址短期内继续不停的请求,则判断为爬虫,加入黑名单。
固然判断这IP是否可疑,单单从访问频率来判断是不够的,还须要增长如下策略:
分析referer。通常爬虫的referer 都是为空或者一个固定值。
分析访问时间间隔。通常爬虫爬取网页的频率都是比较固定的,不像人去访问网页,间隔时间比较无规则。
排除白名单IP地址段。
具体redis操做:
//score 为timestamp, value 为{referer}{request_url}{sessionId} redis> ZADD log:ip:112.94.32.135 61307510400000 "{referer}{request_url}{sessionId}" (integer) 1 //保留1个小时内log会比较合理。 redis> ZREMRANGEBYSCORE log:ip:112.94.32.135 -inf {timestamp} (integer) 1 redis> ZRANGE log:ip:112.94.32.135 0 -1
更多Redis 的应用场景,请看Redis 在电商中的实际应用场景
后记
有同窗说,还能够根据User-Agent来屏蔽spider,但我认为这没什么意义,如今的恶意spider都已经将User-Agent假装成普通浏览器或者正规爬虫的User-Agent了,我也再也不这里提了。
我认为,结合以上2种策略,能够很大程度打击那些恶意spider的攻击,保证网站正常运行。