蜘蛛第一次抓取某个 URL 后,过一段时间还会再来。再次来访时,服务器返回 200 还是 304,看起来只是状态码不同,但会影响到这次抓取的带宽开销,也会影响蜘蛛把时间花在哪里。
再次抓取时的条件请求
如果服务器此前返回过 Last-Modified 或 ETag,蜘蛛下次请求同一 URL 时,通常会带上 If-Modified-Since 或 If-None-Match。这叫做条件请求。服务器收到后,可以判断内容有没有变化:没变化就回 304,变化了就回 200 并附上新内容。
304 省的是带宽,不是抓取次数
304 响应没有正文,传输体积小,对服务器和蜘蛛都更轻。但要注意,它仍然是一次 HTTP 请求,仍然会占用一个抓取名额。所以 304 不会“节省抓取预算”到让蜘蛛少来,它节省的是带宽和解析成本。真正决定蜘蛛来不来的,还是内容更新频率、站点整体质量和服务器响应速度。
什么时候应该返回 200
- 页面正文、标题、结构化数据有实际变化;
- 模板改了,导致页面主要文本或内链发生变化;
- 此前没有正确返回 Last-Modified 或 ETag,无法做条件判断;
- 内容虽然没变,但状态码从 404 恢复为正常页面。
如果内容确实变了,服务器却回 304,蜘蛛会继续使用旧副本,新内容可能迟迟得不到更新。
常见的配置错误
- Last-Modified 固定不变:有些程序把时间写成安装时间,之后不再更新,蜘蛛会误以为页面从未变过。
- ETag 每次请求都变:比如把进程 ID 或随机数拼进 ETag,蜘蛛每次都得重新拿完整内容,304 形同虚设。
- 动态页面一律回 200:内容没变也回 200,带宽浪费,蜘蛛拿到一堆重复内容。
- 304 之后又带正文:状态码和响应体不一致,可能让抓取工具判断异常。
和内链、Sitemap 的关系
304 只影响单个 URL 的重复抓取。Sitemap 里的 lastmod 是另一条线索,它告诉蜘蛛“这个 URL 大概什么时候变过”。如果 lastmod 写的是很久以前,而服务器每次都回 304,两条线索一致,蜘蛛会降低回访频率。如果 lastmod 频繁变动,服务器却总回 304,蜘蛛会逐渐不再信任 lastmod。内链结构也会影响:一个长期不变的栏目页,如果每次都回 304,蜘蛛仍然会顺着它的链接去发现新 URL,但不会反复读取正文。
从日志里看缓存头是否生效
在服务器访问日志里,可以统计同一个 URL 的 200 和 304 比例。如果一个更新不频繁的页面,蜘蛛来访十次有九次都是 200,说明 Last-Modified 或 ETag 可能没设置好。可以重点检查:
- 响应头里有没有 Last-Modified 或 ETag;
- 同一个 URL 连续两次请求,ETag 是否稳定;
- 内容更新后,Last-Modified 是否跟着变;
- 304 响应的比例在稳定内容上是否合理。
不要为了“少让蜘蛛抓”而强行返回 304。蜘蛛需要看到真实的内容变化,强行回 304 只会让新内容延迟被发现。
把 304 和 200 用对,核心是让服务器如实告诉蜘蛛“内容变没变”。缓存头稳定、状态码诚实,蜘蛛就能把有限的抓取次数用在更有变化、更值得抓的 URL 上。