【引言】其实前一节引入Lua操作Redis的应用意图是很明显的,也是为了本节做一个铺垫,有了Redis,我们可以很方便的记录很多信息,而且Redis的自动过期特性对我们做反爬监控也是如虎添翼,所以本章我们基于前面的积累来探讨一下反爬的策略,当然还很粗浅,只是实现了一些非常基础的反爬策略。
基本思路
首先,nginx自带了反爬的一些基础配置,虽然功能不是那么强大,但是起码可以防止一些低级爬虫的出现,所以在这里首先在nginx侧做了一份基本的配置(anti_spider.conf)。
其次,因为需要拦截爬虫,那就需要对所有的请求进行统计,所以在nginx配置时对外端口对所有请求进行拦截,走lua进行访问频率统计,若出现疑似爬虫,则在这一层进行拦截(anti_spider.lua)。在通过第一层拦截后,会进入第二个server,这个server的控制比较简单,也就是限制本端口只能通过localhost进行访问,避免外部主机通过IP+Port方式绕过第一层。
本次反爬试验的实现的思路其实还比较简单,拦截的方式也比较粗暴(按1分钟的访问数量进行拦截的),后面实际应用是肯定还需要进行一些优化的(比如:统计不同时间段的访问频度,统计访问的API类型是否有共性,等等),路漫漫其修远兮,这里小试牛刀,所有脚本也正常通过验证,再次记下一笔,后续如有优化升级再做记录补充。
鉴于本人在这块儿也是新手,属于边学边用的状态,如有什么使用或描述不当的地方,后续发现再做更正。
脚本概览
本次试验主要涉及以下4个脚本:
- nginx.conf:无需多言了,nginx的默认配置文件嘛
- anti_spider.conf:这个文件定义的就是nginx自带的一些基础反爬检测策略
- anti_spider.lua:这个就是第一层全量请求统计检测的脚本
- anti_spider_internal.lua:这个是针对内部跳转后的server的localhost控制
1 | C:\Users\Administrator\Desktop\反爬策略\实用版>tree /f |
anti_spider.conf
1 | ########################################################################## |
nginx.conf
1 | ########################################################################## |
anti_spider.lua
1 | ------------------------------------------------------------------------------------ |
anti_spider_internal.lua
1 | if ngx.var.host ~= "localhost" then |
成果验证
本次针对反爬策略的验证,使用的是tomcat自带的example来进行的,通过浏览器多次访问后触发拦截限制,会出现403的现象,实际证明拦截策略生效。
结语
此次试验仅简单的针对同一IP的高频度访问进行了拦截,效果是实现了,但是距离实际使用可能还有一段距离;因为实际业务场景中,爬虫远不会如此简单粗暴,所以后面还是要考虑从其他层面来进行拦截策略的补充;所以后面会有个大展拳脚的专题来对反爬进行升级优化,虽然理论上爬虫是无法完全被检测到的,但是在能力范围内能做的尽量还是要去做到。
下一步的反爬策略升级的方向(当然这里提到的策略还并不完善,还有待补充形成一套成熟的方案):
- 比如基于URL的类型进行重点拦截,往往最担心被爬虫获取的是检索列表页和详情页,所以可以考虑对这两种接口的拦截策略进行定制
- 比如基于访问路线的分析,这个可能比较困难,也就是说针对不是通过常规路径进入系统(比如没有列表访问请求直接访问详情页)的情况,进行专门的定制拦截