如何秒级识别80+爬虫与机器人:express-useragent的isBot检测与防误报技巧
【免费下载链接】express-useragentNodeJS user-agent middleware项目地址: https://gitcode.com/gh_mirrors/ex/express-useragent
express-useragent 是一款 Node.js 的 User-Agent 解析中间件,内置isBot 机器人识别能力,可以在一次请求内判断访问者是搜索引擎爬虫、社交媒体爬虫还是普通浏览器,并帮你避开最常见的"误报"坑——把真实用户当成机器人拦截。无论你是给 Express 网站加限流、做反爬分析,还是只想在日志里看清流量来源,这套方案都足够轻量。
为什么每个网站都需要爬虫识别 🕷️
你的服务器日志里,可能每天都是这样的"混战":
- SEO 爬虫:Googlebot、Baiduspider、bingbot、yandexbot 等,决定你的搜索收录
- 社媒抓取:facebookexternalhit、twitterbot、telegrambot,用来生成链接预览卡片
- 监控探针:Pingdom、UptimeRobot、screaming frog 等,探测你的站点健康
- 恶意采集:以 python、curl、go-http-client 等客户端身份出现的抓取脚本
靠人工写正则去匹配这几十上百种"身份",既容易漏检(漏掉新爬虫),又容易误伤(把 TikTok 内置浏览器当成 Google 爬虫)。express-useragent 把这件事封装成了一个布尔字段:isBot。
三步上手:给 Express 加上 isBot 检测
安装只需一条命令(要求 Node.js 18+):
npm install express-useragent在 Express 应用中挂上中间件,请求对象上就会出现完整的解析结果:
import express from 'express'; import { express as useragent } from 'express-useragent'; const app = express(); app.use(useragent()); app.get('/', (req, res) => { res.json({ isBot: req.useragent?.isBot, // true / false botName: req.useragent?.botName, // 命中的爬虫标识,如 googlebot browser: req.useragent?.browser, os: req.useragent?.os, }); });运行仓库自带的演示服务,可以直接观察每个请求的解析结果:
npm run express完整的可运行示例见 examples/server.ts,中间件实现位于 src/index.ts。
isBot 判定原理:80+ 爬虫模式表是如何工作的
识别逻辑的核心是一张爬虫模式表BOTS,收录了 80 多条正则模式:从googlebot、baiduspider到curl、python、semrushbot,再到底层 HTTP 客户端go-http-client、node-superagent。
const IS_BOT_REGEXP = new RegExp(`(${BOTS.join('|')})`, 'i');关键设计有两点:
- 大小写不敏感(末尾的
i标志),GoogleBot与googlebot都能命中; - 记录命中来源:命中后不仅
isBot = true,还会把匹配到的标识写入botName,方便你按爬虫"点名"处理,而不是只拿到一个笼统的 true。
模式表定义在 src/express-useragent.ts,判定逻辑见testBot()方法(src/express-useragent.ts)。
覆盖不到的"无名爬虫"怎么办?
很多非浏览器客户端的 UA 不以Mozilla开头(例如PostmanRuntime/7.28.4、sockbot/3.1.0)。这类请求会被标记为"非权威 UA"(isAuthoritative: false),此时 isBot 判定退化为宽松规则:只要字符串里出现bot字样就算机器人,宁可多疑、不漏判。
isBot 返回结果:常用字段速查表
解析完成后,req.useragent上可用的关键字段:
| 字段 | 类型 | 说明 |
|---|---|---|
isBot | boolean | 是否命中爬虫/机器人 |
botName | string | 命中的模式标识(如googlebot、curl),未命中为空串 |
isMobile/isDesktop | boolean | 移动端 / 桌面端 |
isMobileNative | boolean | Android/iOS 原生 App(Dalvik、okhttp 等) |
browser/version/os | string | 浏览器、版本、操作系统 |
isWechat | boolean | 微信内置浏览器 |
isCurl | boolean | curl 客户端 |
source | string | 原始 UA 字符串 |
一个典型的桌面浏览器输出长这样(节选自 README.md):
{ "isMobile": false, "isDesktop": true, "isBot": false, "browser": "Chrome", "os": "macOS Sonoma" }防误报技巧:别把真实用户当爬虫 ⚠️
这是 isBot 检测最容易翻车的地方。分享几个实战要点:
1. 警惕 UA 里的"关键词污染"
真实案例:TikTok 的内置 WebView 会带上googleplay(Google Play 渠道标识)字样,朴素地匹配google就会把 TikTok 用户判成爬虫。express-useragent 在testBot()中内置了豁免逻辑——命中google但同时出现tiktok/trill/bytedance时,直接放行(src/express-useragent.ts)。对应测试用例见 tests/bots.test.ts。
给你的启示:如果给项目贡献新爬虫模式,务必同时补一个"正常浏览器不应命中"的反向测试用例。
2. 用 botName 做"二次确认",而非一刀切
isBot只适合做粗筛。更稳妥的策略是:
isBot === true且botName命中你维护的白名单(googlebot、baiduspider 等)→ 放行甚至提速isBot === true但botName是python、curl这类通用客户端 → 结合频率、路径综合决策isBot === false也别完全放心,UA 可以伪造,敏感接口建议叠加请求速率限制
3. 别只依赖 UA:配合行为判断
UA 字符串本质是"自我申报",攻击者改一行请求头就能伪装成 Googlebot。生产环境建议 isBot 与限流、验证码、IP 信誉等手段组合使用。
安全加固:防 UA 注入与 ReDoS 攻击 🛡️
把 UA 字符串当不可信输入处理,是这个项目值得学习的细节:
- 超长头截断:Client Hints 解析时限制最大 2048 字符(
MAX_HEADER_LENGTH),防止超大 header 拖垮解析; - 品牌数量上限:brand 列表最多解析 20 条;
- 字符级解析替代正则:产品 token 解析改为逐字符扫描,从根源上规避正则回溯(ReDoS)风险。
这些对抗性测试集中在 tests/security.test.ts,包括"5000 个连字符""重复 2000 次 iPad 字样"等恶意输入场景,值得做反爬的开发者借鉴。
想新增一个爬虫?5 分钟更新 Bot 列表
发现没收录的爬虫时,贡献流程在 CONTRIBUTING.md 中写得非常清晰:
- 在
BOTS数组中加入模式(src/express-useragent.ts),建议用小写、简单正则; - 在 tests/bots.test.ts 补充"应识别"与"不应误伤"两类用例;
- 运行
npm test和npm run lint验证后提交 PR。
官方特别强调:每个新模式都要验证不会误伤合法浏览器——这正呼应了本文的防误报主题。
常用项目文件导航 📁
| 文件 | 用途 |
|---|---|
| README.md | 快速开始、API 一览、浏览器端用法 |
| src/express-useragent.ts | 核心解析器:BOTS 表、testBot、系统/浏览器识别 |
| src/index.ts | Express 中间件与类型导出 |
| tests/bots.test.ts | 爬虫识别测试用例(含 TikTok 防误报案例) |
| tests/security.test.ts | ReDoS 与恶意输入测试 |
| examples/server.ts | Express 演示服务 |
| CONTRIBUTING.md | Bot 列表更新指南 |
小结
- 一个字段解决识别:
isBot+botName即可覆盖 80+ 常见爬虫与机器人,接入 Express 只需一行中间件 - 防误报是重点:善用 botName 二次确认、内置豁免机制(如 TikTok WebView 案例),UA 判断务必与限流等手段组合
- 安全细节到位:输入截断、字符级解析等加固,让解析器本身不会被恶意 UA 拖垮
对于新手来说,先跑通npm run express看一遍真实 UA 的解析输出,再对照本文的字段速查表,基本就能上手给自家项目加一套靠谱的爬虫识别了。
【免费下载链接】express-useragentNodeJS user-agent middleware项目地址: https://gitcode.com/gh_mirrors/ex/express-useragent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考