蜘蛛池的入口页能不能被收录,抓取只是前半段。蜘蛛爬到了、下载了 HTML,不等于这一页会进索引——中间的判断依据,很大一部分来自你自己发出的索引指令。这些指令写在 robots.txt、HTTP 响应头和 HTML 的 meta 标签里,改动成本极低,但写错的代价是整批入口页被主动排除,而且在日志里看不到任何报错。
先分清:抓取指令和索引指令是两套东西
robots.txt 管的是“蜘蛛能不能来读”,meta robots 和 X-Robots-Tag 管的是“读完之后要不要收”。很多入口页被排除,不是因为蜘蛛没来,而是来了之后被 noindex 拦下。日志里会出现正常的 200 抓取记录,看起来一切正常,索引里却始终没有这一页。
抓取量是过程指标,索引量才是结果指标。指令写错时,过程看起来完好无损。
三类最常写错的指令
robots.txt:Disallow 不等于删除
- Disallow 只是请求蜘蛛不要抓,页面仍可能因为外链存在而出现在索引里,只是没有摘要。
- 用 Disallow 挡住某个目录,同时又在别处放链接,是入口页最常见的自相矛盾。
- 通配符和目录结尾的写法容易写反,比如 /entry/ 与 /entry 覆盖范围并不相同。
- robots.txt 文件本身返回 5xx 或超时,不同蜘蛛的处理策略不一样,有的会暂停抓取整个站。
meta robots 与 X-Robots-Tag:索引指令
HTML 页面用 meta 标签,非 HTML 资源(图片、PDF、接口返回)只能靠 HTTP 头里的 X-Robots-Tag。两者作用相同,同时存在时以更严格的那个为准。
- noindex:不要把这一页放进索引。
- nofollow:不跟踪页面里的链接。用在入口页上,等于自己切断了通往目标页的路。
- noindex 和 Disallow 一起用是典型误配:蜘蛛看不到 noindex,反而可能只凭外链收录一条空记录。
canonical:告诉蜘蛛哪一版算数
canonical 是一个建议,不是强制指令,但它会明显影响权重和索引版本的归并。模板化批量生成入口页时,最容易出的事就是把 canonical 写死指向首页或某个固定 URL,结果所有入口页都被当成副本,蜘蛛不再单独抓取,也不再有单独索引。
- 自引用 canonical 是常规做法,指向自身即可。
- 已经确定要合并的重复页面,用 301 比 canonical 更干脆。
- 分页列表页不要把每一页都 canonical 到第一页,这会丢掉后几页的发现价值。
生效顺序:先抓取,再索引
- robots.txt 决定蜘蛛这次能不能读。
- HTTP 响应头里的 X-Robots-Tag 先于 HTML 内容被解析。
- HTML 中的 meta robots 在解析页面后生效。
- canonical 在索引阶段被参考,用于决定保留哪个版本。
顺序意味着:如果第一步就挡住了,后面所有指令蜘蛛都读不到。想用 noindex 下架页面,就不要同时用 Disallow 挡住它。
几个典型的误配场景
- 上线前的全站 noindex 测试,上线后忘了撤,整批入口页安静地不进索引。
- CDN 或反向代理缓存了带 noindex 头的旧响应,源站已经改回,蜘蛛拿到的还是旧头。
- sitemap 里提交了一批带 noindex 的 URL,等于自己给蜘蛛发无效任务。
- 入口页的 nofollow 加在了正文链接上,只留下导航链接可跟,链接深度被动拉长。
上线前的自检清单
- 用 curl -I 直接看响应头,确认没有意外的 X-Robots-Tag。
- 抽查几条入口页的 HTML 源码,确认 meta robots 与 canonical 符合预期,而不是模板默认值。
- 确认 robots.txt 没有误伤入口页目录,也没有出现 Disallow 与 noindex 叠加。
- 改动索引指令后,通过日志观察蜘蛛的抓取是否恢复,不要只看一天的数据。
索引指令的特点是“写对了看不出功劳,写错了很安静”。对蜘蛛池这种批量生成、批量上线的场景,把这几项做成固定的上线检查,比事后从日志里倒推原因要省力得多。