当前位置: 首页 > news >正文

Java Spring Boot中的爬虫防护机制

随着互联网的发展,爬虫技术也日益成熟和普及。然而,对于某些网站来说,爬虫可能会成为一个问题,导致资源浪费和安全隐患。本文将介绍如何使用Java Spring Boot框架来防止爬虫的入侵,并提供一些常用的防护机制。

引言:

在当今信息爆炸的时代,爬虫技术的应用越来越广泛。爬虫可以用于搜索引擎的抓取、数据分析、内容聚合等方面。然而,有些网站可能不希望被爬虫访问,因为爬虫可能会给网站带来访问压力、资源浪费和安全隐患。因此,对于一些网站来说,防止爬虫的入侵是至关重要的。

一、理解爬虫的原理和特点

在开始防止爬虫之前,我们首先要了解爬虫的工作原理和特点。爬虫通过发送HTTP请求获取网页内容,然后解析和提取所需数据。它们可以通过模拟浏览器行为,或是使用一些特定的技术来绕过一些常见的防护机制。
以下是对每个小点的完善:

二、使用User-Agent检测爬虫

在Spring Boot中,我们可以通过编写一个拦截器来实现User-Agent的检测。拦截器可以在请求到达控制器之前拦截并检查请求的User-Agent。在拦截器中,我们可以使用正则表达式或者自定义的逻辑来匹配和判断User-Agent是否属于爬虫。如果判断为爬虫,则可以返回一个错误页面或是直接拒绝访问。可以参考以下示例代码:

public class UserAgentInterceptor implements HandlerInterceptor {private static final List<String> SPIDER_USER_AGENTS = Arrays.asList("bot", "crawler", "spider");@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String userAgent = request.getHeader("User-Agent");if (userAgent != null && isSpiderUserAgent(userAgent)) {// 返回错误页面或拒绝访问response.sendRedirect("/error");return false;}return true;}private boolean isSpiderUserAgent(String userAgent) {for (String spiderAgent : SPIDER_USER_AGENTS) {if (userAgent.toLowerCase().contains(spiderAgent)) {return true;}}return false;}
}

三、使用验证码防止爬虫

在Spring Boot中,我们可以使用第三方的验证码库,例如Google的reCAPTCHA,来实现验证码的功能。reCAPTCHA将显示一个验证码图片或是一个人机验证的问题,只有用户成功通过验证后,才能继续访问网站。我们需要在网站的表单或登录页面中嵌入reCAPTCHA组件,并在后端进行验证。可以参考以下示例代码:

@RestController
public class CaptchaController {@PostMapping("/login")public String login(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam("g-recaptcha-response") String recaptchaResponse) {// 验证reCAPTCHA响应是否有效boolean isValid = verifyCaptcha(recaptchaResponse);if (isValid) {// 执行登录逻辑return "登录成功";} else {// 返回错误信息return "验证码验证失败";}}private boolean verifyCaptcha(String recaptchaResponse) {// 调用reCAPTCHA API验证响应是否有效// 验证成功返回true,验证失败返回falsereturn true;}
}

四、限制频率和并发访问

在Spring Boot中,我们可以使用基于令牌桶算法的限流器来限制每个IP地址的请求频率。令牌桶算法通过设置固定的容量来限制请求的频率,当请求到达时,如果令牌桶中有足够的令牌,则允许请求通过并消耗一个令牌;如果令牌桶中没有足够的令牌,则拒绝请求或进行相应的处理。可以参考以下示例代码:

@Configuration
public class RateLimitConfig {@Beanpublic KeyResolver ipKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());}@Beanpublic RedisRateLimiter redisRateLimiter() {return new RedisRateLimiter(10, 20); // 设置最大10个请求/秒,最大20个请求/分钟}@Beanpublic RedisRateLimiterArgumentResolver rateLimiterArgumentResolver() {return new RedisRateLimiterArgumentResolver();}
}

五、使用动态生成的内容

在Spring Boot中,我们可以使用模板引擎来生成动态内容,例如Thymeleaf或Freemarker。模板引擎将根据数据动态地渲染HTML页面,并在每次请求时生成不同的内容。这样,爬虫就无法直接解析静态的HTML页面,从而有效地防止爬虫的解析。可以参考以下示例代码:

<!-- 使用Thymeleaf生成动态内容 -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body><h1 th:text="${title}">Welcome</h1><p th:text="${message}">Hello, World!</p>
</body>
</html>
@RestController
public class DynamicContentController {@GetMapping("/")public ModelAndView home() {ModelAndView modelAndView = new ModelAndView("home");modelAndView.addObject("title", "Welcome");modelAndView.addObject("message", "Hello, World!");return modelAndView;}
}

六、使用反爬虫技术

除了前面提到的常用防护机制,还可以使用其他一些高级的反爬虫技术来增加爬虫的难度。例如,我们可以使用JavaScript或Web Socket来动态加载页面内容,或是使用Cookie和Session来验证用户的身份。这些技术可以在后端进行一些特定的处理,增加爬虫的难度,并提高网站的防护能力。具体的实现方式需要根据实际情况进行选择和调整。

七、案例

以下是3个案例,展示如何使用Spring Boot框架来实现防止爬虫的功能:

1. 使用User-Agent检测爬虫

假设我们的网站需要防止搜索引擎爬虫的访问。我们可以编写一个拦截器,在每个请求到达控制器之前检查请求的User-Agent。如果User-Agent是某个已知的搜索引擎爬虫的标识,我们可以返回一个错误页面或是直接拒绝访问。以下是示例代码:

public class UserAgentInterceptor implements HandlerInterceptor {private static final List<String> SEARCH_ENGINE_USER_AGENTS = Arrays.asList("Googlebot", "Bingbot", "Baiduspider", "YandexBot");@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String userAgent = request.getHeader("User-Agent");if (userAgent != null && isSearchEngineUserAgent(userAgent)) {// 返回错误页面或拒绝访问response.sendRedirect("/error");return false;}return true;}private boolean isSearchEngineUserAgent(String userAgent) {for (String searchEngineAgent : SEARCH_ENGINE_USER_AGENTS) {if (userAgent.contains(searchEngineAgent)) {return true;}}return false;}
}

2. 使用验证码防止爬虫

假设我们的网站有一个评论功能,为了防止机器人自动发表垃圾评论,我们可以在评论表单中嵌入reCAPTCHA验证码组件。只有用户在填写评论前通过了验证码验证,才能提交评论。以下是示例代码:

@RestController
public class CommentController {@PostMapping("/comment")public String postComment(@RequestParam("content") String content, @RequestParam("g-recaptcha-response") String recaptchaResponse) {// 验证reCAPTCHA响应是否有效boolean isValid = verifyCaptcha(recaptchaResponse);if (isValid) {// 保存评论到数据库return "评论已提交";} else {// 返回错误信息return "验证码验证失败";}}private boolean verifyCaptcha(String recaptchaResponse) {// 调用reCAPTCHA API验证响应是否有效// 验证成功返回true,验证失败返回falsereturn true;}
}

3. 限制频率和并发访问

假设我们的网站有一个接口,需要限制每个IP地址的访问频率。我们可以使用Spring Boot提供的@EnableRedisRateLimiter注解和RedisRateLimiter类,结合Redis来实现基于令牌桶算法的限流。以下是示例代码:

@RestController
public class ApiController {@GetMapping("/api/data")@EnableRedisRateLimiter(keyResolver = "ipKeyResolver")public String getData() {// 返回API数据return "API数据";}@Beanpublic KeyResolver ipKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());}
}

通过以上案例,我们可以看到Spring Boot提供了丰富的功能和工具来实现防止爬虫的需求。这些功能可以根据具体情况进行选择和组合,以实现更加灵活和强大的防护措施。

结论:

本文介绍了如何在Java Spring Boot框架中防止爬虫的入侵。我们可以使用User-Agent检测、验证码、限制频率和并发访问、动态生成内容以及一些高级的反爬虫技术来保护网站的安全。然而,需要注意的是,没有一种绝对安全的防护措施,所以我们需要综合使用多个防护机制来提高网站的安全性。通过合理的设计和实施,我们可以有效地防止爬虫的入侵,保护网站的正常运行。

相关文章:

Java Spring Boot中的爬虫防护机制

随着互联网的发展&#xff0c;爬虫技术也日益成熟和普及。然而&#xff0c;对于某些网站来说&#xff0c;爬虫可能会成为一个问题&#xff0c;导致资源浪费和安全隐患。本文将介绍如何使用Java Spring Boot框架来防止爬虫的入侵&#xff0c;并提供一些常用的防护机制。 引言&a…...

状态模式 行为型模式之六

1.定义 允许一个对象在其对象内部状态改变时改变它的行为。 2.组成结构 Context&#xff1a;定义客户感兴趣的接口&#xff1b;维护一个ConcreteState子类的实例&#xff0c;这个实例定义当前的状态。State&#xff1a;定义一个接口来封装Context的与特定状态相关的行为。Co…...

JAVA NIO深入剖析

4.1 Java NIO 基本介绍 Java NIO(New IO)也有人称之为 java non-blocking IO是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方…...

企业电子招投标系统源码之电子招投标系统建设的重点和未来趋势

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…...

基于正点原子alpha开发板的第三篇系统移植

系统移植的三大步骤如下&#xff1a; 系统uboot移植系统linux移植系统rootfs制作 一言难尽&#xff0c;踩了不少坑&#xff0c;当时只是想学习驱动开发&#xff0c;发现必须要将第三篇系统移植弄好才可以学习后面驱动&#xff0c;现将移植好的文件分享出来&#xff1a; 仓库&…...

数据结构与算法设计分析——贪心算法的应用

目录 一、贪心算法的定义二、贪心算法的基本步骤三、贪心算法的性质&#xff08;一&#xff09;最优子结构性质&#xff08;二&#xff09;贪心选择性质 四、贪心算法的应用&#xff08;一&#xff09;哈夫曼树——哈夫曼编码&#xff08;二&#xff09;图的应用——求最小生成…...

Leetcode 2895. Minimum Processing Time

Leetcode 2895. Minimum Processing Time 1. 解题思路2. 代码实现 题目链接&#xff1a;2895. Minimum Processing Time 1. 解题思路 这一题整体上来说其实没啥难度&#xff0c;就是一个greedy算法&#xff0c;只需要想明白耗时长的任务一定要优先执行&#xff0c;不存在某个…...

学信息系统项目管理师第4版系列21_范围管理

1. 产品范围 1.1. 某项产品、服务或成果所具有的特征和功能 1.2. 产品范围的完成情况是根据产品需求来衡量的 1.3. “需求”是指根据特定协议或其他强制性规范&#xff0c;产品、服务或成果必须具备的条件或能力 2. 项目范围 2.1. 包括产品范围&#xff0c;是为交付具有规…...

threejs 透明贴图,模型透明,白边

问题 使用Threejs加载模型时&#xff0c;模型出现了上面的问题。模型边缘部分白边&#xff0c;或者模型出现透明问题。 原因 出现这种问题是模型制作时使用了透明贴图。threejs无法直接处理贴图。 解决 场景一 模型有多个贴图时&#xff08;一个透贴和其他贴图&#xff0…...

CCF CSP认证 历年题目自练Day21

题目一 试题编号&#xff1a; 201909-1 试题名称&#xff1a; 小明种苹果 时间限制&#xff1a; 2.0s 内存限制&#xff1a; 512.0MB 题目分析&#xff08;个人理解&#xff09; 先看输入&#xff0c;第一行输入苹果的棵树n和每一次掉的苹果数m还是先如何存的问题&#xf…...

【Python_PySide2学习笔记(十六)】多行文本框QPlainTextEdit类的的基本用法

多行文本框QPlainTextEdit类的的基本用法 前言正文1、创建多行文本框2、多行文本框获取文本3、多行文本框获取选中文本4、多行文本框设置提示5、多行文本框设置文本6、多行文本框在末尾添加文本7、多行文本框在光标处插入文本8、多行文本框清空文本9、多行文本框拷贝文本到剪贴…...

linux上negix部署静态页面

1.看配置文件 进入cndf.d 这里的是配置部署项目中的文件 进入一个查看下 上面的是服务的域名&#xff0c;服务是http://test.fun-med.cn/#/&#xff0c;后面加服务名&#xff08;你的前端&#xff09; 2.看下页面位置 和上面的路径要匹配...

41.说说Promise自身的静态方法

41.说说Promise自身的静态方法 Promise.all &#xff08;有一个失败就失败&#xff0c;所有的都成功就成功&#xff09;Promise.race &#xff08;有一个成功就成功&#xff0c;有一个失败就失败&#xff09;Promise.allSettled &#xff08;所有的异步操作执行完毕之后&#…...

通讯网关软件019——利用CommGate X2OPCUA实现OPC UA访问Oracle服务器

本文介绍利用CommGate X2OPCUA实现OPC UA访问ORACLE数据库。CommGate X2OPCUA是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现上位机通过OPC UA来获取ORACLE数据库的数据。 【解决方案】…...

【机器学习】svm

参考 sklearn中SVC中的参数说明与常用函数_sklearn svc参数-CSDN博客https://blog.csdn.net/transformed/article/details/90437821 参考PYthon 教你怎么选择SVM的核函数kernel及案例分析_clfsvm.svc(kernel)-CSDN博客https://blog.csdn.net/c1z2w3456789/article/details/10…...

基于SSM+Vue的学习交流论坛的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

开发与运营:“开发”和“运营”角色有何不同和重叠?

开发和运营是促进软件系统交付的两种角色。大多数大规模构建软件的组织都会雇用这两个学科的人员。不过,开发和运维并不是完全孤立的。团队重叠并实现更高的吞吐量是很常见的。 在本文中,您将学习区分开发人员和操作人员之间的主要区别,以及它们重叠的方式。尽管有将两者结合…...

关于GD32引脚PA13、PA15、PB3、PB4配置为普通引脚的问题

关于GD32引脚PA13、PA15、PB3、PB4配置为普通引脚的问题 在实际开发中&#xff0c;经常会遇到引脚资源受限需要将一些具有特定功能的引脚配置为普通引脚或其他引脚功能使用的情况。 博主之前遇到过类似的情况&#xff0c;都正常解决了。但偶尔也会出现在配置引脚时少了一些配…...

JS-Dom转为图片,并放入pdf中进行下载

1、将dom转换为图片 这里我们使用html2canvas工具插件先将dom转为canvas元素然后canvas拥有一个方法可以将绘制出来的图形转为url然后下载即可注意&#xff1a;如果元素使用了渐变背景并透明的话&#xff0c;生成的图片可能会有点问题。我下面这个案例使用了渐变背景实现元素对…...

Python 无废话-办公自动化Excel格式美化

设置字体 在使用openpyxl 处理excel 设置格式&#xff0c;需要导入Font类&#xff0c;设置Font初始化参数&#xff0c;常见参数如下&#xff1a; 关键字参数 数据类型 描述 name 字符串 字体名称&#xff0c;如Calibri或Times New Roman size 整型 大小点数 bold …...

Python视频剪辑-Moviepy音频效果afx方法

随着多媒体内容在日常生活和工作中的广泛应用,音频处理成为了一个越来越重要的技能。无论是在游戏开发、音乐制作,还是在各种应用和网站中,高质量的音频处理都能极大地提升用户体验。然而音频处理看似复杂,实则不必如此。其实只需要掌握一些基础的概念和技巧,就能够完成大…...

让LLM模型输入token无限长

背景 增加LLM的输入token已经有很多的研究&#xff0c;但是思路无外乎&#xff1a;模型抽取局部特征通过上层通过模型融合预测最终解&#xff0c;以及这个思路的一些变种。然而这些思路其实都没能很彻底的解决无限长token问题&#xff0c;根据《EFFICIENT STREAMING LANGUAGE …...

RabbitMQ 介绍与 SpringBootAMQP使用

一、MQ概述 异步通信的优点&#xff1a; 耦合度低吞吐量提升故障隔离流量削峰 异步通信的缺点&#xff1a; 依赖于Broker的可靠性、安全性、吞吐能力架构复杂&#xff0c;业务么有明显的流程线&#xff0c;不方便追踪管理 什么是的MQ MQ&#xff08;Message Queue&#xf…...

企业门户的必备选择,WorkPlus的定制化解决方案

在当今数字化时代&#xff0c;企业门户成为了企业内外沟通与协作的重要基础设施。WorkPlus作为领先的品牌&#xff0c;为企业提供了一站式的企业门户解决方案&#xff0c;旨在提升企业形象、改善内外部沟通与协作效率。本文将深入探讨WorkPlus如何通过定制化的设计&#xff0c;…...

基于maven的项目搭建(已跑通)

1、直接选择archetype-webapp即可 &#xff08;这里很多人会觉得很慢–解决方案&#xff1a;https://blog.csdn.net/qq_45591895/article/details/133705674?spm1001.2014.3001.5501&#xff09; 2、手动添加一个java目录即可。 3、添加Tomcat 3、这就跑通了&#xff0c;可以…...

L1-035 情人节 c++解法

题目再现 以上是朋友圈中一奇葩贴&#xff1a;“2月14情人节了&#xff0c;我决定造福大家。第2个赞和第14个赞的&#xff0c;我介绍你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单&#xff0c;请你找出那两位要请客的倒霉蛋。 输入格式&#xff1a; 输入…...

DecimalFormat 多语言、本地化指定Locale

DecimalFormat再未指定Locale会使用默认的Locale&#xff0c;不同的Locale会导致格式化时出现出乎预期的现象。如Locale为西班牙时&#xff0c;小数点符号为",“千位分隔符为”."。 所以在多语言或者需要本地化的情况下&#xff0c;使用DecimalFormat最好指定Locale避…...

冲刺第十五届蓝桥杯P0003倍数问题

文章目录 原题连接解析代码 原题连接 倍数问题 解析 需要找出三个数字&#xff0c;三个数字之和是k的倍数&#xff0c;并且这个数字需要最大&#xff0c;很容易想到的就是将数组进行倒叙排序&#xff0c;然后三层for循环解决问题&#xff0c;但是这样会导致**时间复杂度很高…...

操作系统备考学习 day7 (2.3.4 ~ 2.3.5)

操作系统备考学习 day7 第二章 进程与线程2.3 同步与互斥2.3.4 信号量 用信号量实现进程互斥、同步、前驱关系信号量机制实现进程互斥信号量机制实现进程同步信号量机制实现前驱关系 2.3.5 经典同步问题生产者-消费者问题多生产者和多消费者模型抽烟者问题读者-写者问题哲学家进…...

HRM人力资源管理系统源码

HRM人力资源管理系统源码 运行环境&#xff1a;PHP8.1或以上 MYSQL5.7或以上 php扩展要求 fileinfo imagemagick 功能介绍&#xff1a; 综合仪表板 它通过其综合仪表板提供了员工总数、工单和帐户余额的概览。 您可以轻松访问组织中的缺席者以及详细的公告和预定会议列…...