搜尋抓取

Sitemap 與内鏈的 URL 集合對齐:两套發現入口不一致时的核對顺序

Sitemap 與内鏈是两條並行的 URL 發現通道,長期執行後集合容易出現偏差:只有 Sitemap 收錄却無站内入口的地址、只在日誌中出現的頁面、指向重定向或 404 的内鏈各占一部分。本文给出一套可复現的核對顺序,從基准清單導出、狀態碼分组到 Sitemap 增删與日誌复查,把抓取资源集中到有價值的地址上。

搜尋抓取

Sitemap 與内鏈的 URL 集合對齐:两套發現入口不一致时的核對顺序

Sitemap 和内鏈是两條並行的 URL 發現通道,理想狀態下两者指向的地址集合應该基本重合。實际运营中经常出現偏差:Sitemap 里躺着几百條從未被内鏈引用過的地址,内鏈指向的一批頁面又不在 Sitemap 中,還有一部分 URL 只在日誌里出現過。這類偏差不會立刻造成明顯問题,但會让抓取资源分散在低價值地址上,也让後續的收錄判断失去參照。

先确定一份可對比的基准清單

核對之前要有一份可复現的 URL 清單,来源通常有三個:

  • Sitemap 導出:把索引文件和各分片里的 loc 字段全部導出,去重後得到集合 A。
  • 内鏈導出:從首頁出發按可点击的 a 标簽逐层抓取,或直接爬取全站 HTML 提取 href,去重後得到集合 B。注意排除導航、頁脚里重复出現的模板連結。
  • 日誌提取:從服務器日誌中筛出蜘蛛 UA 的請求路径,得到集合 C。這一列反映的是實际被抓過的地址,不是應该被抓的地址。

把三個集合放進同一張表,用标簽标记每條 URL 出現在哪几個来源中,後續排查就有了统一口径。

不一致的几種典型形態

只在 Sitemap 里出現

這類 URL 通常由程序自動生成,比如标簽頁、篩選结果頁、歷史版本頁。它們没有站内入口,蜘蛛即使抓到也很难判断價值,回訪频率普遍偏低。處理方式是先判断頁面是否有獨立检索需求,有就补内鏈,没有就從 Sitemap 中移除,不要長期挂在文件里占位置。

只在内鏈里出現

常见于新發布的栏目頁或临时活動頁,編輯加了連結但忘了同步 Sitemap。這類頁面被發現的速度取决于内鏈所在层級,如果位于三級栏目以下,光靠内鏈可能几天都不會被碰到。把這類地址补進 Sitemap 是成本最低的改善動作。

連結指向重定向或错誤狀態

内鏈 href 寫的是舊地址、带尾斜杠的變体,或者要经過一次跳轉才到目标頁,都會让蜘蛛多走一步。數量少可以忽略,成批出現时抓取资源的损耗就比較明顯。核對时按狀態碼分组,301 和 302 分開統計,404 單獨處理。

建议的核對顺序

  1. 固定基准清單,導出三個集合,為每條地址打上来源标簽。
  2. 先處理错誤狀態:内鏈中的 404、410 優先清理或改指向。
  3. 再看重定向:把多跳鏈压缩為一跳,目标地址统一寫成最终 URL。
  4. 然後對齐 Sitemap:删掉無入口且無检索價值的地址,补上有入口但缺失的地址。
  5. 最後看日誌:對已進入 Sitemap 却長期未被抓取的地址,检查是否被 robots 規則或服務器狀態拦下。
  6. 记錄本次改動時間,两周後用日誌复查請求分布是否發生變化。
集合對齐的目标不是让三個来源完全一致,而是让每一條 URL 都能解释清楚自己為什么在里面。解释不清的地址,通常就是抓取资源被浪費的地方。

维持對齐的日常動作

一次性核對只能解决存量問题,增量部分要靠流程控制。新頁面發布时,把「加入内鏈」和「寫入 Sitemap」当作同一個步骤;頁面下线时,同步刪除 Sitemap 條目並把内鏈改為指向替代頁面。多數站点的偏差並非来自技術故障,而是来自發布和下线两個环节缺少同步動作。

另外,Sitemap 中 lastmod 與真實更新時間偏差較大时,也會干扰核對的判断结果,這一点需要單獨检查,不在本文范围内。