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中的爬虫防护机制
随着互联网的发展,爬虫技术也日益成熟和普及。然而,对于某些网站来说,爬虫可能会成为一个问题,导致资源浪费和安全隐患。本文将介绍如何使用Java Spring Boot框架来防止爬虫的入侵,并提供一些常用的防护机制。 引言&a…...
状态模式 行为型模式之六
1.定义 允许一个对象在其对象内部状态改变时改变它的行为。 2.组成结构 Context:定义客户感兴趣的接口;维护一个ConcreteState子类的实例,这个实例定义当前的状态。State:定义一个接口来封装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、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看所…...
基于正点原子alpha开发板的第三篇系统移植
系统移植的三大步骤如下: 系统uboot移植系统linux移植系统rootfs制作 一言难尽,踩了不少坑,当时只是想学习驱动开发,发现必须要将第三篇系统移植弄好才可以学习后面驱动,现将移植好的文件分享出来: 仓库&…...
数据结构与算法设计分析——贪心算法的应用
目录 一、贪心算法的定义二、贪心算法的基本步骤三、贪心算法的性质(一)最优子结构性质(二)贪心选择性质 四、贪心算法的应用(一)哈夫曼树——哈夫曼编码(二)图的应用——求最小生成…...
Leetcode 2895. Minimum Processing Time
Leetcode 2895. Minimum Processing Time 1. 解题思路2. 代码实现 题目链接:2895. Minimum Processing Time 1. 解题思路 这一题整体上来说其实没啥难度,就是一个greedy算法,只需要想明白耗时长的任务一定要优先执行,不存在某个…...
学信息系统项目管理师第4版系列21_范围管理
1. 产品范围 1.1. 某项产品、服务或成果所具有的特征和功能 1.2. 产品范围的完成情况是根据产品需求来衡量的 1.3. “需求”是指根据特定协议或其他强制性规范,产品、服务或成果必须具备的条件或能力 2. 项目范围 2.1. 包括产品范围,是为交付具有规…...
threejs 透明贴图,模型透明,白边
问题 使用Threejs加载模型时,模型出现了上面的问题。模型边缘部分白边,或者模型出现透明问题。 原因 出现这种问题是模型制作时使用了透明贴图。threejs无法直接处理贴图。 解决 场景一 模型有多个贴图时(一个透贴和其他贴图࿰…...
CCF CSP认证 历年题目自练Day21
题目一 试题编号: 201909-1 试题名称: 小明种苹果 时间限制: 2.0s 内存限制: 512.0MB 题目分析(个人理解) 先看输入,第一行输入苹果的棵树n和每一次掉的苹果数m还是先如何存的问题…...
【Python_PySide2学习笔记(十六)】多行文本框QPlainTextEdit类的的基本用法
多行文本框QPlainTextEdit类的的基本用法 前言正文1、创建多行文本框2、多行文本框获取文本3、多行文本框获取选中文本4、多行文本框设置提示5、多行文本框设置文本6、多行文本框在末尾添加文本7、多行文本框在光标处插入文本8、多行文本框清空文本9、多行文本框拷贝文本到剪贴…...
linux上negix部署静态页面
1.看配置文件 进入cndf.d 这里的是配置部署项目中的文件 进入一个查看下 上面的是服务的域名,服务是http://test.fun-med.cn/#/,后面加服务名(你的前端) 2.看下页面位置 和上面的路径要匹配...
41.说说Promise自身的静态方法
41.说说Promise自身的静态方法 Promise.all (有一个失败就失败,所有的都成功就成功)Promise.race (有一个成功就成功,有一个失败就失败)Promise.allSettled (所有的异步操作执行完毕之后&#…...
通讯网关软件019——利用CommGate X2OPCUA实现OPC UA访问Oracle服务器
本文介绍利用CommGate X2OPCUA实现OPC UA访问ORACLE数据库。CommGate X2OPCUA是宁波科安网信开发的网关软件,软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示,实现上位机通过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的学习交流论坛的设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
开发与运营:“开发”和“运营”角色有何不同和重叠?
开发和运营是促进软件系统交付的两种角色。大多数大规模构建软件的组织都会雇用这两个学科的人员。不过,开发和运维并不是完全孤立的。团队重叠并实现更高的吞吐量是很常见的。 在本文中,您将学习区分开发人员和操作人员之间的主要区别,以及它们重叠的方式。尽管有将两者结合…...
关于GD32引脚PA13、PA15、PB3、PB4配置为普通引脚的问题
关于GD32引脚PA13、PA15、PB3、PB4配置为普通引脚的问题 在实际开发中,经常会遇到引脚资源受限需要将一些具有特定功能的引脚配置为普通引脚或其他引脚功能使用的情况。 博主之前遇到过类似的情况,都正常解决了。但偶尔也会出现在配置引脚时少了一些配…...
JS-Dom转为图片,并放入pdf中进行下载
1、将dom转换为图片 这里我们使用html2canvas工具插件先将dom转为canvas元素然后canvas拥有一个方法可以将绘制出来的图形转为url然后下载即可注意:如果元素使用了渐变背景并透明的话,生成的图片可能会有点问题。我下面这个案例使用了渐变背景实现元素对…...
Python 无废话-办公自动化Excel格式美化
设置字体 在使用openpyxl 处理excel 设置格式,需要导入Font类,设置Font初始化参数,常见参数如下: 关键字参数 数据类型 描述 name 字符串 字体名称,如Calibri或Times New Roman size 整型 大小点数 bold …...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
