上次服务器突然瘫痪了,我花了一整夜的时间查看日志,分析apache的访问日志,发现同一个时间段(大概下午3点左右)有好几个爬虫的访问痕迹 (百度、google、搜狗、雅虎、搜搜、还有一个不知名的爬虫),他们一起来光临服务器(因为服务器上面当时放在大概十多个独立网站,导致爬虫们同时光 临)导致服务器在那一时段流量大增,机房打电话来说流量异常,我当时正在银行办支票的入账。赶紧火急火燎的跑回办公室,直接ping服务器,发现time out,ssh连接不上,赶紧打电话给机房让他们帮忙重启服务器,事情才算基本结束。我开始以为应该是黑客攻击,因为我的server自从上线大概半年多 来,已经经历了2次黑客攻击,但是基本上就是web shell或者ftp丢失等引起的,这次事件刚刚开始的时候我还是以为是黑客攻击引起的,没曾想罪魁祸首是这些爬虫们。问题找出来了,得想想办法解决啊, 怎么办呢?服务器不可能禁止所有的爬虫访问,但是任由爬虫这么个爬法,严重影响了服务的资源利用,会导致网站访问速度缓慢,甚至无法访问。看来我还得花点 时间来解决下这个棘手的问题。
按理说,禁止某个爬虫访问很简单,直接用robots就ok了,比如我要屏蔽百度爬虫
可以直接在robots.txt中加入如下代码:
- #所有爬虫
- User-agent: *
- Disallow:/
-
- # 屏蔽google爬虫访问后台管理
- User-agent: Googlebot
- Disallow:/admin
-
- # 屏蔽Sosospider访问后台管理
- User-agent: Sosospider
- Disallow:/admin
-
- #屏蔽百度爬虫访问后台管理
- User-agent: Baiduspider
- Disallow: /admin
但 实际上,这种方法在某些情况下,对某些爬虫而言,并不能完全屏蔽百度的爬虫(特别是个别采集器,采集我的博客文章 (http://www.kokkowon.com)),要不要爬取网站,基本上由爬虫说了算,百度要抓取,这个方法是拦不住的,因为据我所知,很多爬虫 根本就不遵守robots协议(唉,this is in china,没有办法)。因此要向完全屏蔽百度的爬虫,需要其他的手段了。记得以前在某网站使用服务器方防止图片盗链的思路,比如禁止网站/data和 public目录下所有图片被盗链,可以通过在.htaccess文件中加入代码:
- RewriteEngine on
- RewriteBase /
- RewriteCond %{REQUEST_URI} ^/(data|public)
-
- ##add by lin at 2009-11-02 禁止flv的访问
- RewriteCond %{REQUEST_FILENAME} .flv$[NC]
-
- #允许空“HTTP_REFERER”的访问,即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示
- RewriteCond %{HTTP_REFERER} !^$ [NC]
-
- #设置允许访问的HTTP来源
- RewriteCond %{HTTP_REFERER} !xxx.com [NC]
-
- #定义被盗链时替代的图片,让所有盗链 jpg、gif、png 等文件的网页,显示根目录下的 no.png 文件
- RewriteRule .*\.(gif|jpg|png)$ http://www.xxx.com/no.png [R,NC,L]
-
- #将不满足上述条件的全部重定向到no.png,add by lin at 2009-11-02
- RewriteRule (.*) http://www.xxx.com/no.png [R,NC,L]
上面那段代码可以禁止图片和相关资源的盗链,改改应该也是可以禁止爬虫的访问的。于是修改.htaccess文件添加
- RewriteEngine on
- RewriteCond %{HTTP_USER_AGENT} ^Baiduspider [NC]
- RewriteRule .* - [F]
用 PHP模拟访问网站,发现确实有效果。但是我们有十几个网站,我不可能每个网站挨个去给他们修改.htaccess,有的网站已经有.htaccess文 件,如果贸然修改,可能会导致原来网站访问不正常,怎么办呢?我们能不能修改apache的配置文件,做一个全局的设置,把不应来的爬虫拒之门外?修改配 置文件:
- SetEnvIfNoCase User-Agent "^(Baiduspider|Sosospider)" not_allowed_spider
-
- #仅对指定的HTTP方法进行访问控制
- Order Allow,Deny
- Allow from all
- Deny from env=not_allowed_spider
用 PHP模拟访问网站,果然可行,搞定,终于可以禁止爬虫瞎爬了,明天可以睡个安稳觉了。另外还有很多防止爬虫的策略和方法,可以参考robbin的一篇文 章,里面讲述了爬虫的识别和防护等相关技巧(http://robbin.iteye.com/blog/451014 )