反采集一直都是我们需要进行的工作,特殊是国内互联网行业抄袭风气太盛,其实我们不介意这些采集者把我们原创内容采过去,反正采集者也影响不了我们自己多少,但老是导致我们服务器资源过载就很烦了。
以前一般用“Apache中设置屏蔽IP地址和URL网址来禁止采集”,高级一些的用法记录在“识别User Agent屏蔽一些Web爬虫防采集”,中途还专门“自己编写网站防采集程序”,但用起来也有些不完善。
这两个月提交百度熊掌号、MIP/AMP后,正常的爬虫多起来,流量也多一些,跟着来的采集爬虫也多起来,导致服务器总是资源不足,带宽堵塞、服务器卡死、服务重启等等。
除了硬件上增加带宽、增加服务器以外,还得人工看着不断屏蔽,现在的采集者也变得“聪明”一些了,变着ip/user-agent/referer来,与我们斗智斗勇。
前一阵子找了好些资料,apache的几个模块有些作用,例如:mod_bw、mod_limitipconn、mod_evasive20、mod_qos等,比较了一下,mod_qos最接近我们需要,只是功能太强了一些,我们用不了那么多,配置起来有些复杂。
官方介绍:
我们添加的qos.conf代码:
# don't allow a client IP to access a "handler" (not a static resource like # a jpg, gif, ..) more than 20 times within two minutes: QS_ClientEventLimitCount 20 120 SlowRequest SetEnvIfPlus Request_URI / SlowRequest=1 SetEnvIfPlus Request_URI /generateReport.php SlowRequest=2 SetEnvIfPlus Request_URI .*\.(jpg)|(jpeg)|(gif)|(png)|(js)|(css)$ !SlowRequest SetEnvIfPlus Remote_Addr ^(47\.88\..*\..*|115\.28\..*\..*)$ !SlowRequest # disable any event counting if the server has less than 499 connections: QS_SetEnvIf QS_AllConn=^[1234]?[0-9]{1,2}$ !SlowRequest # Clients violating these rules may times can be blocked for an even longer period of time. This is implemented by a second counter, called SlowRepeatedlySlow in this example. # Alternatively, the QS_Block variable could be set to incremented the QS_ClientEventBlockCount counter in the case of a repeated rule violation (to block clients at a connection level extending the list of events defined above). # deny a client IP for 10 minutes if he violates the rule above 3 times: QS_ClientEventLimitCount 3 600 SlowRepeatedlySlow QS_SetEnvIf SlowRequest_Counter=20 SlowRepeatedlySlow=1 QS_ErrorResponseCode 403
刚开始这样设置后,重启apache报错,没有SetEnvIfPlus模块,找到mod_setenvifplus官方网站,又去下载mod_setenvifplus,解压后apxs -i -a -c mod_setenvifplus.c编译,再修改httpd.conf添加上mod_setenvifplus。
还有一点 QS_ClientEventLimitCount directives can't be added/removed by graceful restart. A server restart is required to apply the new configuration!,需要重启机器。
这样设置、重启后,可以从error.log中看到屏蔽的事情。
后续需要解决的事情:
添加白名单,放行我们自己的服务器以及搜索引擎IP;(已经解决,加一行:SetEnvIfPlus Remote_Addr ...)- 添加hostname白名单,放行DNS反向查询是google、百度等搜索引擎爬虫;
返回错误码现在是500(内部错误),应该改为403(拒绝);(已经解决,加一行:QS_ErrorResponseCode 403)
2018年12月14日补充:《常见搜索引擎爬虫IP地址段》,添加了Google、百度、MSN等几个搜索引擎蜘蛛的IP地址段:|66\.249\..*|203\.208\.60\..*|216\.239\..*|66\.102\..*|64\.233\..*|72\.14\..*|123\.125\..*|220\.181\.108\..*|220\.181\.124\..*|220\.181\.125\..*|111\.206\..*|207\.46\.13\..*|157\.55\.39\..*|40\.77\.167\..*
评论1
<p> 下面是一个简单的php程序
下面是一个简单的php程序,用于验证qos是否生效:
运行很多次循环,每次访问指定网址的中间不加延时,可以看到当运行到超过qos限制的时候,打印出来503被拒绝的信息,证实qos的设置生效了,如果调整qos中指定的限制次数(然后重启apache),这里打印错误信息的次数也跟着变了,如果把IP加入qos的白名单(然后重启apache),这个程序的循环中就不会打印报错信息。