很多站点运营者检查抓取问题时,习惯先看正文、标题、链接,却忽略了蜘蛛在拿到 HTML 之前先收到的 HTTP 响应头。响应头里的状态码、内容类型、缓存策略、robots 指令等,都会影响蜘蛛如何理解这个地址。如果头信息之间互相矛盾,蜘蛛可能做出与预期不同的处理。
响应头为什么值得单独检查
可以把响应头理解为服务器给蜘蛛的“交接单”。它不直接决定内容质量,但决定蜘蛛是否愿意继续读取、是否缓存、是否索引、是否跟随跳转。正文写得再好,如果响应头给出错误信号,抓取和后续处理都可能被干扰。
建议把响应头自查纳入站点例行巡检,尤其在改版、迁移、切换 CDN 或调整服务器配置之后。
优先看这几类头信息
1. Content-Type 与字符集
HTML 页面应返回 text/html,并带上正确的字符集,例如 text/html; charset=utf-8。如果 Content-Type 被写成 text/plain、application/octet-stream 或字符集与实际编码不一致,蜘蛛可能无法正常解析页面,中文内容尤其容易出现乱码判断。
- 检查动态页面、错误页、下载接口是否误用同一套默认类型。
- 检查 charset 是否与页面 meta charset 一致。
- 检查 404 页面是否也返回 text/html,而不是纯文本或空白。
2. X-Robots-Tag
X-Robots-Tag 是写在响应头里的 robots 指令,优先级和写法容易与页面 meta robots 混淆。如果测试环境残留 noindex,或者运维层面对整站批量加上了 noindex,蜘蛛会按头信息执行。自查时要确认它是否与页面级指令一致,避免一个说 index,一个说 noindex。
3. 缓存相关头
Cache-Control、Expires、ETag、Last-Modified 会影响蜘蛛和中间缓存看到的是新版本还是旧版本。内容更新后,如果缓存头仍然让页面长时间保持旧状态,蜘蛛可能反复抓到改动前的内容。
- 确认 HTML 文档的缓存时间是否过短或过长。
- 确认更新内容后是否有合理的刷新机制。
- 确认 ETag 和 Last-Modified 不会频繁无故变化。
4. Location 与重定向
重定向响应中的 Location 必须指向最终可达的地址。如果 Location 指向一个本身又重定向的地址,或者指向 404、403 页面,蜘蛛会在跳转链里消耗时间。还要注意相对路径和绝对路径混用带来的意外解析。
5. Vary 与内容协商
如果服务器根据 User-Agent、Accept-Encoding 或 Cookie 返回不同内容,Vary 头需要如实声明。声明不当可能让缓存把移动端页面返回给桌面蜘蛛,或把未压缩版本反复发给不同客户端。对于蜘蛛来说,最稳妥的是同一 URL 返回稳定的 HTML 主体。
6. 压缩与传输相关头
Content-Encoding、Transfer-Encoding 等头如果配置异常,可能导致蜘蛛读取中断。通常不需要为蜘蛛单独关闭压缩,但要确认服务器、CDN 和源站之间的压缩设置没有冲突。
自查方法
- 用命令行工具请求几个代表性 URL,只看响应头。
- 对比首页、栏目页、详情页、分页、404 页的响应头差异。
- 在浏览器开发者工具的 Network 面板中查看 Response Headers,确认与命令行结果一致。
- 结合服务器访问日志,观察蜘蛛请求同一 URL 时返回的状态码和响应大小是否有异常波动。
- 改版或迁移后,抽取旧地址和新地址各一批,逐一核对。
常见矛盾组合
- 页面允许索引,但 X-Robots-Tag 写了 noindex。
- 返回 200 状态码,Content-Type 却是 text/plain,页面实际不可解析。
- Cache-Control 设得很长,内容却每天更新,蜘蛛长期看到旧版本。
- Location 指向带参数地址,参数地址又跳回原地址,形成循环。
- Vary 未声明 User-Agent,缓存把移动版页面返回给桌面蜘蛛。
把响应头纳入日常巡检
响应头问题往往不是单独出现的,它们和服务器配置、CDN 规则、应用框架默认值有关。建议在每次调整服务器、发布流程或缓存策略后,固定检查一批 URL 的响应头,记录正常状态作为基线。这样出现抓取异常时,能更快判断是内容问题还是头信息问题。
不需要追求复杂的监控体系,先把关键页面的响应头看清楚、保持一致,就已经能减少很多让蜘蛛困惑的信号。