« 上一篇下一篇 »

网络爬虫对服务器的危害,nginx服务器屏蔽网络爬虫程序采集器的办法

   网络上有非常多的令人厌恶的幽灵程序爬虫,没日没夜地采集别人的网站,将别人劳动成果据为己有。想到要对于这些不受待见的爬虫,相信很多站长气得牙痒痒的,但又无计可施。

网络爬虫的坏处:

采集器频繁地抓取影响了网站的正常运行了,尤其是对于低配服务器,那点可怜的虚拟空间的流量可能没多久就被搞完了。那种经常打不开或者打开很慢的网站,除了服务器配置本身差劲外,很多时候要归功于网络采集器。

  每个网站通常都会遇到很多非搜索引擎的爬虫,这些爬虫大部分都是用于内容采集或是初学者所写,它们和搜索引擎的爬虫不一样,没有频率控制,往往会消耗大量服务器资源,导致带宽白白浪费了。下面介绍下怎么通过nginx来屏蔽网络爬虫的方法。

   经常看到网上有seo或站长朋友提到用robots.txt文件的 User-Agent配合Disallow指令来实现屏蔽。指点别人在网站根目录创建robots.txt文件了,写了一堆的指令,去禁止那些不受欢迎的爬虫。满心欢喜地以为就做到屏蔽效果了,达到目的了。其实不然,首先要明白一点,robots.txt只是网络机器人(或者蜘蛛)的一种抓取的条约,注意,仅仅是条约,定义了哪些能抓? 哪些内容不能抓? 欢迎哪些爬虫抓取?不欢迎哪些爬虫抓取? 

 

  这样的条约,其实是没有约束力的,爬虫是否遵守这些条约是另一回事,对于爬虫中的正人君子(正规搜索引擎)确实有效,它们来到网站后,通常会查看一下robots.txt文件,老实地按照站长的规则来抓取网页,然而,对那些采集爬虫有效吗?很确定地说:无效,它们完全无视robots.txt,它们只要网站的内容,更有甚者,看到那些明令指定不能抓取的网页更是加大力度来采集,既然不准抓取,说不定有什么好东西呢?

 

所以说,robots.txt不是万能钥匙,能防君子,不能防小人。但也不是没有办法,作为web服务器的龙头:Apache和nginx其实都有屏蔽策略,关键是要会用。下面说一种我之前的单位使用的一种禁止策略,该策略能屏蔽一部分程序的采集。现将代码放在下面,操作方法:找到 nginx.conf配置文件,将下面的代码放到server里。

 

1
2
3
4
#禁止爬虫工具和不相关搜索引擎的抓取
if ($http_user_agent ~* (Scrapy|Curl|HttpClient|python|phantomjs|EtaoSpider|HuihuiSpider|WochachaSpider|GwdangSpider|YYSpider|MJ12bot|^$)) {
    return 403;
}

 

最终成这样:

1
2
3
4
5
6
7
8
9
10
server
    {
    #禁止爬虫工具和不相关搜索引擎的抓取
    if ($http_user_agent ~* (Scrapy|Curl|HttpClient|python|phantomjs|EtaoSpider|HuihuiSpider|WochachaSpider|GwdangSpider|YYSpider|MJ12bot|^$)) {
    return 403;
    
    }
  # 下面是其他的配置项
   
 }

 

保存配置文件,使用命令行:   

1
systemctl restart nginx

重启nginx服务生效。

 

其他方法:

1.基于程序本身去防止爬取:作为爬虫程序,爬取行为是对页面的源文件爬取,如爬取静态页面的html代码,可以用jquery去模仿写html,这种方法伪装的页面就很难被爬取了,不过这种方法对程序员的要求很高。


2.基于iptables和shell脚本:可以对nginx的access.log进行策略定义,例如定义在1分钟内并发连接数超过30个ip为非法,如ip不在白名单内,则加入iptables策略封掉,当然这种的缺点是会有“误伤”,策略细粒度越小就会有更多的“误伤”,细粒度大就会使效果变差,另外还有类似的第三方工具fail2ban,利用做filter和actor对一些有危害的操作记录或是封ip。但是对于某个特定的爬虫地址(例如网易、有道)的爬取行为拒绝也很难准确做到,因为你无法准确知道这些特定的爬虫ip地址(例如网易、有道),以下是我的定位方式,不过发现由于ip库不准确造成错误的屏蔽。注意:建议不要用封ip条目的方式,iptables列表长度是65535时就会封满,服务器也就会死机。

 

本文抛砖引玉,仅可以对付一般的网络采集程序,我们跟网络爬虫的斗争才刚刚开始,更多请关注数据吧资讯