蜘蛛拿到一个 URL 之后,第一件事并不是读内容,而是看响应头里的状态码。状态码决定了它要不要读正文、要不要继续走这个目录下的其他链接,以及隔多久再来一次。同一个页面,返回 200 和返回 304,对抓取资源的消耗完全不是一回事。
304:让蜘蛛少搬一次内容
如果服务器支持条件请求,蜘蛛再次访问时带上上次拿到的 Last-Modified 或 ETag,页面没变就返回 304,正文不必再传一遍。对蜘蛛来说,这相当于收到一句“内容没变,不用重新处理”,带宽和抓取配额都省下来了。
- Last-Modified 要给准,时间跳来跳去会让蜘蛛误判页面一直在更新
- ETag 最好基于文件内容或版本号生成,避免每次请求都变化
- CDN 回源和缓存策略如果不透传这些响应头,蜘蛛就享受不到 304
404 与 410:都是“没有”,但语气不同
404 表示暂时找不到,410 表示这个地址已经明确下线。蜘蛛对 410 的处理通常更干脆:确认之后会更快停止回访,也不再把它当作待发现的 URL。如果页面是永久删除,用 410 比一直留着 404 更省抓取资源;如果只是临时调整,返回 404 甚至 503 更合适。
需要留意的是,页面返回 200 但正文为空的软 404,会让蜘蛛反复回来确认,属于典型的抓取浪费。
403、401:蜘蛛被挡在门外之后
403 表示服务器拒绝了这个请求。蜘蛛一般不会因为一次 403 就放弃这个地址,但持续 403 会让它降低对这批 URL 的抓取频率。401 是要求身份验证,爬虫通常没有账号,同样进不去。这两种状态码如果是因为 WAF、防火墙或地域限制误伤,需要在日志里对照蜘蛛的 IP 和 UA 排查,而不是等页面从结果里消失才发现。
5xx:不是“没有页面”,是“服务器现在不行”
500、502、503 这类状态对蜘蛛而言是临时故障信号。多数蜘蛛会把 URL 放回队列稍后重试,而不是立刻删除。但如果 5xx 持续出现,蜘蛛会认为站点整体不稳定,主动放慢抓取速度,甚至减少并发,结果是本来能抓到的页面也被推迟。
- 维护时段用 503 配合 Retry-After 明确告知,比直接关站返回连接错误更好
- 全站 5xx 持续一两天,恢复后抓取速度往往需要一段时间才能回到原来水平
- 个别接口 5xx 却挂着 200 的页面,蜘蛛拿到的就是半成品,容易被当成低质量内容
用日志核对状态码分布
光看代码里写了什么并不够,实际返回给蜘蛛的是什么才重要。建议按周抽取蜘蛛日志,统计各状态码在总请求里的占比,重点看三个数:304 的比例够不够高、5xx 是否集中在某个时段或某台机器上、404 和 410 是否集中在旧 URL 上。
状态码是服务器给蜘蛛的暗号,写错不会立刻有反馈,但会在抓取节奏、回访频率和资源消耗上慢慢体现出来。
把这些状态码管好,并不保证页面被收录,但能让蜘蛛把有限的抓取次数用在真正有内容、有更新的地址上,这对日常站点运营来说是更可控的一步。