V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
chenjh
V2EX  ›  分享创造

分享一个简单易用的 Spring Boot 项目适用的开源反爬虫接口防刷组件

  •  2
     
  •   chenjh · 2020-01-07 16:09:20 +08:00 · 3121 次点击
    这是一个创建于 1542 天前的主题,其中的信息可能已经有所发展或是发生改变。

    概述

    kk-anti-reptile 是适用于基于 spring-boot 开发的分布式系统的开源反爬虫接口防刷组件。

    开源地址

    https://gitee.com/kekingcn/kk-anti-reptile
    https://github.com/kekingcn/kk-anti-reptile

    系统要求

    • 基于 spring-boot 开发(spring-boot1.x, spring-boot2.x 均可)
    • 需要使用 redis

    工作流程

    kk-anti-reptile 使用基于 Servlet 规范的的 Filter 对请求进行过滤,在其内部通过 spring-boot 的扩展点机制,实例化一个 Filter,并注入到 Spring 容器 FilterRegistrationBean 中,通过 Spring 注入到 Servlet 容器中,从而实现对请求的过滤

    在 kk-anti-reptile 的过滤 Filter 内部,又通过责任链模式,将各种不同的过滤规则织入,并提供抽象接口,可由调用方进行规则扩展

    Filter 调用则链进行请求过滤,如过滤不通过,则拦截请求,返回状态码509,并输出验证码输入页面,输出验证码正确后,调用过滤规则链对规则进行重置

    目前规则链中有如下两个规则

    ip-rule

    ip-rule 通过时间窗口统计当前时间窗口内请求数,小于规定的最大请求数则可通过,否则不通过。时间窗口、最大请求数、ip 白名单等均可配置

    ua-rule

    ua-rule 通过判断请求携带的 User-Agent,得到操作系统、设备信息、浏览器信息等,可配置各种维度对请求进行过滤

    验证码页面

    命中爬虫和防盗刷规则后,会阻断请求,并生成接除阻断的验证码,验证码有多种组合方式,如果客户端可以正确输入验证码,则可以继续访问

    验证码有中文、英文字母+数字、简单算术三种形式,每种形式又有静态图片和 GIF 动图两种图片格式,即目前共有如下六种,所有类型的验证码会随机出现,目前技术手段识别难度极高,可有效阻止防止爬虫大规模爬取数据

    接入使用

    后端接入非常简单,只需要引用 kk-anti-reptile 的 maven 依赖,并配置启用 kk-anti-reptile 即可
    加入 maven 依赖

    <dependency>
        <groupId>cn.keking.project</groupId>
        <artifactId>kk-anti-reptile</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </dependency>
    

    配置启用 kk-anti-reptile

    anti.reptile.manager.enabled=true
    

    前端需要在统一发送请求的 ajax 处加入拦截,拦截到请求返回状态码509后弹出一个新页面,并把响应内容转出到页面中,然后向页面中传入后端接口baseUrl参数即可,以使用 axios 请求为例:

    import axios from 'axios';
    import {baseUrl} from './config';
    
    axios.interceptors.response.use(
      data => {
        return data;
      },
      error => {
        if (error.response.status === 509) {
          let html = error.response.data;
          let verifyWindow = window.open("","_blank","height=400,width=560");
          verifyWindow.document.write(html);
          verifyWindow.document.getElementById("baseUrl").value = baseUrl;
        }
      }
    );
    
    export default axios;
    

    注意

    1. apollo-client 需启用 bootstrap

    使用 apollo 配置中心的用户,由于组件内部用到@ConditionalOnProperty,要在 application.properties/bootstrap.properties 中加入如下样例配置,(apollo-client 需要 0.10.0 及以上版本)详见apollo bootstrap 说明

    apollo.bootstrap.enabled = true
    
    1. 需要有 Redisson 连接

    如果项目中有用到 Redisson,kk-anti-reptile 会自动获取 RedissonClient 实例对象; 如果没用到,需要在配置文件加入如下 Redisson 连接相关配置

    spring.redisson.address=redis://192.168.1.204:6379
    spring.redisson.password=xxx
    

    配置一览表

    在 spring-boot 中,所有配置在配置文件都会有自动提示和说明,如下图
    配置自动提示及说明
    所有配置都以anti.reptile.manager为前缀,如下为所有配置项及说明

    NAME 描述 默认值 示例
    enabled 是否启用反爬虫插件 true true
    include-urls 需要反爬的接口列表,以'/'开头,以','分隔 /client,/user
    ip-rule.enabled 是否启用 IP Rule true true
    ip-rule.expiration-time 时间窗口长度(ms) 5000 5000
    ip-rule.request-max-size 单个时间窗口内,最大请求数 20 20
    ip-rule.ignore-ip IP 白名单,支持后缀'*'通配,以','分隔 192.168.*,127.0.0.1
    ua-rule.enabled 是否启用 User-Agent Rule true true
    ua-rule.allowed-linux 是否允许 Linux 系统访问 false false
    ua-rule.allowed-mobile 是否允许移动端设备访问 true true
    ua-rule.allowed-pc 是否允许移 PC 设备访问 true true
    ua-rule.allowed-iot 是否允许物联网设备访问 false false
    ua-rule.allowed-proxy 是否允许代理访问 false false

    联系我们

    使用过程中有任何问题,都可以加入官方 QQ 群:613025121 咨询讨论 官方 QQ 群

    9 条回复    2020-01-13 15:52:09 +08:00
    chenjh
        1
    chenjh  
    OP
       2020-01-07 16:18:04 +08:00
    使用非常简单哦,引用 pom 依赖,配置开启即可
    ZredoC
        2
    ZredoC  
       2020-01-07 16:27:18 +08:00
    整挺好,先支持!
    chenjh
        3
    chenjh  
    OP
       2020-01-07 16:28:51 +08:00
    @ZredoC 谢谢
    gz911122
        4
    gz911122  
       2020-01-07 16:49:36 +08:00   ❤️ 1
    webflux 可以用吗?
    chenjh
        5
    chenjh  
    OP
       2020-01-07 16:57:05 +08:00
    @gz911122 webflux 需要自己改一下 Filter
    raycloud
        6
    raycloud  
       2020-01-07 17:02:04 +08:00
    感谢分享~
    chenjh
        7
    chenjh  
    OP
       2020-01-11 09:43:21 +08:00
    @raycloud 欢迎试用,哈哈
    wm5d8b
        8
    wm5d8b  
       2020-01-11 22:04:53 +08:00 via Android
    redisson 多个版本内存泄漏的问题怎么解决
    chenjh
        9
    chenjh  
    OP
       2020-01-13 15:52:09 +08:00
    @wm5d8b 如果你的项目也有 redisson 依赖的话,直接排除掉这个项目的 redisson 依赖即可
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   986 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:28 · PVG 04:28 · LAX 13:28 · JFK 16:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.