蜘蛛抓取一个 URL 时,第一步不是解析内容,而是看服务器怎么回答。状态码是这次请求的结论,也是决定它下次还来不来、什么时候来、会不会顺着这个地址继续走的输入。很多抓取上的别扭,其实来自响应给错了信号。
三类响应,三种处理逻辑
从抓取调度的角度看,状态码大致可以分成三组:200 与可跟随的 301、302 属于第一组;404、410 属于确定性失败;5xx、429 和超时属于临时失败。蜘蛛对三者的处理完全不同:第一组继续解析页面、提取链接;第二组把 URL 标记为失效,逐步降低再抓频率;第三组保留 URL 的待抓状态,隔一段时间重试,同时可能整体下调对该站点的抓取速度。
4xx:告诉蜘蛛这个地址不用再来
404 是最常见的确定性失效信号。页面确实删除了,返回 404 或 410 都合适;410 的语义更强,表示永久移除,部分蜘蛛会更快地清理。这里有两类常见误用:
- 页面不存在却返回 200,配一句“抱歉,没有找到内容”。这类软 404 会让蜘蛛把空页面当作正常内容处理,既占抓取预算,也让本该失效的 URL 长期留在队列里。
- 把已删除的页面 301 到首页。用户侧看着有去处,但蜘蛛看到的是大量 URL 指向同一目标,跳转关系变得模糊,首页也会被以各种入口反复访问。
403 和 401 指向权限问题。如果站点按 IP 或 UA 做了拦截,蜘蛛拿到的可能就是 403。这时它不会把 URL 判为失效,但抓取会一直不顺畅,反复尝试而不产生结果。
5xx:临时失败,但代价会累积
500、502、503、504 表示服务器这次没有正常完成响应,蜘蛛通常按临时问题处理,保留 URL 并安排重试。问题在于重试不是无限的:同一批 URL 连续多次返回 5xx,蜘蛛会开始降低对该站点的整体抓取频率,恢复速度取决于后续响应有多稳定。计划内维护时,503 配合 Retry-After 头是比较明确的表达方式,比让请求长时间挂着更清楚。
429 与超时:不是坏了,而是太快了
429 表示请求频率超出服务器愿意接受的范围,它传递的是“慢一点”,而不是“这个地址有问题”,蜘蛛通常据此下调抓取速率。连接超时、读超时、连接被重置在日志里不一定体现为标准状态码,但效果类似:这轮抓取视为失败,过一段时间再试。
如果超时集中出现在某些目录或某类模板生成的页面上,往往说明这些页面在数据库查询或外部接口调用上卡住了,而不是整站不可用。定位到具体模板,比笼统地加服务器资源更有针对性。
维护窗口内的临时不可用,用 503 加 Retry-After;被压垮的接口,用 429 或明确的限流说明。都不要用长时间无响应的方式表达。
按状态码自查的几条路径
- 把服务器日志按状态码分组统计,看 5xx 和 429 集中在哪些路径、哪些时段。
- 检查是否存在大量 404 返回 200 的情况,重点看站内搜索页、筛选页、已删除的内容页。
- 抽查重定向链,确认删除页面不会被统一指向首页或某个无关栏目页。
- 观察 5xx 是否与流量高峰、批量任务、备份或密集访问时间重叠。
- 如果站点有抓取统计面板,把其中的响应错误趋势与服务器日志对照,确认两者描述的是同一件事。
小结
蜘蛛对站点的判断是一点点累积的。稳定返回 200 的页面容易被安排更规律的抓取,大量临时错误则会拉低整个站点的抓取节奏。把状态码当成给蜘蛛的即时反馈,让每种结果都对应准确的语义,URL 发现的过程会顺畅得多。