搜索抓取

页面没变时蜘蛛还来吗:304、ETag 与抓取频率的关系

很多站长看到日志里出现 304,以为蜘蛛白跑一趟。其实 304 是缓存协商的结果,代表服务器告诉蜘蛛页面没有变化。理解 Last-Modified、ETag 和 304 的协作方式,有助于判断蜘蛛来访频率是否正常,也能避免因缓存头配置不当而让抓取变得更低效。

搜索抓取

页面没变时蜘蛛还来吗:304、ETag 与抓取频率的关系

不少站长在服务器日志里看到大量 304 状态码,第一反应是:蜘蛛每次都来,但什么都没拿到,是不是抓取被浪费了?实际上,304 并不是错误,也不代表蜘蛛白跑。它是 HTTP 缓存协商的结果,表示服务器确认资源没有变化,不需要重新传输内容。

蜘蛛抓取中的缓存协商是什么

支持缓存协商的抓取工具,在重复访问同一个 URL 时,通常会在请求头里带上缓存标识。常见的有两类:

  • If-Modified-Since:带上上次抓取时服务器返回的 Last-Modified 时间。
  • If-None-Match:带上上次抓取时服务器返回的 ETag 值。

服务器收到这些请求头后,会判断资源是否发生变化。如果没有变化,返回 304,不再返回正文;如果发生变化,返回 200 和新内容。这个过程对蜘蛛和普通浏览器都适用。

304 对抓取频率和抓取预算有什么影响

从服务器角度看,304 节省了带宽和响应时间。从蜘蛛角度看,一次 304 请求仍然会消耗一定的抓取请求次数,只是没下载正文。因此,它有助于把抓取预算用在别的 URL 上,但不会自动让蜘蛛更频繁地来访。

如果页面长期没有更新,蜘蛛收到 304 的次数可能会增多。有些情况下,它会适当降低对该 URL 的访问频率,把时间分配给更新更活跃的页面。这是正常的资源分配,不必把它理解成惩罚。

需要留意的是,304 次数多并不等于抓取效率一定高。如果页面内容其实已经变化,但服务器仍然返回 304,蜘蛛就会继续持有旧版本,更新自然很难反映到搜索结果里。

Last-Modified 和 ETag 怎么配合

Last-Modified 表示资源最后修改时间,精度通常到秒。它实现简单,但有些动态页面每次访问都会生成当前时间,导致蜘蛛每次都被认为内容已变,于是频繁返回 200。

ETag 是内容标识,通常由服务器根据文件状态生成。它比时间戳更精确,但同样要避免每次请求都变化。如果 ETag 由随机数或进程 ID 拼出来,蜘蛛每次拿到的值都不同,缓存协商就失去意义。

两者可以同时使用。蜘蛛一般会优先参考 ETag,再结合 Last-Modified 判断。配置时要保证同一个版本对应同一个标识,不要为了显得更新而频繁改动这些头部。

几种常见误区

  • 把 304 当成软 404:304 表示资源仍然存在且未变,和空内容、错误状态不是一回事。
  • 页面删除了却返回 304:如果 URL 已经不存在,应返回 404 或 410,而不是继续用缓存头回应。
  • 只靠 Sitemap 的 lastmod 催抓取:lastmod 是参考信号之一,但如果服务器缓存头告诉蜘蛛没变化,两者可能互相矛盾。
  • 屏蔽蜘蛛访问以便减少 304:这会直接减少抓取,得不偿失。

日志里可以观察什么

在日志中筛选蜘蛛的请求状态码,观察 200 和 304 的比例。如果某个栏目页长期只有 304,说明内容更新少,可以检查是否真的没有变化。如果明明更新了却仍返回 304,就要检查 Last-Modified、ETag 以及中间缓存层是否配置正确。

同时关注响应时间。304 响应通常很快,但如果服务器在返回 304 之前仍执行了大量查询,实际负载并没有减轻。缓存头只是协议层优化,不能替代页面生成效率的改善。

304 不是蜘蛛空手而归,而是它在确认页面是否需要重新下载。站长要做的,是让这个信号和真实更新状态保持一致。

总的来说,304、ETag、Last-Modified 属于基础但容易被忽视的抓取细节。把它们配置稳定,至少可以避免蜘蛛在页面到底有没有变这件事上反复犹豫。至于它何时再来、抓多少次,仍取决于站点整体质量、更新节奏和其他抓取信号,没有一个头部能单独决定。