跳到主要内容
返回博客
Engineering2025-09-1816 min read

2026 年的现代网页抓取工程:Playwright、代理与反爬对抗

SP

Sarah Park

Head of Engineering

2026 年你抓的网,不是 2022 年你抓的那张网。Cloudflare Turnstile 大约盖在我们触碰的对外页面的 30%,Akamai BotManager 在首次请求时就能精确指纹无头浏览器,住宅 IP 代理 — 曾经是个灰色市场的可疑货 — 现在是六家充足资本厂商在卖的日用品。活变了。工具箱变了。法律覆盖也硬了。这篇是 Anvil 爬虫团队今天到底怎么干活的,带的是我们当初多希望有人替我们写下来的运维细节。

快速背景。Anvil 爬虫在 `services/crawler-engine/`。跑 20+ 个平台特化蜘蛛,覆盖小红书、抖音、微博、B 站、快手、知乎、淘宝、京东、拼多多、微信公众号、Instagram、TikTok、Twitter、Facebook、YouTube、LinkedIn、Reddit、Pinterest、Amazon、Shopify。输出是规范化的公开帖子记录,流式发到 Kafka,通过 Enrichment 和 Lead 服务接到平台其他部分。我们不登录。我们不抓任何付费墙后的东西。我们尊重 robots.txt。文章余下部分讲的是怎么做到这些而又不在第一天就被封。

为什么是 Playwright,不是 Puppeteer 或 Selenium

2026 年默认应该是 Playwright。三个原因。第一,stealth 默认更好 — Playwright 的 "playwright-stealth" 社区插件开箱就把最被指纹的属性(`navigator.webdriver`、`chrome.runtime`、`permissions.query`、插件枚举)打过补丁,Puppeteer-stealth 一直在落后。第二,多浏览器矩阵重要。某些平台已经发布特定浏览器引擎的指纹检测(Akamai 已知对 Chromium 和 Webkit 行为不同),Playwright 一行代码就能让你按 session 切引擎。第三,BrowserContext 模型是对的并发单位。一个 Chromium 进程能托管几十个隔离 context,各自有自己的 cookies、storage、proxy — 这干净映射到"多 session、多身份、一台服务器"。Selenium 在这个模式下每个 session 太慢。Puppeteer 做不了干净的隔离 context。

我们 staging 集群的真实数字。在一台 16 vCPU 的机器上,Playwright + Chromium 稳定撑 120 个并发 context,工作集 22GB。Puppeteer 同样硬件下最高 70 个 context,再多 context 之间就开始串台。Selenium 跑 20 个。每美元吞吐量 Playwright 领先足够多,迁移三周就回本。

2026 年的住宅代理市场

住宅代理不再是异类选项。每家认真的 lead-gen 平台都用。市场聚拢到四家主要供应商加一条长尾。我们测过 Bright Data、IPRoyal、Smartproxy、Decodo(原 Oxylabs proxies),还有两家小厂。规模上真正重要的差异:

  • 池子大小与新鲜度:Bright Data 在原始 IP 数上领先(声称 ~100M 住宅 IP),但新鲜度参差。IPRoyal 和 Smartproxy 声称的池子小些(~30-40M),但日轮换率更好。对侵略性 IP 黑名单的平台,新鲜度比池子大小更重要。
  • 定价模型:按 GB 是常规。2026 年的真实成本:住宅 $4-$8/GB,数据中心 $1-$2/GB(对宽松平台仍可用)。我们带图片屏蔽时每次页面加载约 0.4MB,一个月 1M 页面约 400GB,$2,000-$3,200 的住宅带宽。
  • 粘性会话:大部分平台现在要求一个 session 内 IP 稳定 — 会话中切就被挑战。粘性会话支持参差;Bright Data 和 Smartproxy 在"给我这个 IP 10 分钟然后轮换"这件事上 API 最干净。
  • 地理精度:对会地理检测的平台,你需要国家级有时城市级定位。Bright Data 地理覆盖最深;IPRoyal 在英语市场以外覆盖不均。
  • ISP 声誉:有些代理走的是被标"住宅"但其实是已知数据中心 ASN — 严肃 anti-bot 立刻抓出来。修复是向供应商要他们真实的 ASN 分布,不是只问"住宅"标签。靠谱供应商被推一下都愿意分享。

我们 Bright Data 当主,IPRoyal 当 failover,数据中心池给宽松目标。多供应商重要,因为任何单家都可能糟糕一周 — 我们看过一家供应商在某大平台推新指纹检查后的 48 小时里成功率从 95% 跌到 60%,唯一缓解是切。

真正起作用的指纹随机化

反爬厂商指纹几十个维度:TLS JA3/JA4 hash、HTTP/2 帧设置、canvas hash、audio context hash、WebGL renderer 字符串、WebRTC IP 泄露、字体枚举、navigator 时区、屏幕尺寸、hardware concurrency、device memory、语言列表,再加上百个更微妙的信号。你不能随机所有这些,否则一致性检查不过。技术活是挑一个连贯的 persona,在一个 session 期间坚持它。

我们的蜘蛛框架把 Playwright 包在 `PersonaContext` 里,捆绑一个指纹包:浏览器版本、操作系统、时区、语言、屏幕尺寸、硬件规格、字体、WebGL renderer、audio context。我们维护一个约 4,000 个 persona 的语料,采样自匿名化真实用户遥测(伙伴贡献的,不是偷的),让每个 persona 看起来像野外一台真机。蜘蛛挑一个 persona,在那个身份下跑 10-30 分钟,然后退役。一个 persona 不重用。

两个特定补丁对投入比的回报特别高:(a)把 `navigator.webdriver` 改成 undefined 并补 `chrome` 对象,让它看起来像真实用户 Chrome 安装而非 headless,(b)在任何敏感操作(像提交搜索表单)之前注入真实的鼠标抖动和滚动模式。反爬系统跟踪"用户最近 5 秒里是不是像人那样动了鼠标",从 `goto` 直接 `click` 的脚本会立刻触发挑战。

CAPTCHA:解、转、退

一旦你触发挑战,有三个选项。通过 2captcha、NopeCHA、CapSolver 这类供应商解。把 session 转到一个新身份重试。退一步停止打这个目标。我们三种都用,看平台。

  • 2captcha 之类:对大多数挑战类型都能解(图、hCaptcha、Turnstile、FunCaptcha)。2026 年平均解决成本:图类 $1-$3 每千次解,Turnstile $2-$4,FunCaptcha 更贵。延迟是真的 — 每次解 8-15 秒,限制吞吐。
  • 身份轮换:当平台挑战是指纹型而非人机验证型时,更便宜更快。退役 persona、拿新代理、重试。
  • 诚实退避:如果一个目标对超过 5% 的请求挑战,系统在告诉你"你打得太狠"。降并发。拉长调度。有时最便宜的修复是耐心。

一个实战启发:每个蜘蛛每小时有一个 `challenge_budget`。超了蜘蛛自动暂停。这防止"某平台反爬悄悄升级、解 captcha 的预算被烧光但什么也没解到"这个失败模式。

限流感知调度

幼稚的爬虫几分钟内就撞限流。好调度器把限流当一等公民。我们的调度器模型分三层。每目标 QPS 上限:任何单个蜘蛛对某个域名每秒发送的请求数硬上限。我们设得保守 — 一般每目标 0.5-2 QPS,绝不高过我们相信"如果这个平台有公开 API 它会允许"的水平。每账号预算:每个 persona 退役前一天能请求多少页有日额度。整队平滑:跨整个爬虫队伍,我们不想成为任何目标的最大单一流量来源,所以我们用一个按平台规模缩放的令牌桶整形聚合流量。

调度器实现成一个 Go 服务消费 RabbitMQ。蜘蛛拉活;调度器决定每个工作项何时合格。这种拉模型比"调度器派活"的推模型更耐震 — 拉模型里卡住的蜘蛛只是不再拉活,推模型里它会积压然后醒过来时被时序攻击。

Kafka backbone 流式结果

每个蜘蛛把结果发到一个按平台的 Kafka topic(`crawl.xhs.posts`、`crawl.douyin.posts` 等)。下游消费方 — Enrichment 服务、Lead 服务、Sentiment 服务、Analytics ClickHouse writer — 各自订阅需要的 topic。这个形状给我们:(a)下游服务有 bug 时的回放能力、(b)按平台吞吐隔离、(c)背压可见性、(d)在同一个 topic 上跑两个 consumer group 来 A/B 新规范化逻辑。

Topic 按 hash-of-(platform, account_id) 分区意味着一个账号的帖子永远落在同一个分区上,这为任何按账号分析保留顺序。原始 topic 我们保留 14 天,规范化后的 lead topic 无限保留。

合规覆盖:不再是可选项

2026 年的法律气候比三年前更严。我们把合规当架构,不是 checkbox。三条运营规则:

  • robots.txt:按蜘蛛遵守。我们不爬目标 robots 排除的路径。这让我们损失了一些数据,换来跟监管对话时能诚实。
  • GDPR Article 6:我们按合法利益运营,每个用例都有书面的平衡测试。每条线索记录带删除 token 让客户能履行数据主体擦除请求。个人数据默认 30 天保留,除非已转化。
  • 美国 CFAA:hiQ vs LinkedIn 之后的原则是"公开数据 OK,绕过认证不行"。我们从不登录、从不抓付费墙后、从不用凭据。CFAA 风险面保持窄。

客户问爬一个公开 profile 是不是"合法"。诚实答案是"看辖区、看数据、看用途、看你保留多久"。我们不是律师;我们的 DPA 写明了客户侧义务,新蜘蛛上线前我们把每个灰区问题过 Anvil 法务。如果你跑大规模,在你需要它之前把这个审核流程建起来。

生产里坏过什么(让你别重复)

过去 18 个月里教我们最多的四次事故。第一,Chromium 一次小版本升级移了我们的 TLS JA3 指纹,某平台连续三天挑战 40% 的请求。教训:钉浏览器版本,一次升一个平台地滚。第二,一家住宅代理供应商一夜之间轮了池子,我们的粘性会话逻辑断了,因为新 IP 通不过我们的 ASN 校验。教训:ASN 白名单需要优雅 fallback 路径。第三,流量高峰里的一次 Kafka rebalance 造成 6 分钟的重复帖子投递窗口,泄过去重逻辑,在 ClickHouse 产生了双行。教训:写入时去重,不是处理时去重。第四,一个面向小平台的新蜘蛛被网络层 ban 了(供应商封了我们的 IP 段,不只是 session),因为我们没把初次爬错峰。教训:ramp-up 曲线是蜘蛛定义的一部分,不是运维事后。

经济账,简短版

跑这套栈花钱。Anvil 体量 — 20 个蜘蛛大约每月 12M 页面加载 — 的科目是:住宅带宽 ~$3,200、数据中心带宽 ~$280、captcha 充值 ~$180、Kafka 和 ClickHouse 基础设施 ~$1,400、计算 ~$2,800、监控 ~$600。每月总共大约 $8,500。过去两年成本上涨了大约 35%,主要驱动是住宅带宽涨价和 Turnstile 类挑战更广泛的铺开。我们预期 2026 年再涨 20%,因为更多平台上 ML 检测。

什么会让这变简单

我们建的几乎所有东西都是对"没有合理公开 API"的绕过。如果平台出价格合理、限流合理、条款合理的 API,我们明天就关 80% 的爬虫基础设施。它们不会出,因为控制 API 是它们捕获价值和限制竞争对手的方式。所以我们围绕这种缺失工程化。

如果你在搭自己的爬虫,我能给的最高杠杆建议:在优化之前投入可观测性。建一个仪表板,在一个页面上显示每平台成功率、captcha 率、p50 延迟、带宽成本。那个仪表板会在平台改东西时告诉你,而平台每两周改一次东西。没有它,你在黑着调试。有它,你能从"被封了,怎么办"挪到"早发现了、客户察觉之前能适配"。

2026 年的爬虫是成熟的工程活。不光鲜、不法律零风险、需要真实的运营纪律。做好了,它产出你 lead pipeline 里最新鲜的数据,以及对付那些只靠购买数据库的对手的最强护城河。做差了,产出律师函和客户信任事故。差别是工程投入。

SP

Sarah Park

Head of Engineering

热爱 AI 与增长,致力于通过智能自动化帮助品牌发现下一位客户。专注于 AI 与数字营销交叉领域的写作。

想看看 Anvil 实际怎么用?

立即用 AI 获客。无需信用卡。

开始免费试用