爬虫的精准识别:基于User-Agent的正则表达式实现(建议收藏)
引言
在当今实时交互场景中,WebSocket 技术已成为在线客服、即时通讯、实时数据推送等服务的核心支柱。然而,一个看似简单的技术细节却可能让企业付出高昂的代价:当爬虫机器人伪装成“用户”接入 WebSocket 时,客服系统可能误将其识别为真实客户,导致客服资源被无意义消耗,甚至因“无响应对话”而影响用户体验。
场景痛点:当技术便利遭遇“无效流量”
想象一个典型的在线客服场景:用户访问网站后,通过 WebSocket 与客服实时沟通。然而,大量爬虫(如搜索引擎索引、SEO 工具、恶意扫描程序)的请求也会触发 WebSocket 连接。这些爬虫不会主动发送消息,却会长期占用连接资源。客服人员看到“在线用户”列表中的爬虫会话,尝试对话却得不到任何回应,最终导致:
- 资源浪费:服务器带宽、连接数被无效占用。
- 效率下降:客服需要手动排查“沉默用户”,增加工作负担。
- 数据污染:统计报表中的“用户活跃数”被虚假流量污染。
更糟糕的是,部分攻击者会利用 WebSocket 的长连接特性,发起高频请求或注入攻击,进一步威胁系统安全。
传统方案的局限性
许多开发者试图通过简单的 IP 封禁 或 请求频率限制 解决问题,但爬虫的 IP 池和访问策略日益动态化,传统方案往往力不从心。而直接依赖 User-Agent 字符串过滤 看似直接,却常因正则表达式设计不当(如漏判新爬虫、误伤正常用户)导致效果大打折扣。
本文目标
本文将聚焦 “如何在 WebSocket 握手阶段精准识别爬虫”,通过以下实践方案实现高效拦截:
- 多维度 User-Agent 检测:基于正则表达式覆盖 95% 的已知爬虫标识,确保关键词精准匹配。
- 轻量化浏览器端拦截:提供 JavaScript 正则方案,避免爬虫触发前端资源加载。
- 服务端兜底逻辑:结合 IP 黑名单与行为分析,应对伪造 User-Agent 的高级爬虫。
文章将深入解析正则表达式设计技巧、跨语言(Java/JavaScript)实现方案,并探讨如何在开源数据集(如 crawler-user-agents)基础上动态更新策略。无论您是构建客服系统的开发者,还是需优化实时服务性能的架构师,均可通过本文获得可直接复用的代码与实践经验。
以下是基于常见爬虫和机器人的 User-Agent 关键词整理的正则表达式实现方案:
1. 常见爬虫 User-Agent 关键词
以下关键词覆盖了主流搜索引擎、SEO 工具、社交媒体、监控服务等类型的爬虫机器人:
| 关键词(不区分大小写) | 示例爬虫名称 |
|---|---|
bot |
Googlebot, Bingbot |
spider |
YandexSpider, Baiduspider |
crawler |
AhrefsBot, SemrushBot |
slurp |
Yahoo! Slurp |
facebookexternalhit |
Facebook 链接预览机器人 |
duckduckbot |
DuckDuckGo 爬虫 |
facebot |
Facebook 爬虫 |
alexa |
Amazon 的 Alexa 爬虫 |
applebot |
Apple 的搜索引擎爬虫 |
pinterest |
Pinterest 爬虫 |
twitterbot |
Twitter 爬虫 |
linkedinbot |
LinkedIn 爬虫 |
telegrambot |
Telegram 爬虫 |
uptimerobot |
UptimeRobot 监控服务 |
exabot |
Exalead 搜索引擎 |
msnbot |
MSN 搜索引擎爬虫 |
yahoo |
Yahoo 爬虫 |
2. 正则表达式实现
以下正则表达式会匹配包含上述关键词的 User-Agent(不区分大小写):
String pattern ="(?i).*\\b(bot|spider|crawler|slurp|facebookexternalhit|duckduckbot|facebot|alexa|applebot|pinterest|twitterbot|linkedinbot|telegrambot|uptimerobot|exabot|msnbot|yahoo|googlebot|bingbot|yandexbot|baiduspider|ahrefsbot|semrushbot)\\b.*";
3. 正则关键表达式说明
3.1 (?i):忽略大小写的标记
- 作用:表示后续的正则匹配不区分大小写。
- 原理:
(?i)是正则表达式的 模式修饰符(Pattern Modifier),它会从当前位置开始,对整个表达式生效。 - 示例:
(?i)bot → 可以匹配 "Bot", "BOT", "bOt" 等任意大小写组合
3.2 \\b: 单词边界
- 作用:表示 单词边界(Word Boundary),确保匹配的是一个完整的单词(而不是单词的一部分)。
- 原理:
\\b会匹配一个位置,该位置的一侧是单词字符(字母、数字、下划线),另一侧是非单词字符(如空格、标点或字符串边界)。 - 示例:
\\bbot\\b → 匹配 "bot" 但不会匹配 "robot" 或 "bots"
3.3 组合后的效果:(?i).*\\b(bot|spider)\\b.*
假设原始正则表达式为:
String pattern ="(?i).*\\b(bot|spider)\\b.*";
3.3.1 匹配逻辑
(?i)→ 忽略大小写。.*→ 允许目标关键词出现在 任意位置(如开头、中间、结尾)。\\b→ 确保关键词是完整单词(避免部分匹配,如robot中的bot)。(bot|spider)→ 匹配 “bot” 或 “spider”。- 最后的
.*→ 允许关键词后有其他字符。
3.3.2 示例匹配的 User-Agent
"Googlebot/2.1"→ 匹配bot"YandexSpider"→ 匹配spider"BingPreviewBot"→ 匹配bot
3.3.3 不匹配的 User-Agent
"Robot/1.0"→\\bbot\\b不会匹配 “Robot” 中的 “bot”"Mozilla/5.0 (Windows NT 10.0; Win64; x64)"→ 不含关键词
4. Java 代码实现
importjava.util.regex.Pattern;publicclassCrawlerDetector{privatestaticfinalStringBOT_PATTERN="(?i).*\\b(bot|spider|crawler|slurp|facebookexternalhit|duckduckbot|facebot|alexa|applebot|pinterest|twitterbot|linkedinbot|telegrambot|uptimerobot|exabot|msnbot|yahoo|googlebot|bingbot|yandexbot|baiduspider|ahrefsbot|semrushbot)\\b.*";privatestaticfinalPattern pattern =Pattern.compile(BOT_PATTERN);publicstaticbooleanisCrawler(String userAgent){if(userAgent ==null|| userAgent.trim().isEmpty()){returnfalse;}return pattern.matcher(userAgent).matches();}}
4.1 java 使用示例
publicstaticvoidmain(String[] args){String userAgent1 ="Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)";String userAgent2 ="Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1";System.out.println("Is crawler 1? "+CrawlerDetector.isCrawler(userAgent1));// trueSystem.out.println("Is crawler 2? "+CrawlerDetector.isCrawler(userAgent2));// false}
5. JS 代码实现
以下是 JavaScript 版本的正则表达式实现(适配浏览器环境):
5.1 JavaScript 正则表达式
const crawlerRegex =/\b(bot|spider|crawler|slurp|facebookexternalhit|duckduckbot|facebot|alexa|applebot|pinterest|twitterbot|linkedinbot|telegrambot|uptimerobot|exabot|msnbot|yahoo|googlebot|bingbot|yandexbot|baiduspider|ahrefsbot|semrushbot)\b/i;
5.2 实现解析
5.2.1 正则结构
\b:匹配单词边界(确保关键词是完整单词,避免误匹配类似robot中的bot)。(bot|spider|...):匹配列表中的任意关键词。i标志:忽略大小写(替代 Java 的(?i))。
5.2.2 浏览器端使用示例
// 检测当前浏览器 User-Agent 是否是爬虫functionisCrawler(){const userAgent = navigator.userAgent;return crawlerRegex.test(userAgent);}// 调用示例if(isCrawler()){
console.log("检测到爬虫,阻止 WebSocket 连接");}else{
console.log("允许连接 WebSocket");}
5.3注意事项
-
关键词动态更新
可以将正则关键词提取到配置中,便于动态扩展:const botKeywords =["bot","spider","crawler","slurp","facebookexternalhit","duckduckbot","facebot",// ...其他关键词];const crawlerRegex =newRegExp(`\\b(${botKeywords.join("|")})\\b`,"i"); -
浏览器兼容性
- 所有现代浏览器(Chrome/Firefox/Safari/Edge)均支持
RegExp和i标志。 - 兼容到 IE9+。
- 所有现代浏览器(Chrome/Firefox/Safari/Edge)均支持
5.4 完整代码
<script>// 定义正则表达式const botKeywords =["bot","spider","crawler","slurp","facebookexternalhit","duckduckbot","facebot","alexa","applebot","pinterest","twitterbot","linkedinbot","telegrambot","uptimerobot","exabot","msnbot","yahoo","googlebot","bingbot","yandexbot","baiduspider","ahrefsbot","semrushbot"];const crawlerRegex =newRegExp(`\\b(${botKeywords.join("|")})\\b`,"i");// 检测逻辑functionisCrawler(){return crawlerRegex.test(navigator.userAgent);}// 根据检测结果控制 WebSocket 连接if(!isCrawler()){const ws =newWebSocket("wss://your-websocket-endpoint");
ws.onopen=()=> console.log("WebSocket 已连接");}else{
console.log("爬虫客户端,禁止连接 WebSocket");}</script>
注意事项
- 误判风险:极少数正常浏览器可能包含关键词(如
Bot),但概率极低。 - 动态更新:定期更新正则中的关键词列表以覆盖新出现的爬虫。
- 性能:正则表达式复杂度较低,适合高频调用。
cket 已连接");}else{
console.log(“爬虫客户端,禁止连接 WebSocket”);}
---
#### **注意事项**
1. **误判风险**:极少数正常浏览器可能包含关键词(如 `Bot`),但概率极低。
2. **动态更新**:定期更新正则中的关键词列表以覆盖新出现的爬虫。
3. **性能**:正则表达式复杂度较低,适合高频调用。
如果需要更全面的关键词列表,可以参考 [user-agents](https://user-agents.net/) 等公开数据集。
## 零基础如何高效学习大模型?
你是否懂 AI,是否具备利用大模型去开发应用能力,是否能够对大模型进行调优,将会是决定自己职业前景的重要参数。
为了帮助大家打破壁垒,快速了解大模型核心技术原理,学习相关大模型技术。从原理出发真正入局大模型。在这里我和鲁为民博士系统梳理大模型学习脉络,这份 `LLM大模型资料` 分享出来:包括`LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程`等, 😝有需要的小伙伴,可以 **扫描下方二维码**免费领取🆓**⬇️⬇️⬇️

### **【大模型全套视频教程】**
教程从当下的市场现状和趋势出发,分析各个岗位人才需求,带你充分了解自身情况,get 到适合自己的 AI 大模型入门学习路线。
**从基础的 prompt 工程入手,逐步深入到 Agents,其中更是详细介绍了 LLM 最重要的编程框架 LangChain。最后把微调与预训练进行了对比介绍与分析。**
同时课程详细介绍了**AI大模型技能图谱知识树**,规划属于你自己的大模型学习路线,并且专门提前收集了大家对大模型常见的疑问,集中解答所有疑惑!

**深耕 AI 领域技术专家带你快速入门大模型**
跟着行业技术专家免费学习的机会非常难得,相信跟着学习下来能够对大模型有更加深刻的认知和理解,也能**真正利用起大模型,从而“弯道超车”,实现职业跃迁!**

**【精选AI大模型权威PDF书籍/教程】**
精心筛选的经典与前沿并重的电子书和教程合集,包含《深度学习》等一百多本书籍和讲义精要等材料。绝对是深入理解理论、夯实基础的不二之选。

**【AI 大模型面试题 】**
除了 AI 入门课程,我还给大家准备了非常全面的**「AI 大模型面试题」,**包括字节、腾讯等一线大厂的 AI 岗面经分享、LLMs、Transformer、RAG 面试真题等,帮你在面试大模型工作中更快一步。
**【大厂 AI 岗位面经分享(92份)】**

**【AI 大模型面试真题(102 道)】**

**【LLMs 面试真题(97 道)】**

**【640套 AI 大模型行业研究报告】**

**【AI大模型完整版学习路线图(2025版)】**
明确学习方向,2025年 AI 要学什么,这一张图就够了!

👇👇点击下方卡片链接免费领取全部内容👇👇

**抓住AI浪潮,重塑职业未来!**
科技行业正处于深刻变革之中。英特尔等巨头近期进行结构性调整,缩减部分传统岗位,同时AI相关技术岗位(尤其是大模型方向)需求激增,已成为不争的事实。具备相关技能的人才在就业市场上正变得炙手可热。
**行业趋势洞察:**
- **转型加速:** 传统IT岗位面临转型压力,拥抱AI技术成为关键。
- **人才争夺战:** 拥有3-5年经验、**扎实AI技术功底**和**真实项目经验**的工程师,在头部大厂及明星AI企业中的薪资竞争力**显著提升**(部分核心岗位可达较高水平)。
- **门槛提高:** “具备AI项目实操经验”正迅速成为简历筛选的重要标准,预计未来1-2年将成为普遍门槛。
**与其观望,不如行动!**
面对变革,主动学习、提升技能才是应对之道。掌握**AI大模型核心原理、主流应用技术与项目实战经验**,是抓住时代机遇、实现职业跃迁的关键一步。

**01 为什么分享这份学习资料?**
当前,我国在AI大模型领域的高质量人才供给仍显不足,行业亟需更多有志于此的专业力量加入。
**因此,我们决定将这份精心整理的AI大模型学习资料,无偿分享给每一位真心渴望进入这个领域、愿意投入学习的伙伴!**
我们希望能为你的学习之路提供一份助力。如果在学习过程中遇到技术问题,也欢迎交流探讨,我们乐于分享所知。
***\*02 这份资料的价值在哪里?\****
**专业背书,系统构建:**
- 本资料由我与**鲁为民博士**共同整理。鲁博士拥有**清华大学学士**和**美国加州理工学院博士学位**,在人工智能领域造诣深厚:
- - 在IEEE Transactions等顶级学术期刊及国际会议发表论文**超过50篇**。
- 拥有多项中美发明专利。
- 荣获**吴文俊人工智能科学技术奖**(中国人工智能领域重要奖项)。
- 目前,我有幸与鲁博士共同进行人工智能相关研究。

**内容实用,循序渐进:**
- 资料体系化覆盖了从**基础概念入门**到**核心技术进阶**的知识点。
- 包含丰富的**视频教程**与**实战项目案例**,强调动手实践能力。
- 无论你是初探AI领域的新手,还是已有一定技术基础希望深入大模型的学习者,这份资料都能为你提供**系统性的学习路径和宝贵的实践参考**,**助力你提升技术能力,向大模型相关岗位转型发展**。

**抓住机遇,开启你的AI学习之旅!**

更多推荐

所有评论(0)