数据抓取

如何抓取重度防护的站点:从朴素请求到全隐身的升级阶梯

别把每一次抓取都跑成最高隐身。把力气匹配到目标:先用一个朴素客户端加一个干净 IP,只有当一个站点逼你时才往上爬。

Chris Collins

Chris Collins

2026年8月12日 · 1 分钟阅读

关于抓取受保护站点的大多数建议,读起来像是你得把每一样技术一次性全用上:一个 headless 浏览器、一份伪造的指纹、行为节奏,全套。你并不需要,而默认就去够全套,本身就是一个错误。有些目标不哼一声就给你一个朴素的 GET;另一些在页面加载之前就封掉一个脚本库。把高成功率和一堆封锁加浪费掉的算力区分开来的那门本事,不是知道某一个巧妙的诀窍,而是校准:用那个能可靠地清掉某个给定目标的、最不花哨的方法,并且只有当站点逼你时才往上爬。

把它想成一架梯子。每一级击败一层更强的防御,也更贵去跑。这就是那张把各项单独的技术——朴素客户端、TLS 模仿、真实浏览器、全隐身——绑成一个决定的地图:这个目标究竟需要哪一级?

为什么校准胜过最大努力

有两个失败模式框住这件事。用力不足是显而易见的那个:拿 requests 去打一个重防守的站点,你会被瞬间封掉,而再多的重试也没用。用力过度则是更安静、更常见的浪费:拿一整支带着受管指纹的浏览器机队,去打一个本来一个简单 HTTP 调用就会回应的站点。那会花掉你的吞吐、带宽、基础设施和可靠性——一个浏览器更慢、更重、有多得多可能坏掉的地方——全都为了解决一个目标从没提出过的问题。

正确的姿态是:从便宜开始,按证据升级。用那个管用的最低一级,让目标自己的响应告诉你何时该往上,并在一个站点变容易时再退回去。力气应当跟着你真正遇到的防御走,而不是跟着你想象的最坏情况走。

第 0 级:一个朴素 HTTP 客户端加一个干净的住宅 IP

这能应付网络的大部分。一个扎实的 HTTP 客户端——requests、httpx、或你所用语言的等价物——经由一个干净的住宅 IP,能清掉任何以 IP 信誉和基本请求合理性为主要防御的站点。加上那些让你看起来寻常的卫生:真实的请求头、一个明智的按主机速率、遇到 429 就退避,以及负责任抓取的基本功

这一级上最大的杠杆,是 IP 信誉。一个干净的住宅地址能让你越过那些把数据中心流量当场拦住的信誉检查——而它正是为什么如此多”受保护”的站点,最后发现除了这个别无所需。为每一个目标都从这里开始。它是最快、最便宜、最可靠的选项,也常常是你唯一需要的那一级。

第 1 级:一个模仿 TLS 的客户端

当第 0 级被瞬间封掉——在页面还没加载之前——而轮换 IP 又不管用时,往上爬到这里。那个特征指向一次客户端层的封锁:你的握手正在被做指纹。正如 TLS 与 HTTP/2 指纹里所讲,一个脚本库的 TLS ClientHello 和 HTTP/2 设置和一个浏览器的毫不相像,而许多反爬系统单凭这一点就拒掉连接。

修法不是一个完整浏览器,而是一个模仿 TLS 的 HTTP 客户端(curl_cffitls-clientutls 之类),它呈现一个真实浏览器的网络指纹、同时仍是一次轻量的 HTTP 调用。它击败了那个拦住第 0 级的指纹,而只多花一点点成本。在跳到一个浏览器之前先够它,因为它无需浏览器的开销就清掉了一整层防护。

第 2 级:一个真实的 headless 浏览器

当内容是用 JavaScript 渲染的、藏在交互之后的,或者当目标在网络层之外做指纹时,往上爬到这里。一个真实浏览器——Playwright、Puppeteer 或 Selenium——会执行页面的 JavaScript,并且按定义,带着一个真实浏览器的 TLS、HTTP/2 和 DOM。它能应付一个朴素或模仿客户端根本对付不了的那些站点,因为不跑脚本就没有页面。

代价是实打实的:一个浏览器很吃内存,相较一次 HTTP 调用也慢,所以这一级正是吞吐下跌、基础设施膨胀的地方。靠拦掉你不需要的资源(图片、字体、媒体)以及复用一个长生命周期的浏览器、而不是每个请求启一个,来钝化这份成本。别只因为一个站点”重要”就爬到这里;爬到这里,是因为不经一个渲染过的页面、数据就真的不存在。

第 3 级:一个带指纹与行为隐身的浏览器

最高的一级,是给最难的目标的——那些连一个原味 headless 浏览器都要标记的。在这个层级,站点在审视设备指纹(headless 的破绽、canvas、navigator 的怪癖)和行为(鼠标移动、时序、交互模式)。穿过它,意味着像一个反检测浏览器那样管理指纹、给每个身份一个连贯而独特的配置文件,并把交互的节奏放缓到看起来像人、而不是瞬时。那些触发检测的错误全都住在这一级。

这是最贵也最脆的选项——而这恰恰是为什么它应当是最后手段、而不是默认。大多数抓取从不需要它。当一个目标真的需要时,是因为每一个更便宜的级别都已试过、并且以证据表明它失败了。

每一级上的那个常量:IP

这架梯子讲的是客户端的花哨程度,但有一样东西在你往上爬时并不改变:每一级底下仍然需要一个干净的住宅 IP。一份来自被标记或数据中心地址的完美浏览器指纹,无论它上面的一切多有说服力,都会在网络层被抓住。而会话的一致性在每一层都要紧——对任何应当看起来像一个连贯访客的东西用粘性会话,当你身处一个登录之后时用认证会话的功夫。IP 和会话,是这整架梯子所立足的地基;那些级别只决定其上坐着多少客户端的花哨。

怎么往上爬:让失败告诉你

这架梯子的意义在于:你不猜你的级别,你去诊断它——因为把失败读对会精确地告诉你卡在哪儿:

  • 被瞬间封掉、轮换 IP 什么也不改变,但一个模仿 TLS 的客户端管用:你卡在客户端指纹这一层。第 1 级。
  • 请求成功了,但内容缺失或为空、因为它是用 JavaScript 渲染的:你需要一个真实浏览器。第 2 级。
  • 浏览器一开始管用、但随时间被挑战或标记:设备指纹或行为出卖了你。第 3 级。
  • 大多数时候管用、只有某些 IP 被挑战:那根本不是级别问题,是 IP 信誉。修池子,别往上爬。

按那份证据升级,也去降级:如果一个目标松了,退回一个更便宜的级别、把吞吐夺回来。这正是按目标监控之所以要紧——它告诉你哪些目标在往上爬、哪些已经松动,好让你的力气跟着现实走、而不是跟着假设。

按目标分配级别,而不是按项目

最后一条原则,是最省钱的那条:级别是按目标的、不是按管线的。一次爬取可能触及一百个站点,其中九十五个在第 0 级就很满意、五个需要一个浏览器。为了迁就那五个而把整次爬取都跑在第 2 级,是压在那九十五个头上的一笔巨大而不必要的税。一条搭建良好的管线,会为每个目标记录一个级别、把新目标默认放在第 0 级,并且只有当某个特定目标失败时才升级它——理想情况下是自动的。结果就是最好的”成功率对成本”之比:每个目标都在那个能可靠清掉它的最便宜级别上被处理,没有一处是过度搭建的。

底线

抓取重度防护的站点不是一门技术,它是一架梯子——而赢家不是那些把一切都跑成最高隐身的团队。他们是那些把力气匹配到每个目标的:从第 0 级、用一个朴素客户端加一个干净的住宅 IP 开始,爬到一个模仿 TLS 的客户端,再到一个真实浏览器,再到全隐身——只随着目标自己的响应逼出每一步,并把一个干净的 IP 和一致的会话作为底下的那个常量。从失败去诊断级别,按目标分配级别,并在一个站点松动时降级。

把这些做对,你的成功率上升、而你的成本下降——因为你不再为 HTTP 的问题去付浏览器的价钱。锚定每一级的那些住宅代理按 GB 计价的,所以这架梯子所奖励的那种有纪律、经校准的做法,也正是让你花得最少的那一种。

准备好开始了吗?

试用 Shifter 住宅代理,205M+ 个 IP,195+ 个国家,低至 $0.75/GB。

立即开始