聊蜘蛛池入口页时,大家习惯盯着 HTML 里的 meta 标签和链接写法,却容易忽略一件事:搜索蜘蛛在读到 HTML 之前,先读的是 HTTP 响应头。响应头里的 X-Robots-Tag、Content-Type 这些字段,会直接影响它接下来怎么处理这份文档。
一、X-Robots-Tag 和 meta robots 不是一回事
meta robots 写在 HTML 里,只有蜘蛛把页面下载并解析到那一段才会生效;X-Robots-Tag 写在 HTTP 响应头里,蜘蛛一拿到响应就能看到,不需要解析正文。对于非 HTML 文件,比如 PDF、图片、JS 文件,meta 标签没法写,X-Robots-Tag 往往是唯一能下发指令的地方。
也正因为生效更早,响应头里的配置一旦写错,影响面通常比 meta 更大。常见的错误写法包括反向代理层统一加了一条 X-Robots-Tag: noindex,或者 CDN 的默认规则批量注入了 nofollow。
二、noindex 会不会挡住链接跟踪
这里需要区分两件事:收录和链接发现。noindex 表达的是“不要把这个 URL 放进索引”,它本身并不等同于爬虫不能继续解析页面里的链接。真正会阻断链接跟进的,是 nofollow,或者 none 这类组合指令。
所以实际会出现这样的现象:入口页带了 noindex,蜘蛛仍然抓取了它,也顺着链接发现了目标 URL,但入口页自己不出现在搜索结果里。这不算故障,只是一种策略选择。反过来,如果响应头写的是 X-Robots-Tag: noindex, nofollow,那链接跟进这条通道基本就断了。
自查思路:先确认你要的是“入口页不进索引但仍能被用来发现 URL”,还是“彻底不要继续跟进”。这两种目标对应的字段写法完全不同,别混着配。
三、Content-Type 不对,蜘蛛可能根本不解析链接
蜘蛛要不要把响应体当成 HTML 来解析,很大程度取决于 Content-Type。响应头写成 text/plain、application/json 甚至缺失时,多数情况下它只会把内容当成一段文本,而不会去提取里面的 a 标签。
这类问题在蜘蛛池里并不罕见,因为入口页常常挂在反代、对象存储或自建脚本后面,默认把内容按纯文本吐出。页面在浏览器里看着正常,因为浏览器容错能力强,蜘蛛那边却什么链接都没拿到。
配套的还有 Content-Disposition。如果响应头里带了 attachment,语义上就是让客户端下载文件,蜘蛛通常不会把它当网页处理。
四、值得逐项检查的响应头
- X-Robots-Tag:确认有没有被网关、CDN、WAF 批量注入 noindex 或 nofollow。
- Content-Type:入口页应为 text/html; charset=utf-8,注意字符集声明要和实际编码一致。
- Content-Disposition:不应出现 attachment。
- Location 与状态码:301、302 要配 Location;返回 200 却带 Location,容易让抓取判断混乱。
- Cache-Control 与 Vary:缓存策略会导致不同节点、不同 UA 拿到不同版本,影响你判断“蜘蛛看到的到底是哪一版”。
- Refresh:少数老服务仍会下发 HTTP 层的 Refresh 跳转,行为不如标准跳转稳定,建议改成 301 或 302。
五、怎么确认蜘蛛实际看到的响应头
- 用命令行直接看响应头:curl -I -A “对应蜘蛛 UA” 入口页 URL,再换成普通浏览器 UA 对比一次。
- 分别从不同节点、不同网络环境请求,排查 CDN 回源差异。
- 把抓到的响应头和你自己在浏览器开发者工具 Network 面板里看到的结果对照,重点看 X-Robots-Tag 和 Content-Type。
- 在搜索平台的抓取分析工具里查看实际抓取结果,确认返回的状态码和内容类型是否与预期一致。
日志里如果反复出现“抓取成功但从未发现新 URL”的情况,优先怀疑这一层,而不是急着去加更多入口页。
六、给运营同学的建议
把响应头当成入口页上线前的一道检查项,和标题、链接写法放在同等位置。入口页数量多的时候,最好在模板或网关层统一配置,避免个别页面漏配或误配。任何“批量加一个头试试”的改动,先在少量 URL 上验证,再全量放开,改动前后都留一份响应头对照记录,出了问题才追得回去。