搜索抓取

响应头里的抓取信号:蜘蛛在解析正文之前先看什么

抓取问题往往先被归因到正文、内链或 meta 标签,HTTP 响应头这一层却常被跳过。本文说明 Last-Modified、ETag、Content-Type、X-Robots-Tag 以及重定向、Retry-After、缓存头如何影响蜘蛛的判断与下一次来访,并给出一份可以照着跑的自查清单。

搜索抓取

响应头里的抓取信号:蜘蛛在解析正文之前先看什么

排查抓取问题的时候,注意力通常放在正文、meta 标签和内链结构上,HTTP 响应头这一层基本被跳过。但蜘蛛在决定一个 URL 要不要抓、抓回来怎么处理、下次还来不来的时候,最先读到的恰恰是响应头。字段配置不对,正文写得再细也可能白费。

Last-Modified 与 ETag:帮蜘蛛少抓一次

这两个字段不决定收录,但会影响蜘蛛重复访问时的判断成本。

  • Last-Modified:如果每次请求都返回当前时间,蜘蛛会认为页面一直在变,于是更频繁地回来,抓取预算被消耗在没有实质更新的页面上。合理做法是返回内容真正变更的时间。
  • ETag:内容未变时应保持稳定,配合 If-None-Match 请求,服务器可以返回 304,避免重复下载完整正文。反过来,把 ETag 生成成随机的、每次请求都不同的字符串,等于持续告诉蜘蛛“内容又变了”。
  • 两个字段互相矛盾时(Last-Modified 没变、ETag 却变了)容易造成判断混乱,建议保持同步更新。

Content-Type:返回类型不对,抓取会被中断

蜘蛛需要靠 Content-Type 判断这个响应该按 HTML 解析,还是当成文件下载。常见问题有三类:

  • 页面返回 text/plain 或 application/octet-stream,蜘蛛可能直接放弃解析,内容等于没被抓到。
  • 字符集声明缺失,或与正文实际编码不一致,抓到的文本可能是乱码,影响后续判断。
  • 类型声明为 text/html,但正文为空或只有一小段占位内容,容易被当作软 404 处理。

排查方式很直接:用 curl -I 或者浏览器开发者工具的网络面板,看响应头和正文类型是否对得上。

X-Robots-Tag:写在 HTTP 里的 robots 指令

这个字段的作用和页面里的 meta robots 类似,但写在响应头里,对蜘蛛更早可见,也能作用到 PDF、图片这类没法插入 meta 的文件。

如果某个目录批量配置了 X-Robots-Tag: noindex,页面本身看不出任何异常,但抓取与展现都会受影响。遇到“页面正常却不被收录”的情况,这一项值得优先检查。

同时要留意别在不需要的地方沿用 nofollow、noarchive 等指令,尤其是从旧站点或模板里复制过来的配置。

重定向与 Retry-After:影响下一次来访

301、302 的 Location 头如果指向已经不存在的地址,或者形成多级跳转,URL 发现的损耗会一层层累积。服务端临时不可用时,返回 503 并带上 Retry-After,比直接给 500 更友好:蜘蛛知道大概等多久再来,而不是把这次失败当成页面真的下线。

缓存相关头部(Cache-Control、Vary、Age)不直接决定抓取,但如果 CDN 把一份错误响应缓存住,蜘蛛和用户都会持续拿到同一份坏结果,排查时非常容易走偏。

一份快速自查清单

  1. 用 curl -I 检查核心页面,确认状态码、Content-Type 和字符集。
  2. 隔一段时间请求两次,对比 Last-Modified 与 ETag,确认内容未变时这两个值不会随便变动。
  3. 全量检索服务器与 CDN 配置,找出所有 X-Robots-Tag,逐条确认是否仍然需要。
  4. 检查 5xx 场景是否返回了合理的 Retry-After,而不是长期挂着一份错误页。
  5. 确认 CDN 缓存策略与源站响应头一致,避免错误响应被长时间缓存。

响应头不需要天天盯,但每次改版、迁移、调整缓存策略之后过一遍,能省掉不少“页面看起来没问题、蜘蛛就是不来”的排查时间。