网站反爬与反机器人防护:该部署什么、如何落地,不被抓取又能留住真实用户
引言:当你的网站变成别人的数据库
想象一下:你花了半年时间搭建商品目录,反复核对价格,撰写商品详情页,精心配置筛选功能。然后你发现,竞争对手在你调价后二十分钟就更新了自己的价格,搜索结果里还冒出一堆克隆网站,一字不差地复制了你的商品描述。与此同时,服务器被压得喘不过气,主机账单水涨船高,而分析后台显示凌晨时分有来自你完全没有客户的地区的神秘流量高峰。是不是很眼熟?这就是爬虫抓取。而且这绝不是假设性威胁,而是任何拥有有价值内容的网站每天都在面对的现实。
根据近年来的行业报告估算,自动化流量约占互联网全部请求的一半左右,其中约三分之一来自明确的恶意机器人。对于电商、分类信息、旅游和内容平台来说,这个比例可能更高。而2026年的趋势已经非常明显:传统爬虫之外,还多了基于大语言模型的智能体,它们像人类一样浏览网站、阅读内容并做出判断。“真人”与“自动化”访客之间的界限正在迅速模糊。
mobileproxy.space的读者对这一话题再熟悉不过了。营销人员和流量套利者本身就在采集数据,开发者编写采集器,企业主监控竞争对手。但你们每个人肯定也都有自己的网站、落地页、商品目录或API,此刻可能正有人在对它们进行数据导出。所以在这篇文章中,我们换个视角:今天你的网站在被爬取,我们要探讨如何搭建一套真正有效、又不妨碍真实用户的网站反机器人防护体系。
一个重要的前提说明。我们不比较供应商,也不做商业服务排行榜——博客里有专门的文章讲这个。这里要讲的是落地实施:有哪些防护层级、按什么顺序部署、如何衡量效果、每一步会踩到哪些坑。读完你将获得:
- 理解现代反机器人系统如何“看待”访客,以及为什么封IP早就不是解决方案;
- 一套诊断方法:如何用一天时间弄清楚谁在爬你、怎么爬的;
- 三层防御体系的逐步操作指南——从服务器端速率限制到行为分析和数据陷阱;
- 一套分阶段落地的框架,不让转化率崩盘;
- 检查清单、工具列表,以及带数据的真实案例复盘。
找个舒服的姿势坐好。内容很长,但它是作为一份工作书签来设计的,你会在项目的每个阶段反复翻阅。
基础:什么是反机器人防护,防的是谁
机器人各有不同,并非所有都需要拦截
首先要接受一点:“机器人”不是贬义词。搜索引擎爬虫索引你的页面、带来流量。可用性监控检查网站是否正常。支付系统调用Webhook。联盟聚合器按合同拉取数据feed。这些都是你需要且有利的自动化流量。网站反机器人防护的任务不是消灭自动化本身,而是把有用、可接受的请求与有害请求区分开来,让有害请求在经济上变得无利可图。
一般来说,不受欢迎的机器人可以分为以下几类:
- 内容和价格爬虫——导出商品目录、描述、库存、价格、评论。本文的主角。
- 无合同聚合器——拿走你的数据,然后把访问权卖给第三方。
- 撞库机器人——攻击登录表单,用泄露的账号密码对进行验证。
- 抢购和黄牛机器人——在几秒内抢购稀缺商品或预订名额。
- 垃圾信息和刷量机器人——灌满表单,注册虚假账号,污染指标。
- AI模型爬虫——采集文本用于训练或用于实时回答。它们是否可接受,每个企业自行决定。
请注意:爬取本身很少会弄坏网站。但它会制造寄生性负载(有时占商品目录全部请求的60%到80%),歪曲分析数据,耗尽你在页面渲染时调用的外部API配额,最重要的是,它剥夺了你收集这些数据本应获得的竞争优势。
反爬虫防护与防DDoS的区别
很多站长把这两个任务画等号,然后奇怪为什么防DDoS过滤器放过了爬虫。区别是根本性的。DDoS是对量的打击:攻击者的目标是耗尽带宽或服务器资源。这种攻击很容易从指标上发现,在网络层就能过滤掉。而爬虫恰恰相反,它努力不被发现:把请求拉长时间、分散到数万个地址、伪装成浏览器、访问和真人一样的URL。传统的DDoS过滤器看到的是平稳的“健康”流量,于是放行。因此反机器人防护需要完全不同的信号——我们将在下一节讨论。
三层防御体系:我们采用的模型
为了不在技术细节中迷失,可以把反机器人防护想象成三层同心圆。类比一座中世纪城堡:护城河与外城墙、有守卫的城门,以及最里面的内室——即便客人进了城门,也仍在监控之下。
- 网络与服务器层。请求频率限制、按网络信誉过滤、WAF、基于请求头的基础规则。成本低、见效快,能挡住最原始的机器人。
- 客户端验证层。JavaScript挑战、TLS和浏览器指纹分析、在需要的地方放验证码、工作量证明。能挡住没有浏览器的脚本和配置粗糙的无头工具。
- 行为分析层与数据保护。分析操作序列、会话评分、蜜罐陷阱、数据混淆与水印。针对那些已经通过前两轮的进阶机器人。
我们会反复强调的核心观点是:没有任何单一层是足够的。关键在于机器人必须同时绕过所有三层,而每一道额外的障碍都会提高它的成本。当爬取你的网站比合法购买数据或用别的方式获取更贵时,爬取就会停止。这是经济学,不是魔法。
后文会遇到的基础术语
- Rate limiting(速率限制)——限制单一来源在单位时间内的请求数量。
- WAF(Web应用防火墙)——应用层防火墙,按规则过滤HTTP请求。
- Fingerprint(指纹)——一组客户端特征,用于识别其类型或具体实例。
- Headless浏览器——没有图形界面、由程序控制的完整浏览器。
- Challenge(挑战)——客户端必须完成才能获得访问权的验证任务。
- False positive(误报)——防护误拦了真实用户的情况。
- Honeypot(蜜罐)——陷阱:对人不可见、但对自动化客户端可见的元素。
深入理解:现代反机器人系统如何“看待”访客
要有意识地部署防护,就需要理解它依赖哪些信号。有趣的地方从这里开始:过去五年,行业从“封IP”走到了多层评分,决策基于数百个特征。我们来逐一拆解主要的信号类别。
网络信号,以及为什么IP不再是主角
历史上第一个机器人指标是IP地址。来自数据中心的请求?多半是脚本。同一个地址一千个请求?肯定是脚本。这种方法对直接从云服务器访问的懒人爬虫仍然有效,值得采用。但它有两个根本局限。
第一:住宅和移动地址。本博客的读者比谁都清楚,由于运营商NAT的存在,一个移动IP背后可能同时有几千个真实用户在共享。因为一个可疑客户端就封掉这个地址,等于把整个城区都挡在网站外面。移动网络的信誉库几乎没用:昨天被爬虫用的地址,今天可能属于你的买家。正因如此,专业的网站反机器人防护只把IP当作弱信号之一,而不是判决依据。
第二:分布式。现代爬虫轮换地址,使得每个地址每小时只承担两三个请求。足以拦截这种客户端的速率限制阈值,必然会误伤那些打开十个目录标签页的真实用户。
网络层还剩什么有用的?ASN特征(网络属于主机服务商)、地理异常(来自你并不运营的国家的流量)、IP地理位置与浏览器语言不匹配、按子网而非单个地址的统计。
传输层和协议层指纹
这是一个很多人低估的信号。当客户端建立加密连接时,它会发送一条TLS问候消息,包含支持的加密套件、扩展及其顺序。这个集合取决于客户端使用的库。Windows上的Chrome浏览器形成的问候消息是一个样子,Firefox是另一个样子,而Python的HTTP请求库则是第三个样子,完全不像浏览器。这组集合的哈希被称为TLS指纹(常见方案有JA3和更新的JA4)。
妙处在于,爬虫可以一秒伪造User-Agent头,但要伪造TLS指纹使其与声称的浏览器一致,难度大得多。如果客户端自称是最新版Chrome,但它的TLS问候对应的是控制台库,那它就是脚本。类似的指纹也存在于HTTP/2(SETTINGS帧的顺序和值、流优先级)和HTTP/3中。“声称的浏览器+TLS+HTTP/2”的组合已经能提供不错的分类精度,而且不需要一行JavaScript。
浏览器指纹与自动化特征
当客户端执行JavaScript时,分析空间大幅扩展。防护脚本会采集数百个参数:屏幕分辨率及其与窗口大小的比例、字体列表、通过Canvas和WebGL渲染图形的结果、音频上下文的特征、时区、语言设置、特定环境对象的存在和行为。还会单独检查自动化特征:无头模式在环境中留下的属性、声称平台与实际能力之间的不一致、在真实设备总有噪声的地方出现的过于“完美”的值。
重要的是要理解:目标不是唯一确定一个人(这既有法律敏感性,技术上也不可靠),而是找出内部矛盾。真正的iPhone不会报告32个逻辑处理器核心。真正的安卓Chrome在没有任何触摸输入的情况下不会拥有1920×1080的屏幕分辨率。每一个矛盾——可疑度加一分。
行为信号
最难伪造的一类特征是随时间变化的行为。人移动鼠标时有微小的抖动和加速度,滚动页面不均匀,阅读时会停顿,点击时不会精确点在按钮正中心。人会先到首页,再进分类,看三四个商品,然后返回。机器人则按ID递增顺序连续打开五百个商品页,每个间隔恰好1.2秒,从不加载图片,也不请求CSS。即便是最先进的可控浏览器爬虫,也会在会话结构上暴露自己:不可能在表现得像一个买家的同时还导出整个目录。
评分制,而非非黑即白的判断
现代系统不会二元地回答“机器人还是人”。它们给每个请求或会话赋予风险评分,然后应用策略:低风险——放行;中风险——显示不可见挑战或延迟响应;高风险——验证码或屏蔽;极高风险——返回看似合理但被篡改的数据。这种方法大幅降低误报:对可疑客户端不是摔门,而是给它一个证明自己还活着的机会。
2026年正在发生的变化
几个已经在影响防护设计的趋势:
- AI智能体作为新的客户端类别。基于语言模型的智能体操控真实浏览器,阅读页面,行为几乎和人一样。其中一些是有用的(它们带来买家),一些只是更聪明的爬虫。网站将不得不为这类流量制定明确的政策。
- “有道德”的机器人识别标准化。正在发展一些机制,让合法的自动化客户端以密码学方式证明自己属于某家公司。这使得有用机器人可以在无需挑战的情况下被放行。
- 设备认证与信任令牌。操作系统和浏览器正在试验一些机制,让网站无需采集指纹就能获得“这是真实设备上的真实人类”的确认。长远看这会简化防护,但目前覆盖率有限。
- HTTP/3增长与元数据加密。部分惯用的网络信号变得不那么可用,重心转向行为分析。
- 对用户数据采集的监管压力。浏览器指纹和会话存储需要谨慎对待个人数据法规。防护设计应确保只采集最少必要的数据。
这一节的结论简单而重要:可靠的反爬虫防护建立在多个弱信号的组合之上,而非某一个“银弹”特征。记住这一点,然后进入实践。
方法一:诊断——弄清楚谁在爬你、怎么爬的
盲目部署防护,是一个花掉预算还封错人的稳妥办法。在实施任何东西之前,先花一两天做侦察。好消息是:你不需要昂贵的工具,有Web服务器日志和会向它提正确问题的能力就够了。
第一步:收集有代表性时段的完整日志
至少七天,以覆盖一个完整周期。日志中应包含:时间、IP、请求方法和路径、响应码、响应大小、User-Agent、Referer、处理时间。如果你的Web服务器只记录标准格式,扩展它。对于每天有数百万请求的项目,方便的做法是直接把日志导出到分析数据库,或者至少导出为表格格式。
第二步:发现流量结构中的异常
向日志提以下问题并记录答案——这就是你的基线。
- 按小时的分布。真人流量有昼夜周期。夜间平坦的“平台”或凌晨4点的峰值是第一个标志。
- 资源类型比例。每个HTML页面请求对应多少个CSS、JS和图片请求?浏览器大约是1比10到30。爬虫是1比0。找出只请求HTML或只请求JSON的地址和子网。
- 爬取深度。谁在一个会话里打开超过100个商品页?谁在顺序遍历ID、分页页码、筛选条件组合?
- 请求头。过时的浏览器版本、空或库的User-Agent、缺少Accept-Language、数千个地址使用同一个User-Agent。
- 响应码。大量针对不存在ID的404——遍历特征。大量429或403——已经有人撞到你的限制上了。
- 自治系统。按ASN对IP分组。主机服务商在目录流量中的占比超过5%到10%——几乎肯定是机器人。
第三步:用钱衡量损失
把发现翻译成业务语言,否则防护拿不到预算。计算:寄生请求的占比及其基础设施成本;机器人生成的外部付费API(汇率、地理编码、搜索)负载;分析数据失真(虚假会话损害广告归因,这直接关系到营销人员);被复制价格和内容造成的收益损失。即便是“机器人每月让我们在基础设施上花18万卢布,外加无法估量的竞争地位损失”这样粗略的估算,也能改变与高层的对话。
第四步:布置陷阱验证假设
日志显示有人在那里,但不显示他想要什么。用主动侦察补充分析:
- 金丝雀记录。在目录中添加一个不存在的商品,名称唯一,不被搜索引擎索引、不在导航中显示,但可通过分页中的直接链接访问。这个名称出现在别人的网站上——就是爬取的证据,并指明来源。
- 隐藏链接。对人不可见的链接(在屏幕之外、没有尺寸),但存在于HTML中。人永远不会点击它。每次点击——就是机器人。别忘了通过排除规则对搜索引擎隐藏它。
- 唯一空格和细微变体。在描述中加入少量独特的格式特征,日后可以据此识别被复制的内容。
第五步:建立爬虫画像
诊断的结果应该是一张三到五个画像的表格。例如:“画像A:无JS的云脚本,夜间对商品页发出4万次请求,旧版Chrome的User-Agent,单一子网”。“画像B:分布在住宅地址上的客户端,每个地址两三个请求,会执行JS,只走价格筛选”。“画像C:聚合器,诚实表明身份,每天拉取一次feed”。对每个画像,立刻就清楚哪一层防护能挡住它。画像A会倒在第一层。画像B需要行为分析。画像C或许值得提供一个合作API——有时这比打仗更划算。
诊断检查清单
- 已收集7天以上、字段完整的日志。
- 已建立按小时和资源类型的流量分布。
- 已识别出对“高价值”URL请求量最大的前20个子网和ASN。
- 已发现深度和规律性异常的会话。
- 已计算寄生流量占比及其成本。
- 已布置金丝雀记录和隐藏链接。
- 已形成爬虫画像,并标注目标防护层。
- 已确定不能触碰的合法机器人:搜索引擎、支付Webhook、合作伙伴、监控。
方法二:第一道防线——服务器与网络层
第一道防线是地基。它挡不住进阶爬虫,但能在一天之内、几乎零成本地筛掉50%到70%的原始机器人。为了昂贵方案跳过这一步是错的:如果一半的问题可以用简单规则丢弃,何必为每个请求的分析付费?
正确设置的速率限制
Rate limiting是最知名的工具,也是最常被配错的。典型错误:对整个网站按IP设一个全局限制。结果要么太松没用,要么太紧,打到办公室、大学和NAT移动网络。正确做法是差异化限制:
- 按资源类型。静态资源和首页——宽松限制。商品页、搜索结果、目录JSON端点——明显更严。登录和注册表单——非常严格。
- 按键值。不只是IP。组合使用:IP+路径、IP+User-Agent、会话cookie,对已认证用户用账号标识。对于移动网络,按/24子网或高阈值的ASN限制比按单个地址硬限更好。
- 按时间窗口。两个窗口:短窗口(例如10秒内20个请求——防突发)和长窗口(例如每小时600个商品页请求——防慢速遍历)。慢而执着的爬虫会撞上第二个窗口,真人不会。
- 按反应类型。超限不一定要意味着封禁。第一级——延迟响应2到5秒。第二级——429代码加Retry-After头。第三级——临时封禁10到15分钟。渐进式升级几乎不伤及真人,却能让机器人慢很多。
下面是流行Web服务器的基本区域配置示例,你根据自身情况调整(数值仅为示意):
limit_req_zone $binary_remote_addr zone=catalog_burst:20m rate=3r/s;limit_req_zone $binary_remote_addr zone=login:10m rate=10r/m;location /catalog/ { limit_req zone=catalog_burst burst=15 delay=8; }location /login { limit_req zone=login burst=3 nodelay; limit_req_status 429; }注意delay参数:它允许一部分突发立即得到服务,剩余部分延迟处理,这对打开十个标签页的人来说是舒适的,对脚本则很不友好。
按网络特征过滤
为自治系统制定策略。主机服务商和云是大多数原始爬虫的来源。完全封禁不一定合适(企业代理和一些合法服务也从那里来),但对其施加严格限制和强制JavaScript挑战是合理的。对于你不开展业务的国家同理:不是封禁,而是提高验证级别。记住“弱信号加分”的原则,而不是“单一信号决定一切”。
请求头级别的规则
几条廉价但有效的WAF或服务器配置规则:
- 拒绝空User-Agent或已知HTTP库签名访问非服务URL的请求。合法集成应使用带密钥的专用API,而不是公共页面。
- 要求请求头一致:声称是Chrome却没有其特征性客户端提示头——可疑。
- 对旧格式的URL返回404或410,爬虫还在按旧站点地图请求它们。
- 隐藏响应头中的服务器软件和框架版本——不是为了反爬,而是总体卫生。
机器人规则与明确政策
搜索引擎机器人规则文件不是防护手段——恶意机器人会忽略它。但它有两重意义。第一,它允许你明确放行有用机器人、明确禁止不受欢迎的爬虫,包括AI模型数据采集器——守规矩的运营方会遵守这些规则。第二,它固定了你的立场:技术规则加上网站使用条款,使得未经授权的数据采集在法律上对采集方更不利。务必在用户协议中写明禁止未经书面许可的自动化采集。
缓存作为防护
一个不那么显而易见的技巧:在CDN或反向代理层对“高价值”页面进行激进缓存,虽然不能阻止爬虫取走数据,但消除了最大的痛点——应用和数据库的负载。如果机器人从缓存中导出目录,你的基础设施几乎无所谓。这不是胜利,但为构建后续防线赢得了时间,不用忙着灭火。
第一道防线检查清单
- 已确定不同价值等级的URL组,并为每组配置了各自的限制。
- 已实现两个限制窗口:短窗口和长窗口。
- 超限反应是升级式的:延迟、429、临时封禁。
- 移动和住宅网络的限制已放宽或按子网计算。
- 主机ASN和非目标地区已切换到增强验证模式,而非封禁。
- 已配置基于请求头的规则来筛掉库客户端。
- 已制定机器人政策和法律上的数据采集禁令。
- 已启用昂贵页面的缓存。
- 针对搜索引擎、支付系统和合作伙伴的例外已验证并记录在案。
方法三:第二道防线——客户端验证与挑战
第一道防线依据请求本身的特征起作用。第二道防线更进一步,向客户端提出问题:“证明你是浏览器,并证明你背后有人”。正是在这里,筛掉了不执行JavaScript的脚本和仓促配置的无头工具。我们按“用户成本”从低到高来拆解这一层的工具。
TLS和HTTP/2指纹:无感过滤器
从用户完全察觉不到的开始。在负载均衡器或反向代理上计算连接的TLS指纹,并与声称的User-Agent比较。典型逻辑:
- 指纹对应已知HTTP库,而User-Agent声称是浏览器——高风险。
- 指纹对应浏览器,但与请求头中声明的家族或版本不符——中风险。
- 指纹在你的网站上首次出现,且同时出现在数千个地址上——怀疑是新的爬取工具。
实施中的重要细节:不要在第一天就按TLS指纹封禁。先用一周收集统计,弄清哪些指纹对应你的真实受众(包括移动应用内浏览器和即时通讯工具的WebView,它们的指纹很特殊),然后才把规则切换到执行模式。否则你可能切断从Telegram或邮件客户端打开你网站的用户。
JavaScript挑战:检查执行环境
基础JS挑战是一小段脚本,客户端必须执行它才能获得访问cookie。没有cookie,服务器就返回占位内容而非真实内容。基于HTTP库的简单脚本不执行JavaScript,被挡在门外。更高级的版本会采集环境特征并检查其一致性,正如我们在信号部分讨论的那样。
实施建议:
- 不要对所有人显示挑战。只对中等风险评分的请求和高价值板块应用。首页和广告引流的落地页必须瞬间打开——首屏之前每多一秒都在损失转化,流量套利者比谁都清楚这一点。
- 让挑战不可见。脚本应在后台100到300毫秒内完成,不要白屏,不要“正在检查您的浏览器”字样。对诚实客户端,过程无感。
- 把结果绑定到会话,而非IP。访问cookie应签名、有生命周期,并包含客户端关键特征的哈希。这样就不能简单地把它复制分发给上百个爬虫线程。
- 定期更换挑战。静态验证一周就会被破解。混淆代码、更换检查参数、轮换签名密钥。
- 检查JS数据与服务端数据的一致性。脚本里的时区与IP地理位置不符?声称的平台与TLS指纹不符?每处不一致——风险加一分。
工作量证明:经济壁垒
一个优雅且日益流行的验证码替代方案。服务器给客户端一道计算题(例如,找到一个哈希以特定数量的零开头的值)。手机浏览器在200到500毫秒内解出,用户无感。但发出10万次请求的爬虫,就必须为此花费数小时的CPU时间。难度可以按风险评分成比例提高:可疑客户端——难度高十倍。真人察觉不到差别,机器人则非常明显。
验证码:哪里合适,哪里有害
验证码是最显眼也最烦人的工具。用户体验研究持续表明:购买路径上的每个验证码都会降低转化率,移动用户的损失更大。因此规则很简单:验证码是最后的武器,不是第一道检查。合适的应用点:
- 几次失败尝试后的登录表单;
- 注册和密码找回;
- 提交反馈表单和评论;
- 会话风险评分已经很高、而客户端仍在尝试浏览目录的情况;
- 保护关键操作:预订、使用优惠码、将稀缺商品加入购物车。
不合适的点:首页、商品页、搜索、广告活动落地页。如果你不得不在目录上放验证码,说明前面的层没起作用,需要治疗的是它们。另外:选择带不可见模式和自适应难度的现代验证码,而不是2000年代那种扭曲字母图片。
API和移动应用防护
爬虫往往根本不访问网站——它们找到前端使用的JSON端点,直接拿走干净的结构化数据,无需解析HTML。检查一下:你的目录API是否没有会话cookie和签名请求就能访问?如果是,整个网站防护都毫无意义。最低限度的措施:通过挑战后签发的短期令牌;令牌绑定会话;限制返回大小和分页深度;对API设置单独且更严格的限制。移动应用方面——用平台手段验证应用真实性,并对证书进行固定。
第二道防线检查清单
- 已计算TLS/HTTP2指纹,并收集了一周的真实受众统计。
- 指纹相关规则在分析后才切换到执行模式。
- JS挑战已以不可见方式部署,并按风险评分自适应应用。
- 访问cookie已签名、绑定客户端、有生命周期。
- 已实现带自适应难度的工作量证明。
- 验证码只放在表单和关键操作上,不在目录上。
- 目录API已用令牌和限制保护,无会话不可访问。
- 所有检查已在即时通讯工具的WebView和移动浏览器中测试过。
方法四:第三道防线——行为、陷阱与数据本身的保护
假设爬虫通过了前两轮:它从住宅地址访问,操控带可信指纹的真实浏览器,能完成挑战。接下来呢?接下来我们从“你是谁”的问题转向“你在做什么”,最终转向让到手的东西贬值。这是网站反机器人防护最智能的一层,也正是它区分了成熟系统和一堆规则。
会话行为评分
第三道防线的基础是随时间累积会话风险分。值得计入的特征:
- 导航深度和结构。一小时内超过50到100个商品页、遍历分页到底、穷举所有筛选组合、按标识符递增顺序移动。
- 节奏。请求间隔过于均匀,或者相反,间隔呈完美随机分布(人不会完美随机)。
- 缺乏交互。没有鼠标移动、滚动、触摸、窗口大小变化、焦点事件。页面加载了,但没人在看。
- 非典型路径。从未访问首页、购物车、联系方式。只走带数据的目标页。
- 忽略资源。不请求图片、字体、分析脚本。
- 多会话特征。同一个浏览器指纹出现在数百个地址上、几十个相同导航模式的会话在同一分钟启动。
对分数增长的反应同样是升级式的:先延迟响应,然后提高难度的挑战,然后验证码,然后封禁会话。而且应该封的是会话和指纹,而不是IP——记住移动网络的情况。
生产环境中的蜜罐陷阱
我们诊断时用的陷阱,作为防护的常设元素也非常有效。每个隐藏链接、每个被客户端填写的不可见表单字段、每个对导航中不存在的URL的请求——都是误报率几乎为零的信号。人不可能点击零尺寸的元素。安全规则:对搜索引擎隐藏陷阱,不要使用可能影响屏幕阅读器残障用户的陷阱,定期更换陷阱的位置和形态。
让到手的东西贬值:处理数据本身
这是一个几乎没人谈的策略,但它往往比任何封禁都有效。如果你阻止不了机器人拿走数据,那就让拿走的东西变得无用甚至带毒。
- 对可疑会话进行数据投毒。对高风险评分的客户端不是返回403错误,而是返回正常页面,但价格和库存被篡改:价格上下浮动7%,随机库存,修改后的评分。爬虫不知道已经暴露,继续收集垃圾数据,这些数据随后进入竞争对手的数据库。一旦这种事件在重新定价后被发觉,就会长期打消爬取的念头。谨慎使用:只在极高的确信度下使用,以免向真实买家显示错误价格,且绝不用在法律意义重大的信息上。
- 数据水印。每个会话独有的内容微特征:描述中的词序、不可见的格式变体、独特的“金丝雀”商品。日后你可以据此证明数据从哪里泄露、与哪个客户端相关。
- 动态标记。在高价值页面上定期更换CSS类名和HTML结构,会破坏依赖选择器的爬虫。这是军备竞赛,但每一轮迭代你只花一次发布的代价,攻击者却要重写逻辑。
- 非标准渲染关键值。价格可以由多个元素拼成、通过CSS伪元素插入、以图片形式呈现,或在交互后延迟加载。每种方式对可访问性和搜索引擎优化都有代价——请权衡。
- 限制返回量。不要向任何人返回完整目录:分页深度硬上限、必须通过筛选缩小范围、没有“一次性全部商品”的端点。
用合法渠道代替战争
一个看似矛盾但有效的做法。如果聚合器、合作伙伴或研究人员系统性地需要你的数据,给他们一个带密钥、有配额和使用条款的官方API。一部分负载会从“灰色”地带转移到可控区域,而你也就有了对继续爬取公开页面的行为强硬处理的法律和技术依据。
三层防御体系的分阶段落地框架
单独谈谈流程,因为大多数失败不是技术原因,而是赶工造成的。推荐顺序:
- 观察模式(1到2周)。所有规则和评分都在运行,但不拦截任何东西——只记录决策。你看到自己会封谁,并与现实核对。
- 校准。人工审查“本该被封”的前几名会话。其中会有你的合作伙伴、你自己的监控、即时通讯工具的WebView,以及浏览器怪异但真实活着的用户。调整阈值,添加例外。
- 软执行(1到2周)。只启用延迟和不可见挑战。关注转化率、跳出率、支持工单。
- 逐步扩大范围的完整执行。先对10%流量启用验证码和封禁,然后50%,然后全部。每一步都监控指标。
- 运营。每周审查误报,每月重审阈值,轮换挑战和陷阱,更新爬虫画像。
用于监控的关键指标
- 被分类为机器人的流量占比,按网站板块划分。
- 关于验证码或不可访问的投诉工单数量。
- 变化前后的转化率和跳出率,单独看移动受众。
- 人工抽检会话的误报率(目标低于0.5%)。
- 应用和数据库负载,基础设施成本。
- 从你调价到它出现在已知竞争对手那里所经过的时间。
实施反机器人防护时的典型错误
我们已经讨论了该做什么。现在说说不要做什么——根据几十个项目的经验,这些错误以惊人的一致性重复出现。
错误一:把封IP当作主要手段
最常见也最有害。站长看到某个地址一千个请求,封掉它——结果切断了办公中心或运营商移动网络的一个网段,背后有几千用户。爬虫则切换到下一个地址。IP是弱信号,是加强验证的理由,而不是封禁的理由。
错误二:到处放验证码
“每页都放验证码,让机器人受罪”式的反应。受罪的不是机器人,是转化率:真人离开,广告预算浪费在没看到内容的用户身上,搜索引擎爬虫拿到占位内容。验证码是用于表单和关键操作的点状工具。
错误三:没有观察模式就启用封禁
规则晚上写好,夜里启用,早上支持团队就淹没在投诉里。永远先观察,再校准,然后执行。
错误四:忘记合法机器人
被封的搜索引擎机器人——两周后排名丢失。被封的支付Webhook——未支付的订单。被封的自家监控——虚假告警。启用任何规则前,建立并检查例外列表。
错误五:忽视API和移动端点
网站防护做得堪称典范,但前端调用的JSON却对全世界开放,没有令牌。爬虫感谢你提供干净的结构化数据。防护必须覆盖所有内容交付渠道。
错误六:静态的挑战和陷阱
配置一次就完事的防护,一个月后就被破解和绕过。网站反机器人防护是过程,不是项目:轮换、更新、重审阈值。
错误七:在没有高确信度时进行数据投毒
展示“被污染”价格的诱惑很大,但一次向真实客户显示错误价格,尤其是基于该价格下的订单,是声誉和法律风险。只用于评分最高的会话,绝不用在法律意义重大的信息上。
错误八:忘记可访问性
陷阱和非标准渲染可能破坏屏幕阅读器和残障用户的使用体验。用可访问性工具测试防护,而不是只在最新版Chrome里测。
错误九:采集过多的用户数据
浏览器指纹和详细行为日志属于个人数据法规的管辖范围。只采集解决问题所需的最少数据,限制保存期限,在隐私政策中说明处理事实。
错误十:没有成功指标
防护启用了,但没人能回答“变好了吗?”没有诊断得到的基线,没有转化率监控,你无法区分胜利和失败。
落地所需的工具与资源
我们承诺不比较供应商,说到做到。下面是工具类别及各类别负责什么,以便你按自己的规模和预算组建技术栈。具体产品名称你很容易自己找到;这里重要的是架构。
Web服务器和反向代理层
Nginx、Apache、Caddy、HAProxy、Envoy。提供:按灵活键值的速率限制、请求头规则、按条件返回不同响应、通过模块和扩展计算TLS指纹。这是你的第一道防线,对于每天几百万请求以内的项目,起步阶段可能就够了。
WAF和带防护的CDN
内置WAF和机器人过滤模式的云CDN,或基于开源规则集自行部署的WAF。提供:按ASN信誉和地理位置的过滤、可管理的挑战、基础评分、缓存。优点——快速启用。缺点——针对你的业务逻辑的可定制性有限。
专业的机器人管理平台
商业和开源系统,采集客户端指纹、进行行为评分、应用自适应挑战,并提供分析面板。当机器人流量占比高、数据有价值,而团队没有自研能力时,它们是有理由的。选择时看观察模式、策略的细粒度、对你移动应用和WebView的支持,以及决策的透明性——你应该能理解为什么某个客户端被封。
自研用的库
用于采集浏览器指纹、实现工作量证明、在服务端计算TLS指纹、检测自动化特征的开源库。适合有开发者且希望完全掌控的团队。记住需要持续更新:无头模式的特征随每个浏览器版本变化。
验证码与替代方案
带不可见模式和自适应难度的现代验证服务,以及基于工作量证明、无需用户交互的方案。选择标准:对残障人士的可访问性、在你所在地区无延迟地工作、对用户数据的采集最少。
分析与可观测性
日志采集与分析技术栈(ELK及同类、ClickHouse、云分析系统)、防护指标看板、流量异常告警系统。没有这些你就是瞎的:看不到系统按受众细分做出的决策,就无法校准阈值。
测试工具
单独的建议:用爬虫使用的同样手段测试你的防护。无头模式下的自动化浏览器、流行语言的HTTP客户端、网络分析工具。如果你自己写的简单脚本都能自由导出目录,说明工作还没完成。对于使用移动代理的团队,还有另一个场景值得测试:防护是否会拦截来自移动网络的诚实用户,那里地址由数千用户共享。
你会需要的内部资源
- 一个有权修改阈值的防护负责人。
- 支持团队参与的误报处理流程。
- 经法律审核的使用条款和隐私政策。
- 为需要你数据的合作伙伴提供的官方渠道。
案例:真实项目中的效果
三个来自实施实践中的匿名案例,带数据和结论。细节有改动,实质保留。
案例一:电子产品网店——目录请求的71%来自机器人
情况。中等规模网店,约4万件商品,发现竞争对手在他之后半小时内就调价。日志诊断显示:商品页请求的71%在夜间、44%在白天是自动化的。主要画像:两个无JS的云脚本,以及一个分布在住宅地址、只走价格页的客户端。寄生流量的基础设施成本约每月14万卢布,加上付费地理编码API的配额到中午就耗尽。
方案。第一道防线:按板块的差异化限制、对主机ASN的严格模式、商品页缓存。第二道防线:带一周观察期的TLS指纹、对目录的不可见JS挑战、用令牌保护前端JSON端点。第三道防线:按会话深度的评分、隐藏链接、金丝雀商品、对评分最高的会话将价格篡改在5%到8%以内。
两个月后的结果。目录的机器人流量占比降至9%。云脚本在第一周就消失了。分布式客户端坚持了三周,随后根据金丝雀商品判断,开始收集被篡改的价格,一个月后活动停止。应用负载下降58%,基础设施开支每月减少9.6万卢布。转化率在统计上没有显著变化;关于验证码的支持工单在两个月内共11个,受众为数十万访客。人工抽检的误报率为0.3%。
教训。数据投毒被证明是对付最执着爬虫的决定性因素,但之所以有效,是因为前面的层提供了高确信度的分类。
案例二:服务分类信息平台——保护联系方式和信息
情况。一个私人服务信息平台遭受大规模联系方式采集:服务者的电话进入垃圾数据库,用户投诉并流失。采集通过带可信指纹的可控浏览器、从住宅和移动地址进行;第一道防线几乎没用。
方案。重点放在第三道防线和数据保护。联系方式从HTML中移出,只在点击后通过带会话令牌的签名请求返回,每会话每小时有揭示次数限制,风险评分上升时提高工作量证明难度。已认证用户限额更高,游客更低。会话评分考虑交互:在未先滚动到联系方式、没有指针移动的情况下揭示联系方式会加分。验证码只对游客在一小时内第五次及以后的揭示。结果。可疑客户端的每会话联系方式揭示数从数百降到3到4个,之后会话被封禁。服务者关于垃圾信息的投诉一个季度内下降80%。真人用户的“查看信息—联系”转化率上升了4%——很可能是因为负载解除后页面变快了。
教训。当爬虫在指纹上与人无法区分时,救命的是改变数据交付模式本身:有价值的内容按操作、按配额、以递增成本提供。
案例三:B2B目录——误报成为主要问题
情况。一家工业零部件供应商在没有观察的情况下以严格模式启用了云机器人防护。两天内询盘下降35%。分析显示:公司客户使用共享地址的企业网络和过时浏览器,而且相当一部分流量来自企业通讯工具WebView,其TLS指纹非标准。系统把它们当成了机器人。
方案。回退到观察模式,两周校准,为关键客户的指纹和子网建立白名单,将企业网段切换到“只延迟和不可见挑战,绝不验证码”模式。另外为三家之前爬取目录供自己系统使用的经销商提供合作伙伴API。
结果。校准后一周内询盘恢复。机器人流量因经销商转向官方API和原始脚本被筛除而下降62%。误报低于0.2%。
教训。观察模式不是形式。而且一部分“爬虫”其实是你的合作伙伴,与其打仗,不如给他们API。
FAQ:复杂问题的回答
能否完全阻止爬取?
诚实的回答是:不能。如果数据对人公开可访问,对足够有动机的机器人来说技术上也可访问。防护的目标是让采集变得足够昂贵、缓慢和不可靠,从而失去经济意义。在大多数商业场景中这就够了:竞争对手以一天延迟、带一定错误率拿到数据,拿不到优势。
反机器人防护会伤害搜索排名吗?
如果做得不对,会:封掉搜索引擎机器人、给它们返回挑战而非内容,或者用图片渲染价格。正确构建的防护能识别合法机器人(通过声明的地址范围和反向DNS验证),无检查放行,并不为它们改变内容。每次策略变更后,用站长工具检查页面可见性。
如何在不封禁移动网络用户的情况下保护网站?
绝不要封禁移动网络中的单个IP;按子网或ASN以高阈值计算限制;依赖会话和行为信号,而非网络信号;对可疑客户端应用不可见挑战和延迟,而非验证码。务必从主要运营商网络中的真实移动设备测试防护。
应该自研防护还是采用现成平台?
取决于规模和团队。第一道防线和基础挑战可由一名开发者用两周实现,覆盖大部分原始机器人。带持续更新的行为评分实际上是一个独立产品,对于没有专门安全团队的项目,按年计算,现成平台通常更便宜。合理的路径是:从自己的基础措施开始,衡量剩余问题,然后再决定是否需要专业工具。
如何看待AI模型爬虫?
把它当作商业决策,而不只是技术问题。如果出现在AI助手回答中能给你带来受众——通过机器人规则允许抓取,不要妨碍。如果你的内容就是你的产品,被模型转述会剥夺你的流量——明确禁止并用技术手段支撑。守规矩的运营方会声明自己的爬虫并遵守规则,不守规矩的则和其他爬虫一样被纳入通用的网站反机器人防护。
向爬虫返回篡改数据合法吗?
技术上你有权在自己的资源上向不同客户端显示不同内容,但必须排除篡改信息成为与真实消费者交易依据的情形,也不得篡改法律要求如实披露的信息。只对分类确信度最高的会话应用投毒,对已认证用户关闭,并就你所在行业咨询律师。
防护需要多久更新一次?
阈值和例外——头几个月每周,之后每月。挑战和陷阱——每4到8周轮换一次,或在发现绕过时轮换。爬虫画像——每次流量格局明显变化时重审。浏览器自动化特征——每个浏览器大版本发布时。没有维护的防护会在一两个季度内退化。
如果是有大预算的大竞争对手在爬,怎么办?
把重心从封禁转向贬值和取证:金丝雀记录和水印会给你法律论据,数据投毒让到手的东西不可靠,限制返回深度让对手无法拿走完整目录。同时记录事件并评估索赔工作的前景——在有系统性违反使用条款采集的证据时,它往往比技术竞赛更有效。
如果预算和时间有限,从哪里开始?
花一天按日志做诊断。然后:带两个窗口的差异化速率限制、缓存昂贵页面、用令牌关闭JSON端点、隐藏链接陷阱和金丝雀商品。这套组合一周内几乎零成本实现,能筛掉大部分问题。之后——衡量并决定是否需要下一层。
结语:防护是过程,不是采购
如果要把所有内容归结为一句话,那就是:网站反机器人防护不是一个买来就忘的盒子,而是由三个协同层组成的系统及其持续校准的过程。网络层几乎免费地筛掉原始机器人。客户端验证抓住脚本和配置粗糙的自动化浏览器。行为分析和数据本身的操作让进阶爬虫的努力也变得毫无意义。而把这一切统一起来的是评分原则:不因单一特征摔门,而是累积弱信号并成比例地响应。
流程同样重要。实施前诊断、启用封禁前先观察、逐步扩大范围、防护指标旁放着转化指标、定期轮换——正是这些让成功项目有别于那些一周后因客户投诉而回滚的项目。还要记得地址背后的人:移动网络、企业代理和即时通讯工具WebView的用户是你的真实买家,防护必须通过对他们友好的测试。
今天就可以做的下一步:
- 导出过去一周的日志,回答诊断部分的问题。这免费,只花费几个小时。
- 计算机器流量在基础设施和收益损失上花了你多少钱。这个数字将决定预算。
- 按检查清单部署第一道防线:限制、缓存、请求头规则、API保护。
- 布置陷阱和金丝雀记录——它们会为你工作好几个月。
- 规划第二和第三道防线,分阶段推进,每一步都带观察模式。
- 建立防护维护日历,指定负责人。
你收集和创造的数据是资产。和任何资产一样,它值得与自身价值相称、且不妨碍它为之服务的那些人的保护。希望这份指南能成为你的书签,在从第一次查看日志到成熟、平稳运行的系统的每个阶段,你都会回来翻阅。