详解
限速是服务器保护自身免受滥用的方式。每个面向公众的 API 和网站都会限制单个客户端在一个时间窗口内可以发送的请求数量,例如"每个 IP 每分钟 100 个请求"、"每个 API key 每小时 5000 个请求"、"每个账户每天 30 次登录"。当客户端超出上限时,服务器会返回 429 Too Many Requests 响应(在某些情况下也可能悄悄降低响应速度、将请求加入队列,或开始提供 CAPTCHA)。
对于爬取和数据采集工作负载而言,限速是决定运行速度的操作基准。简单粗暴的解决方案——减少请求数量——会限制你的吞吐量。真正的解决方案是将请求分散到多个标识符(IP、账户、session ID)上,使得没有任何单个标识符超出其上限。这正是住宅代理作为一个产品类别存在的根本原因。
服务器端限速算法有几种形式。令牌桶算法允许客户端以稳定的速率积累令牌,直至达到上限,从而允许不超过上限大小的突发请求。滑动窗口算法在一个移动的时间窗口内统计请求数量,使上限更加平滑。固定窗口算法在时钟边界(每分钟、每小时)重置计数。每种算法对爬虫应如何控制请求节奏都有不同的影响。
工作原理
每次收到请求时,服务器会识别客户端(通过 IP、API 密钥、账户 ID 或会话令牌),并检查当前窗口内该标识符对应的计数器。如果计数器未超过限制,请求将被放行,计数器随之递增。如果计数器超过限制,服务器将返回 429 状态码,并附带 `Retry-After` 响应头,指示需要等待的时长。
大多数大型 API 会组合使用多种标识符:相同的 IP 和账户会触发不同的计数器,并对应不同的限制。例如,Cloudflare 的限流规则可以按 IP、URL 路径、会话或任意组合来设定限制范围。一些高级系统还采用漏桶算法或滑动窗口计数器的变体,以实现更平滑的流量控制。