核心要点
- 请求会同时在多个层面接受评估——互联网协议地址声誉、传输层安全协议指纹、超文本传输协议第二版特征、请求头以及浏览器驱动方式——任何一项不达标都足以导致返回 403 禁止访问状态码。你的笔记本电脑能够通过验证,是因为所有层面都与真实的家庭浏览器行为一致;而服务器通常会改变其中一项(通常是互联网协议地址),这种不一致性就会暴露身份。
- 没有挑战页面的 403 错误几乎总是意味着你在网络层(互联网协议地址/自治系统号码声誉或传输层安全协议/JA3 指纹)就被拦截了,此时甚至尚未提供任何超文本标记语言内容——这并非凭据错误或速率限制问题,因此“添加用户代理字符串”或“降低请求速度”无法解决此问题。
- 真正有效的修复顺序是:弃用数据中心互联网协议地址(改用住宅或互联网服务提供商代理)、匹配真实浏览器的传输层安全协议指纹,并且仅针对确实需要 JavaScript 的页面启动真实浏览器的隐蔽模式——应逐步升级手段,而不是一开始就使用浏览器。
- 代理仅能更改你的互联网协议地址;Linux 虚拟专用服务器仍然会泄露具有 Linux 特征的传输层安全协议/JavaScript 指纹,因此“住宅互联网协议地址 + 数据中心其他所有配置”是一种真实家庭机器绝不会出现的矛盾组合——这就是为什么经过代理的服务器比你的笔记本电脑更容易被封锁的原因。
你的网络爬虫在笔记本电脑上运行完美。当你将其部署到虚拟专用服务器或持续集成运行器时,代码未做任何更改,但突然每个请求都返回 403 状态码。这感觉像是一个漏洞——因为代码完全相同——但通常并非如此。反机器人系统会同时根据多种信号对请求进行评判,而从家庭机器迁移到数据中心会同时改变其中的几项信号。
本文将详细分解究竟哪些信号发生了变化,如何判断是哪一项阻止了你,以及如何修复这些问题——旨在实现对公共数据的授权访问(我们将始终秉持这一诚实立场;本文内容不涉及绕过安全防护措施)。
请求评判分为两个阶段
了解检测分为两个阶段会有所帮助:
- 第一阶段——在提供任何超文本标记语言内容之前。 互联网协议地址声誉、传输层安全协议握手、超文本传输协议第二版设置以及请求头顺序都会在连接本身上接受检查,这一过程是被动且低成本的,甚至在您的请求被完全读取之前就已进行。
- 第二阶段——仅在第一阶段通过后才进行。 页面中的 JavaScript 运行并检查浏览器应用程序接口、画布/WebGL 以及行为特征。
来自数据中心的请求通常会在第一阶段失败——这就是为什么你会收到没有挑战页面的静默 403 错误,而不是验证码。这一单一观察结果是你最好的初步诊断依据:
403 错误且无挑战页面 → 你在网络层(互联网协议地址或传输层安全协议)验证失败。 出现挑战或验证码页面 → 你通过了网络层验证,但在浏览器/行为检查中失败。
为何相同代码在服务器上返回 403 错误
1. 互联网协议地址声誉——最大的单一原因
反机器人系统在最初几毫秒内就会对你连接的自治系统号码进行分类。主要的云服务和托管网络——亚马逊网络服务、谷歌云平台、微软 Azure、Hetzner、DigitalOcean、OVH,以及 GitHub Actions 和 Vercel 背后的持续集成/无服务器范围——都会被立即预先标记。而住宅和移动互联网协议地址则不会。
互联网协议地址声誉是每家主要供应商都使用的唯一信号,几家供应商甚至在提供 JavaScript 挑战之前就会屏蔽数据中心自治系统号码。残酷的事实是:在干净的住宅互联网协议地址上运行的普通超文本传输协议客户端,其表现通常优于在被标记的数据中心互联网协议地址上运行的完美修补浏览器。你的笔记本电脑使用的是住宅互联网协议地址;而你的服务器不是。仅这一点就解释了大多数“本地运行正常,服务器上返回 403 错误”的情况。
2. 传输层安全协议指纹识别(JA3 / JA4)
传输层安全协议握手本身就能识别客户端身份。
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。