搜尋抓取

搜尋蜘蛛抓取:Sitemap 声明與頁面 canonical 不一致的入口归属核對

当 Sitemap 提交的地址與頁面 canonical 指向的地址不一致时,蜘蛛會收到两份互相矛盾的入口信号,表現為部分入口訪問逐渐减少。本文按可执行顺序梳理核對方法:先归類不一致類型,再比對源碼声明與服務器日誌落地情况,最後决定保留哪個入口並收敛重复路径。

搜尋抓取

搜尋蜘蛛抓取:Sitemap 声明與頁面 canonical 不一致的入口归属核對

站点地图(Sitemap)和頁面 canonical 都在向搜尋蜘蛛表達同一件事:這個地址值得抓取、應当被当作正式入口。但两者並不總是同步维護,改版、分頁、參數化調整之後,经常出現 Sitemap 里寫 A 地址、頁面 canonical 指向 B 地址的情况。蜘蛛拿到两份互相矛盾的信号,通常會選一個繼續抓,另一個逐渐减少訪問。這個過程不會报错,只會表現為某些入口慢慢没人来。

先判断信号是不是真的冲突

並不是所有不一致都算問题,需要先区分三類情况。

  • 等價不一致:只差结尾斜杠、大小寫、http 與 https、www 前缀。這類属于規范化层面,會带来重复入口,但可以通過统一跳轉解决。
  • 归属不一致:Sitemap 寫的是列表頁,canonical 指向詳情頁或聚合頁,两者内容並不相同。這類属于入口归属判断错誤。
  • 過期不一致:頁面已经下线或改版,Sitemap 仍是舊地址,canonical 已经換成新地址。這類是维護滞後。

把這三類分開,後面的處理方式差別很大,先统一归類再動手。

核對顺序:從声明到落地

  1. 抽样子集:從 Sitemap 里按栏目各抽 20 到 50 條,不必全量,覆盖主要目錄即可。
  2. 取頁面 canonical:抓取頁面源碼,记錄 canonical 的 href 值,注意区分 head 里的声明和响應头里的 Link 声明。
  3. 比對是否自洽:Sitemap 地址與 canonical 地址去掉协议、域名、结尾斜杠後是否一致,不一致就進入下一步。
  4. 看服務器日誌落地:在訪問日誌中篩選蜘蛛 UA,看它實际請求的是哪個地址、返回什么狀態碼、是否發生跳轉。
  5. 看跳轉鏈:如果 Sitemap 地址會 301 到 canonical 地址,說明两處声明其實一致,只是入口绕了一步;如果两者各自返回 200,就是真正的一頁两入口。
  6. 確認收錄归属:在搜尋後台查看這两個地址的收錄與展示情况,判断搜尋引擎最终選擇了哪一個。

常见成因

  • 改版後栏目路径變化,Sitemap 生成脚本沿用舊規則,頁面模板已经更新。
  • 分頁與篩選參數頁被寫進 Sitemap,而頁面自身 canonical 指向第一頁。
  • 多域名或多語言站点,語言選擇逻辑與 Sitemap 域名配置不统一。
  • 内容聚合頁與原始詳情頁互相 canonical,形成 A 指 B、B 指 A 的循环。
  • Sitemap 由第三方工具生成,與站内模板维護在不同节奏上。

處理原則

優先让两處声明指向同一個地址

大多數情况下,正确做法是修改 Sitemap,让它輸出與 canonical 一致的地址,而不是反過来改 canonical 去迁就 Sitemap。canonical 是頁面級別的判断,更贴近内容本身;Sitemap 是站点級別的清單,改起来成本更低。

能跳轉就不要两處並存

如果舊地址确實需要保留對外可见,用 301 指向正式地址即可。Sitemap 里只保留最终地址,避免把跳轉前的地址繼續提交。

發現循环 canonical 先断鏈

A 指 B、B 指 A 會让蜘蛛無法确定归属,通常结果是两個地址的抓取频率都下降。保留一個作為自指向,另一個改為 301 或直接下线。

核對时以日誌為准,不要只看頁面源碼。源碼可能被缓存或由前端渲染,日誌里的請求记錄才是蜘蛛實际走過的路径。

核對完成後要留下记錄

建议把這三項记在同一份表里:Sitemap 地址、canonical 地址、日誌中實际抓取地址與狀態碼。下次改版或調整脚本时可以對照,避免同一類偏差反复出現。入口數量變少不等于流量一定下降,關键看保留下来的是不是頁面真正應该被訪問的那個地址。