蜘蛛池的入口頁能不能被收錄,抓取只是前半段。蜘蛛爬到了、下载了 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 叠加。
- 改動索引指令後,通過日誌观察蜘蛛的抓取是否恢复,不要只看一天的資料。
索引指令的特点是“寫對了看不出功劳,寫错了很安静”。對蜘蛛池這種批量生成、批量上线的场景,把這几項做成固定的上线检查,比事後從日誌里倒推原因要省力得多。