很多站点把注意力放在正文和链接上,却忽略了服务器返回的那几行响应头。蜘蛛拿到的第一份信息就是响应头:内容是什么类型、能不能索引、有没有更新、要不要稍后再来。这些字段一旦写错或前后矛盾,蜘蛛的判断就会跟着偏。
Content-Type 与字符集:先说清楚这是什么
最基础的一条是 Content-Type。它告诉蜘蛛这是一个 HTML 页面、一张图片还是一份文件。如果 CMS 或服务器把 HTML 页面返回成 text/plain,蜘蛛看到的就可能是一堆源码文本,正文解析容易出问题。
字符集同样重要。中文站点如果声明与实际编码不一致,页面会出现乱码,标题和正文的识别都会受影响。建议在响应头里明确 charset=utf-8,并与页面内的 meta 声明保持一致,不要一处写 utf-8、另一处写 gb2312。
X-Robots-Tag:看不见的 meta robots
meta robots 写在 HTML 里,而 X-Robots-Tag 写在响应头里,作用相同,优先级更高。常见用法是给某个目录下的 PDF、图片统一加 noindex,避免它们进入索引。
风险也在这里:这个字段常常由运维或安全策略顺手加上,运营同学并不知情。一旦全站响应头里带了 noindex,页面看起来正常,索引却会慢慢清空。排查抓取异常时,建议用命令行工具看一眼响应头,确认没有意外的 X-Robots-Tag。
Last-Modified 与 ETag:让蜘蛛知道页面有没有变
这两个字段支持条件请求。蜘蛛再次访问时带上 If-Modified-Since 或 If-None-Match,服务器如果发现内容没变就返回 304,既省带宽,也让蜘蛛把抓取预算留给别的页面。
需要注意的是别让它们乱跳。有些站点每次请求都重新生成 ETag,或者把 Last-Modified 设成当前时间,蜘蛛每次都被判定为有新内容,于是反复抓取同一个页面。稳定、真实的更新时间更有价值。
Vary 与内容协商:同一个 URL 给出几套内容
如果服务器根据 User-Agent 或 Cookie 返回不同版本,比如给移动端返回简化版、给未登录用户返回另一套模板,需要通过 Vary 说明依据。否则缓存和蜘蛛都可能拿到不符合预期的版本。这类差异化最好控制在必要范围内,主体内容尽量保持一致。
限流与 Retry-After:礼貌地告诉蜘蛛慢一点
当服务器压力大时,返回 429 或 503 并附带 Retry-After,比直接超时更友好,蜘蛛会按提示稍后再来。相反,如果长期用 403 或 429 打发所有请求,抓取量下降是自然结果。
另外,返回 503 时不要同时带上 noindex,短暂的维护不该被理解成永久下线。
Link 头:另一种传递 canonical 的方式
对非 HTML 文件,比如 PDF,页面里没法写 canonical,可以用 Link 响应头指向规范版本。如果响应头里的规范地址和 HTML 里的 canonical 指向不同位置,蜘蛛就会收到矛盾信号,至少要让两者保持一致。
一份可执行的自查清单
- 抽查首页、栏目页、详情页的响应头,确认 Content-Type 为 text/html 且字符集正确。
- 全站搜索 X-Robots-Tag,排除被批量加上 noindex、nofollow 的情况。
- 检查 Last-Modified 与 ETag 是否稳定,是否支持返回 304。
- 确认 Vary 设置与实际的差异化返回逻辑匹配。
- 维护期间返回 503 加 Retry-After,而不是 200 或 403。
- canonical 的响应头写法与 HTML 写法保持一致。
响应头是蜘蛛看到的第一句话。与其事后从日志里猜它为什么不来,不如先把这句话说清楚。
这些字段平时不会出现在后台界面里,改动也常常是顺手为之,所以更需要定期抽查。把响应头纳入站点运营的日常检查项,抓取上的很多“莫名其妙”,其实都能在这里找到解释。