选择用于抓取的代理,其实是关于目标网站的问题,而不是关于代理本身的问题。没有防护的网站和处于DataDome防护之下的网站需要完全不同的配置,对前者使用住宅代理的价位是浪费钱,对后者使用数据中心IP则是浪费时间。
本指南将介绍哪种代理类型适合哪种抓取任务,如何运行它们而不被封锁,以及在什么情况下抓取API比原始代理更合适。
四种类型,针对抓取场景
| 类型 | IP来源 | 速度 | 封锁率 | 成本 | 最适合的抓取任务 |
|---|---|---|---|---|---|
| 数据中心 | 主机托管商 | 最快 | 在有防护的网站上较高 | 最低 | 无防护网站、API、批量抓取 |
| 住宅 | 消费者ISP,真实家庭 | 中等 | 低 | 中等,按GB计费 | 零售、旅游、搜索,以及任何有防护的场景 |
| ISP | 消费者ISP,数据中心托管 | 快 | 低到中等 | 按IP按月计费 | 已登录会话、长时间运行的任务 |
| 移动 | 移动运营商 | 中等到较慢 | 最低 | 最高 | 最难攻克的目标、应用API |
有一点需要纠正,因为相反的说法被广泛传播,本文之前也重复过这个错误:数据中心IP并不是由ISP分配的。它们注册在主机托管商和云服务商名下,根本不会经过消费者互联网服务商。这正是它们容易被识别的原因:其IP段是公开的,网站可以一眼就将其归类。
ISP代理和移动代理对抓取来说都很重要,但通常在这类对比中被忽略。只要抓取涉及登录,ISP代理就是答案,因为其地址保持不变。移动代理则是在其他方法都失效时的最后手段,用于对付最难攻克的目标。
轮换与会话处理
在保持不被封锁方面,轮换策略比代理类型更重要。
按请求轮换为每次请求提供一个新IP。这是收集独立页面(如商品列表、搜索结果、目录条目)时的正确默认选择。没有任何单一地址会积累可疑的模式。
粘性会话在设定的时长内(通常为1到30分钟)保持同一个IP。当请求之间相互依赖时应使用此方式:携带游标的分页、登录后的操作、多步骤的结账流程。如果会话在进行中途更换IP,看起来就像账号被盗,从而触发验证挑战。
实用规则是:除非流程中某个环节需要连续性,否则按请求轮换;如果需要连续性,则保持能覆盖该环节的最短粘性窗口。
请求速率与并发数
大多数封锁是由速率而非代理类型引起的。一个住宅IP每秒请求网站20次,比一个数据中心IP每10秒请求一次更明显是自动化行为。
- 单IP速率。 在有防护的网站上,让每个地址保持大约每2到5秒一次请求。在无防护的网站上,你可以更激进得多。
- 并发数。 总吞吐量等于并发地址数乘以单IP速率。要安全地达到每秒10次请求,你需要大约30到50个地址同时运作,而不是让10个地址速度提高三倍。
- 随机化。 固定的间隔本身就是一种特征标志。加入抖动,使间隔时间产生变化。
- 失败时退避。 当错误率上升时,应放慢速度而不是加大重试力度。在被封锁的情况下继续重试,正是软性速率限制演变为硬性封禁的原因。
请求头与指纹
IP能让你到达门口。但请求本身也必须在到达后看起来正常。
- 发送完整、连贯的请求头集合。 真实浏览器会以一致的组合方式发送
Accept、Accept-Language、Accept-Encoding、User-Agent和Sec-Ch-Ua。在一个几乎空白的请求中只有一个User-Agent,是一个明显的机器人特征。 - 保持请求头信息与IP的一致性。 一个德国IP发送
Accept-Language: en-US,在你进行地理定位时,这是一个值得避免的不匹配。 - 让TLS和HTTP行为与你声称的客户端相匹配。 高级系统会对TLS握手和HTTP/2帧顺序进行指纹识别,因此一个自称是Chrome的Python客户端无论请求头如何设置都会被检测出来。
- 在页面需要时使用真实浏览器。 通过JavaScript渲染内容的网站需要无头浏览器,而无头浏览器本身也有需要管理的指纹特征。
现代反机器人系统
Cloudflare、DataDome、PerimeterX和Akamai并非简单的IP黑名单。它们会综合评分地址信誉、请求指纹、行为模式以及JavaScript验证挑战的结果。
这带来了两个后果。仅仅轮换IP并不能击败它们,因为你的指纹并未改变。而住宅IP是必要但不充分的条件:它消除了最容易被识别的信号,但留下了更难处理的部分。
当你遇到这种情况时:
- 认真解读响应内容。 带有验证挑战页面的403与429速率限制是不同的,需要不同的解决方法。要检查响应正文,而不仅仅是状态码。
- 先放慢速度。 速率是最容易调整的因素,往往也是真正的原因。
- 沿信任阶梯向上移动。 从数据中心到住宅,从住宅到移动。
- 渲染验证挑战。 如果网站需要执行JavaScript,那么无论使用哪种IP,纯HTTP客户端都永远无法通过。
- 重新考虑方案。 如果某个目标在重试上花费的成本超过了数据本身的价值,托管API会比继续硬扛更划算。
成本、量级以及何时使用API
估算一个项目要从页面大小开始。典型的HTML页面为0.5到2 MB,因此100,000个页面大约相当于50到200 GB。渲染JavaScript会使这个数字增加数倍,因为你还要拉取脚本、样式表和图片。
真正决定账单金额的是封锁率。一个失败率为40%并进行重试的配置,会为该带宽支付两次费用。失败率高的廉价代理,其每个成功页面的成本往往比昂贵代理更高。
当你能够掌控抓取器、了解目标网站,并希望获得最低的单位成本时,原始代理是正确的选择。当目标网站强力反制、或者你原本需要维护浏览器指纹和验证挑战求解器、又或者工程时间比资金更稀缺时,托管API是更好的选择。
Shifter的Web Scraping API在单一请求背后处理代理轮换、JavaScript渲染和验证挑战,而SERP API专门为搜索结果提供同样的功能,搜索结果原本是维护起来较为棘手的目标之一。对于原始代理而言,住宅代理和ISP代理分别覆盖了会话问题的两端,当前费率可查看定价页面。
简要决策框架
- 目标没有反机器人防护,且你需要低成本获取大量数据:数据中心代理。
- 目标进行速率限制或验证挑战,不涉及登录:轮换住宅代理。
- 抓取需要已登录的会话,或必须保持同一身份:ISP代理。
- 目标能够击败住宅代理,或你需要应用层级的访问权限:移动代理。
- 目标的维护成本超过数据本身的价值:抓取API。
大多数实际项目会混合使用这些方式。数据收集运行在轮换住宅代理上,少数需要身份验证的仪表盘运行在ISP代理上,而那个难以攻克的目标则通过API来处理。
结论
用于抓取的代理没有单一的最佳选择。要根据目标的防护强度来匹配代理类型,根据请求之间是否相互依赖来匹配轮换方式,并且当出现封锁时,把请求速率作为首先要调整的因素。