在做GIS开发时,经常遇到的一个风险,就是别会爬虫你的数据,栅格瓦片数据、空间属性数据等。数据被爬取,对服务器会造成很大的 压力,数据的价值也无形地损失了。对一些从事GIS的小型公司来说,基本没有任何网络防护的能力。数据被爬虫了,可能都不知道。很多服务器死机了也只知道重启。对一个小公司去话费大量的精力,做反爬虫也是很不安全的。
最近在网上 遇到一个开源的反爬虫组件kk-anti-reptile,spring-boot1.x, spring-boot2.x 均可使用。使用起来很方便,只需要引入依赖,配置反爬虫选项和redission连接就可以了。极小的工作量,可以完成一些基本的反爬虫防护。
依赖项- kk-anti-reptile依赖,目前只有一个版本。
cn.keking.project kk-anti-reptile 1.0.0-RELEASE
- Redisson相关依赖项
注意redisson-spring-data-27对应springboot2.7,版本对应关系可以参考https://github.com/redisson/redisson/tree/master/redisson-spring-data
yml中相关配置org.springframework.boot spring-boot-starter-data-redis org.redisson redisson-spring-boot-starter 3.17.5 org.redisson redisson-spring-data-27 3.17.5
- 反爬虫配置,可以参考官网的配置一览表配置
anti: reptile: manager: enabled: true ip-rule: enabled: true request-max-size: 10 expiration-time: 20000000 ua-rule: enabled: true allowed-mobile: true allowed-pc: true
- Redisson配置
因为组件kk-anti-reptile的运行依赖于Redisson。没有配置过的,可以参考我的配置。
application.yml
spring: redis: host: 172.16.0.183 port: 6379 database: 12 password: 123456 timeout: 10000 pool: # 连接池最大连接数(使用负值表示没有限制) max-active: 2000 # 连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1 # 连接池中的最大空闲连接 max-idle: 500 # 连接池中的最小空闲连接 min-idle: 0 redisson: file: classpath:redisson.yml
创建redisson.yml ,在application.yml文件的同级目录下
# redisson.yml --- 存放于application.yml同级目录 singleServerConfig: # 连接空闲超时,单位:毫秒 idleConnectionTimeout: 100000 # 连接超时,单位:毫秒 connectTimeout: 10000 # 命令等待超时,单位:毫秒 timeout: 3000 # 命令失败重试次数 retryAttempts: 3 # 命令重试发送时间间隔,单位:毫秒 retryInterval: 1500 # 密码 password: 123456 # 单个连接最大订阅数量 subscriptionsPerConnection: 5 # 客户端名称 clientName: null # 节点地址 address: redis://172.16.0.183:6379 # 发布和订阅连接的最小空闲连接数 subscriptionConnectionMinimumIdleSize: 1 # 发布和订阅连接池大小 subscriptionConnectionPoolSize: 50 # 最小空闲连接数 connectionMinimumIdleSize: 32 # 连接池大小 connectionPoolSize: 64 # redis数据库编号 database: 12 # DNS监测时间间隔,单位:毫秒 dnsMonitoringInterval: 5000 # 线程池数量 threads: 0 # Netty线程池数量 nettyThreads: 0 # 编码 codec: class: "org.redisson.codec.JsonJacksonCodec" # 传输模式 transportMode: "NIO" # 配置看门狗的默认超时时间为30s,这里改为10s lockWatchdogTimeout: 10000测试接口
开发一个测试的接口
package com.example.text.demo.controller; import cn.keking.anti_reptile.annotation.AntiReptile; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RequestMapping("/") @RestController public class ComController { @AntiReptile @GetMapping("/test") String getAreaMsgByWkt() { return "13333666666"; } }
注意,如果你需要对某个接口防护,需要在接口上增加@AntiReptile注解,也可以在yml文件中配置include-urls拦截
效果测试-
正常访问时
-
开启限流时
-
禁止PC访问时
如果自己配置有困难的,可以参考我的源码示例