很多站点在日誌里會出現這样的情况:同一個頁面,被搜尋蜘蛛用三四種不同的地址反复抓取。内容只有一份,抓取次數却被摊薄成几份。問题往往不在内容本身,而在于入口没有收敛。
同一頁面常见的几種寫法差异
URL 發現靠的是連結、Sitemap、跳轉等多條通道,只要有任意一條通道给出另一種寫法,就會多出一個待抓地址。
- 协议不同:http 與 https 各有一套地址,舊連結和模板里寫死的 http 地址,都會把蜘蛛引到另一個入口。
- 主机前缀不同:带 www 與不带 www、主域名與备用域名,如果都返回 200,等于两份彼此獨立的站点。
- 尾部斜杠不同:/page 與 /page/ 被服務器同时接受时,两條地址都會被记錄。
- 大小寫與預設端口:/About 與 /about、带 :80 或 :443 的绝對地址,都會形成新的入口。
- 參數顺序與追踪參數:?a=1&b=2 與 ?b=2&a=1,再加上来源标记,可以衍生出大量變体。
重复入口带来的實际影响
最直接的表現是抓取次數被分散。原本可以集中在主地址上的回訪,被切给了几個副本;副本内容一致,更新时又不會同步變化,蜘蛛反复比對之後仍然拿不到新信息。
其次是信号被拆散。外鏈、内鏈、点击資料分別指向不同寫法时,單一地址收到的指向就變少,頁面在站点结构里的位置也變得模糊。對以 URL 發現為核心的抓取流程来说,這相当于人為拉長了队列。
判断标准很简單:如果同一份内容在日誌里長期以多個地址出現,並且各自都有稳定抓取量,就說明規范化還没做完。
收敛入口的三层做法
服務器與跳轉层
選定唯一主地址,其余寫法统一做 301 跳轉到它,而不是用 200 並列返回。协议、www 前缀、尾斜杠、大小寫這類差异,最适合在這一层解决,一次處理對所有入口生效。
頁面與内鏈层
站内連結、導航、面包屑、Sitemap 里的地址要與主地址完全一致。常见疏漏是模板里寫死舊地址,或者編輯手工複製了带參數的連結。前者改模板,後者靠發布前检查。
声明與提交层
canonical 指向主地址,Sitemap 只收錄主地址。不建议在 Sitemap 里同时列出主地址和副本,那等于主動為两個入口各做一次 URL 發現。
一份可执行的自查顺序
- 從日誌里筛出抓取次數靠前、但地址寫法不统一的頁面。
- 逐個訪問這些寫法,確認返回碼是 200 還是 301。
- 检查模板與正文区,找出寫死舊地址的位置。
- 核對 Sitemap 與 canonical,確認两者與主地址一致。
- 修改後观察一段時間内的抓取地址分布是否收敛。
規范化不是一次性的工作。改版、更換證书、調整目錄结构时,都容易重新产生副本入口。把這些检查放進發布流程,比事後從日誌里翻要省力得多。