蜘蛛抓取页面时,第一步不是看内容,而是看服务器返回的状态码。状态码决定了这次抓取是成功、失败,还是需要稍后再来。不同状态码会让蜘蛛调整对站点的抓取节奏,有的只是临时降速,有的则会让 URL 从待抓队列里消失。
5xx:服务器错误会让抓取变保守
500、502、503、504 这类 5xx 状态码,通常代表服务器临时无法正常响应。蜘蛛遇到 5xx,不会马上把页面判为无效,但会把这轮抓取标记为失败,并在一段时间后重试。
如果 5xx 只是偶尔出现,影响有限。但如果同一目录下多个 URL 连续返回 5xx,蜘蛛会认为这个站点或这个目录暂时不稳定,降低抓取频率,把抓取额度让给其他更稳定的站点。
持续性的 5xx 比单次超时更麻烦,它会让蜘蛛在后续调度中把站点归到“暂缓”一类。
503 与 Retry-After:主动限流的正确用法
503 可以配合 Retry-After 响应头使用,告诉蜘蛛多久之后再来。如果站点正在维护、回源压力大,或者需要临时限流,返回 503 加 Retry-After 比直接返回 200 空页面或 500 更清晰。
- Retry-After 可以是秒数,也可以是 HTTP 日期。
- 时间设置要合理,过长会让页面更新延迟被感知。
- 维护结束后及时恢复 200,不要长期挂着 503。
429:请求过多时的限速信号
429 表示请求频率超过了服务器允许的范围。蜘蛛收到 429 后,通常会降低对该站点的并发请求数,并稍后重试。如果站点确实有抓取压力,可以在服务器层面对已知蜘蛛做合理限速,但不要用 429 覆盖所有正常抓取。
频繁误报 429 会让蜘蛛认为站点容量不足,减少总体抓取量。尤其是 CDN 或 WAF 规则配置过严时,真实蜘蛛也可能被拦截。
403 与 401:被拒绝的抓取
403 表示服务器理解请求但拒绝执行,401 表示需要认证。蜘蛛遇到这两个状态码,通常不会反复尝试,而是把 URL 标记为不可访问。如果页面本来是公开内容,却因为防火墙、防盗链或权限配置返回 403,就等于主动把蜘蛛挡在门外。
404 与 410:明确告诉蜘蛛页面没了
404 和 410 都表示资源不存在,蜘蛛会逐步把这类 URL 从抓取队列中移除。区别在于 410 更明确地表示“永久删除”。如果页面只是暂时下线,不要用 404 或 410,否则蜘蛛可能较快放弃回爬。
301 与 302:跳转消耗抓取路径
301 是永久跳转,蜘蛛会把权重和抓取路径转移到新地址。302 是临时跳转,蜘蛛通常仍会保留原 URL 并继续观察。多跳重定向会额外消耗抓取预算,能一次跳到位就不要串成三跳。
怎么减少状态码带来的抓取波动
- 监控服务器日志里蜘蛛请求的返回码分布,重点看 5xx 和 429 的比例。
- 检查 CDN、WAF、负载均衡是否对蜘蛛误拦截。
- 数据库或后端超时导致的 5xx,优先解决慢查询和连接池问题。
- 维护窗口尽量短,并用 503 加 Retry-After 代替直接断服务。
- 页面永久迁移用 301,临时调整用 302,不要混用。
对蜘蛛来说,稳定返回 200 的站点比偶尔很快、偶尔报错的站点更值得信任。抓取节奏不是靠单次响应速度决定的,而是靠长期状态码记录累积出来的。