2026 年网页抓取最佳实践:一线工程师指南
在构建并维护 15 款生产级爬虫、服务超过 3,100 位用户、成功率保持 >99% 之后,以下是真正重要的实践经验。
架构:把爬虫当管道来设计,而不是脚本
我见过最大的错误,就是把爬虫当成单步骤流程。生产级爬虫其实是数据管道:
- URL 发现——找到要抓取的目标(sitemap、分类页、搜索、API)
- 请求执行——通过恰当的重试与轮换机制获取数据
- 解析——从原始响应中提取结构化字段
- 规范化——清洗、校验并统一输出格式
- 存储——写入数据集、数据库或下游系统
每一步都应该可以独立测试、独立重试。当 Sephora 修改商品详情页布局时,只需要更新第 3 步——管道的其余部分保持不变。
永远优先选择 API,而非 HTML 解析
在写下第一个 CSS 选择器之前,先检查目标网站是否具备:
- 公开 API——有文档记录、返回 JSON 的端点
- 私有 API——在浏览器 DevTools 中可见的 XHR/fetch 调用
- GraphQL 端点——越来越常见,往往开启了 introspection(内省)
- 内嵌 JSON——HTML 中的
__NEXT_DATA__、window.__INITIAL_STATE__或 JSON-LD
API 响应结构化、带版本号,比 HTML 布局稳定得多。我的 Sephora 爬虫会把每一个网页 URL 都转换成 API 调用——从未因为前端改版而失效过。
代理策略:与防护级别相匹配
不是每个网站都需要住宅代理。以下是我的决策框架:
| 防护级别 | 代理类型 | 示例网站 |
|---|---|---|
| 无 / 基础 | 数据中心代理 | 大多数 Shopify 商店、小型网站 |
| 速率限制 | 轮换数据中心代理 | 中型电商、内容类网站 |
| 指纹识别 | 住宅代理 | Sephora、Farfetch 等知名品牌 |
| 高级 WAF | 住宅代理 + TLS 指纹伪装 | Akamai、Cloudflare 企业版 |
核心洞察:代理成本随防护级别同步上升。不要在只检查 IP 信誉的网站上浪费钱购买住宅代理。我的 Shopify 爬虫用数据中心代理就能正常工作,因为 Shopify 的默认防护非常薄弱。
会话管理决定一切
60% 和 99% 成功率之间的差距,往往就在于会话管理:
- 轮换的是会话,而不只是 IP——用新 IP 搭配旧 cookie 反而显得可疑
- 预热会话——在访问商品页之前先访问首页
- 遵守速率限制——5 个并发请求跑通,胜过 50 个并发被封
- 指数退避——按 1 秒、2 秒、4 秒、8 秒的间隔重试,而不是立即重试
我的 Sephora EU 爬虫通过自动刷新与指数退避来管理访客令牌,维持着与真实浏览模式相符的持久会话。
规范化你的输出
抓取到的原始数据往往很杂乱,需要对一切进行规范化:
价格
以整数形式存储(单位为美分,而非美元)。$29.99 会存为 2999。这样可以避免浮点精度误差污染下游财务数据。我的每一个电商爬虫都遵循这一约定。
URL
始终存储绝对 URL,禁止使用相对路径,在提取阶段就完成解析。
日期
使用 ISO 8601 格式(2026-04-01T00:00:00Z),并始终携带时区信息,禁止存储按地区习惯格式化的日期。
文本
去除多余空白,规范化 Unicode 编码,并明确 HTML 处理策略(去除标签还是保留格式)。
错误处理:预设失败会发生
生产级爬虫会持续遭遇失败——问题在于失败得是否体面。我的做法:
1Request fails (network error, timeout, 4xx/5xx)
2 → Retry with exponential backoff (up to 5 attempts)
3 → Rotate session/proxy on retry
4 → Log failure with full context if all retries exhausted
5 → Continue processing remaining URLs (don't crash the batch)
按 URL 模式追踪成功率。如果 /category/* 页面的成功率突然跌破 90%,多半是网站改了什么——这样你能在用户反馈之前就先发现问题。
监控与告警
没有监控的爬虫,迟早会在无人察觉的情况下悄悄失效。需要追踪:
- 成功率——按每次运行和每种 URL 模式统计
- 输出数量——骤降往往意味着出了问题
- 数据质量——空字段、异常值、schema 违规
- 成本——代理用量、计算时间、存储空间
我的所有 Apify Actor 都会暴露这些指标。一旦成功率下滑,我会在几小时内收到通知——往往早于任何用户察觉。
从简单开始,按需增加复杂度
我构建的每一个爬虫,都从能跑通的最简方案开始:
- 先用 HTTP + Cheerio(最快、最省钱)
- 只有被封锁时才加入指纹伪装
- 只有必须渲染 JavaScript 时才加入浏览器渲染
- 只有遇到速率限制时才加入代理轮换
我的 Ulta 爬虫纯用 Cheerio 实现——完全不需要浏览器。我的 Universal Web Printer 则使用 Playwright,因为它必须渲染 JavaScript。为任务选择合适的工具。
这些都不是纸上谈兵的理论——而是从处理数百万级请求的生产级爬虫中提炼出来的实战经验。如果你需要一个按这些实践标准打造的定制爬虫,联系我。