news 2026/8/23 16:21:38

如何秒级识别80+爬虫与机器人:express-useragent的isBot检测与防误报技巧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何秒级识别80+爬虫与机器人:express-useragent的isBot检测与防误报技巧

如何秒级识别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 多条正则模式:从googlebotbaiduspidercurlpythonsemrushbot,再到底层 HTTP 客户端go-http-clientnode-superagent

const IS_BOT_REGEXP = new RegExp(`(${BOTS.join('|')})`, 'i');

关键设计有两点:

  1. 大小写不敏感(末尾的i标志),GoogleBotgooglebot都能命中;
  2. 记录命中来源:命中后不仅isBot = true,还会把匹配到的标识写入botName,方便你按爬虫"点名"处理,而不是只拿到一个笼统的 true。

模式表定义在 src/express-useragent.ts,判定逻辑见testBot()方法(src/express-useragent.ts)。

覆盖不到的"无名爬虫"怎么办?

很多非浏览器客户端的 UA 不以Mozilla开头(例如PostmanRuntime/7.28.4sockbot/3.1.0)。这类请求会被标记为"非权威 UA"(isAuthoritative: false),此时 isBot 判定退化为宽松规则:只要字符串里出现bot字样就算机器人,宁可多疑、不漏判。

isBot 返回结果:常用字段速查表

解析完成后,req.useragent上可用的关键字段:

字段类型说明
isBotboolean是否命中爬虫/机器人
botNamestring命中的模式标识(如googlebotcurl),未命中为空串
isMobile/isDesktopboolean移动端 / 桌面端
isMobileNativebooleanAndroid/iOS 原生 App(Dalvik、okhttp 等)
browser/version/osstring浏览器、版本、操作系统
isWechatboolean微信内置浏览器
isCurlbooleancurl 客户端
sourcestring原始 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 === truebotName命中你维护的白名单(googlebot、baiduspider 等)→ 放行甚至提速
  • isBot === truebotNamepythoncurl这类通用客户端 → 结合频率、路径综合决策
  • 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 中写得非常清晰:

  1. BOTS数组中加入模式(src/express-useragent.ts),建议用小写、简单正则;
  2. 在 tests/bots.test.ts 补充"应识别"与"不应误伤"两类用例;
  3. 运行npm testnpm run lint验证后提交 PR。

官方特别强调:每个新模式都要验证不会误伤合法浏览器——这正呼应了本文的防误报主题。

常用项目文件导航 📁

文件用途
README.md快速开始、API 一览、浏览器端用法
src/express-useragent.ts核心解析器:BOTS 表、testBot、系统/浏览器识别
src/index.tsExpress 中间件与类型导出
tests/bots.test.ts爬虫识别测试用例(含 TikTok 防误报案例)
tests/security.test.tsReDoS 与恶意输入测试
examples/server.tsExpress 演示服务
CONTRIBUTING.mdBot 列表更新指南

小结

  • 一个字段解决识别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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/23 16:19:42

MiniGPT-4能力涌现分析:为什么它开始像GPT-4一样理解复杂图像

MiniGPT-4能力涌现分析:为什么它开始像GPT-4一样理解复杂图像 【免费下载链接】MiniGPT-4 项目地址: https://ai.gitcode.com/hf_mirrors/Vision-CAIR/MiniGPT-4 MiniGPT-4 是 Vision-CAIR(沙特阿卜杜拉国王科技大学,KAUST&#xff0…

作者头像 李华
网站建设 2026/8/23 16:18:49

Poketwo Autocatcher安全使用指南:避免封号的7个注意事项

Poketwo Autocatcher安全使用指南:避免封号的7个注意事项 【免费下载链接】poketwo-Autocatcher Banerus poketwo autocatcher (Pokemon) is an innovative and user-friendly tool, equipped with a wide array of features. Setting it up with just one click a…

作者头像 李华
网站建设 2026/8/23 16:16:43

10分钟读懂 Shardeum 版本发布:语义化版本与更新策略完整指南

10分钟读懂 Shardeum 版本发布:语义化版本与更新策略完整指南 【免费下载链接】shardeum Shardeum is an EVM based autoscaling blockchain 项目地址: https://gitcode.com/GitHub_Trending/sh/shardeum Shardeum 是一个基于 EVM 的自动扩缩容(a…

作者头像 李华
网站建设 2026/8/23 16:13:23

KeymouseGo 快速上手指南:十分钟跑通跨平台鼠标键盘录制回放工具

KeymouseGo 快速上手指南:十分钟跑通跨平台鼠标键盘录制回放工具 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo …

作者头像 李华
网站建设 2026/8/23 16:06:52

Ark-Pets 明日方舟桌宠快速上手指南:让干员住进你的桌面

Ark-Pets 明日方舟桌宠快速上手指南:让干员住进你的桌面 【免费下载链接】Ark-Pets Arknights Desktop Pets | 明日方舟桌宠 (ArkPets) 项目地址: https://gitcode.com/gh_mirrors/ar/Ark-Pets 下班后合上又打开电脑,屏幕右下角的澄闪正慢悠悠地踱…

作者头像 李华
网站建设 2026/8/23 16:05:50

WeKws Android 部署完整教程:从训练到 APK,手机端唤醒词实战

WeKws Android 部署完整教程:从训练到 APK,手机端唤醒词实战 【免费下载链接】wekws Production First and Production Ready End-to-End Keyword Spotting Toolkit 项目地址: https://gitcode.com/gh_mirrors/we/wekws WeKws 是一个面向生产环境…

作者头像 李华