URL 被写进 Sitemap、内链也挂上了,并不代表蜘蛛一定能顺利拿到内容。在“发现”和“抓取”之间,还隔着一次真实的 HTTP 请求。这次请求能不能成功、耗时多久,很大程度上由站点的服务器状态决定。抓取路径上的稳定性问题,往往不是一次性故障,而是持续的小抖动,慢慢让一批 URL 长期停在“已发现、未抓取”的状态。
蜘蛛怎么理解一次失败
同样是抓取失败,在蜘蛛眼里的含义并不相同。
- 5xx:服务器端问题。通常被视为临时状态,蜘蛛会降低这段路径的抓取频率,稍后再试;持续出现则可能让整个目录被标记为不稳定。
- 429 或带 Retry-After 的 503:明确的限速信号。蜘蛛一般会遵守等待时间,但等待期间它不会原地不动,而是先去抓别的 URL。
- 连接超时、TLS 握手失败:连响应都拿不到,蜘蛛无法区分是网络问题还是站点问题,只能保守后退。
- 403:多半是 WAF 或防爬策略把蜘蛛挡在外面。这类拦截经常是规则误伤,普通浏览器能打开,蜘蛛却一直拿到 403。
把这几类状态分开统计,比笼统地看一个“抓取失败率”更有意义。一次 5xx 抖动可以忽略,连续一周的 403 才是真正在消耗 URL 被发现的机会。
抖动通常从哪来
- 发布瞬间:批量发文章、清缓存、重启服务,几秒内出现大量 502。
- 数据库或接口超时:动态页面在高峰期响应时间从几百毫秒涨到数秒。
- CDN 回源失败:边缘节点有缓存时一切正常,偏偏回源那一次赶上源站异常。
- 限速阈值过低:把正常抓取和恶意请求一起限掉。
这些问题的共同点是:人工访问几乎察觉不到,但蜘蛛是批量、并发、持续地访问,撞上异常的概率被放大很多倍。
限速是为了让抓取持续,而不是让抓取停止
担心抓取压力是合理的,但处理方式值得斟酌。直接返回 403 或直接断连,会让蜘蛛难以判断该以什么节奏回来;返回 429 并给出 Retry-After,反而是一种更清晰的沟通。允许蜘蛛以较低频率稳定访问,长期看通常比“高峰封禁、低谷放开”更划算,因为稳定的节奏能让新 URL 更快进入待抓队列。
CDN 与缓存层:蜘蛛看到的是哪一层
接入 CDN 之后,需要先确认蜘蛛拿到的到底是什么:是缓存好的静态结果,还是每次都回源。如果缓存命中率偏低,蜘蛛的每次请求都会打到源站,压力比预想中大得多。另外,如果缓存层对爬虫 UA 做了特殊处理,比如强制回源或返回验证码页,抓取路径就和真实用户体验完全脱节,日志里的状态码也会失真,后续分析会被带偏。
站点可以先检查的几件事
- 按小时统计日志里的 5xx 比例,看是否集中在固定的发布时段。
- 确认爬虫 UA 是否被 WAF 规则命中,用真实 UA 发一次请求做对照。
- 检查 CDN 对爬虫的缓存策略与回源配置。
- 给动态页面加缓存或降级方案,避免高峰期整页超时。
- 关注响应时间的 P95,而不只是平均值。
抓取预算不是被谁抢走的,很多时候是被一次次超时和失败慢慢耗掉的。稳定的响应,比偶尔很快的响应更有价值。
小结
URL 发现只是入口,真实抓取才是内容进入索引的门槛。把服务器抖动、限速策略和缓存层这三处看清楚,蜘蛛的抓取路径会顺畅不少。这不是一次性的优化,而是需要跟着发布节奏和流量变化持续观察的事情。