搜索抓取

蜘蛛先读 HTTP 头:X-Robots-Tag、字符集与 Vary 对抓取的影响

蜘蛛请求一个 URL 时,先拿到的是响应头,然后才是正文。Content-Type 与字符集决定它能不能正确解析,X-Robots-Tag 决定页面能不能进入索引,Vary 则影响缓存与版本一致性。本文梳理这些头部字段的常见写法与容易踩的坑,并给出一份上线前可执行的检查清单,帮你把抓取前的第一道门看好。

搜索抓取

蜘蛛先读 HTTP 头:X-Robots-Tag、字符集与 Vary 对抓取的影响

蜘蛛抓一个 URL 时,拿到的并不是一整块页面,而是先收到响应头,再收到正文。很多站长只盯着 HTML 里的 title、meta 和正文,忽略了头部那几行字段,结果页面没被抓走却找不到原因。响应头决定了蜘蛛怎么判断“这是什么东西、要不要继续读、按什么编码读”,值得单独检查一遍。

第一眼:状态行与 Content-Type

Content-Type 告诉蜘蛛返回的是 HTML、XML、图片还是文件流。如果动态接口把 HTML 页面标成 text/plain 或 application/octet-stream,蜘蛛可能只当成一个文件下载,不去解析里面的链接,URL 发现就在这里断掉。

反过来也不合适:把图片、PDF 误标成 text/html,蜘蛛会按页面处理,抓到一个几乎没有可用内容的“页面”。

  • 页面型 URL 返回 text/html; charset=utf-8
  • XML 站点地图返回 application/xml 或 text/xml
  • 图片、视频、文档返回各自对应的类型

检查方法很简单:用 curl -I 看目标 URL 的 Content-Type 那一行。模板页较多时,可以写脚本按页面类型批量抽查。

编码声明不一致会带来什么

头部 charset 与 HTML 里 meta charset 不一致时,蜘蛛通常按头部优先解码,中文可能变成乱码,标题、摘要、锚文本一起受影响。建议全站统一 UTF-8,并在头部明确声明。

个别页面如果用了非 UTF-8 编码,容易出现问号或方块,蜘蛛读到的文本与用户看到的并不一致。

X-Robots-Tag:藏在头部里的 robots 指令

这是 HTTP 头版本的 meta robots,写在响应头里生效。它主要解决那些没法在 HTML 里写 meta 的文件,比如 PDF、图片、视频。

常见写法:

  • X-Robots-Tag: noindex —— 不影响抓取,但不让进入索引
  • X-Robots-Tag: noindex, nofollow
  • X-Robots-Tag: googlebot: noindex —— 只对特定蜘蛛生效

容易踩的坑有三个:CDN、反向代理或框架中间件统一给所有响应加上了 noindex,上线后不易察觉;测试环境打开的限制忘了关,跟着配置一起进生产;只改了 HTML 里的 meta,没检查头部还在下发同样的指令。

头部指令通常优先级高于 meta:两边冲突时,更严格的那个生效。所以在头部加了 noindex,再去 HTML 里删 meta 是没有用的。

还要注意与 robots.txt 的先后顺序:如果 robots.txt 禁止抓取,蜘蛛根本看不到响应头,也就看不到 noindex。想让页面从索引中退出,一般先允许抓取,再给 noindex。

Vary 与缓存:同一 URL 的不同版本

Vary 告诉缓存“这个响应取决于哪些请求头”。Vary: User-Agent 会让缓存把不同 UA 的请求分开存放,对蜘蛛来说,它拿到的版本可能和普通用户不同。

如果站点按 UA 给蜘蛛返回不一样的内容,属于典型的伪装,风险很高,不建议使用。确有区分需求时,可以用 Vary: Accept-Encoding 这类与内容编码相关的字段。

Vary: * 会让缓存几乎失效,源站压力上升,间接拖慢蜘蛛的抓取节奏,属于常见但容易被忽略的性能坑。

内容编码与长度

Content-Encoding: gzip 或 br,能让蜘蛛用更少的带宽拿到同样的正文,列表页这类结构重复的页面收益更明显。压缩通常由服务器或 CDN 自动完成,但要确认 HTML 响应没有被跳过。

Content-Length 只是声明,不是必须;分块传输也能被正常解析,不必为它纠结。

一份可落地的检查清单

  1. 用 curl -I 抽查首页、栏目页、详情页、Sitemap 和图片的响应头
  2. 确认 Content-Type 与 charset 正确、全站统一
  3. 搜索全站配置里的 noindex,确认只有目标 URL 命中 X-Robots-Tag
  4. 检查 Vary 是否被滥用,尤其是 Vary: *
  5. 在日志里对照蜘蛛拿到的状态码与响应大小,看有没有“200 但内容异常”的情况

头部只有几行,却决定了蜘蛛后面的所有动作。把这几行检查清楚,再去看内链、Sitemap 和抓取预算,排查顺序会顺很多。