蜘蛛抓取站点时,第一步不是下载頁面,而是决定“這個 URL 值不值得抓”。如果站点自己把同一個頁面暴露成多個地址,蜘蛛就會把它們当成不同入口,分別排队、分別抓取。URL 归一化要解决的正是這件事:让蜘蛛明确知道哪個地址才是這個頁面的代表。
蜘蛛眼里的“不同 URL”有哪些
很多差异在浏览器里看起来一样,但對抓取程序来说就是另一個字符串。
- 大小寫:/Page 和 /page 在多數服務器上可能指向同一内容,但 URL 本身不同。
- 末尾斜杠:/list 和 /list/ 是否等價,取决于服務器配置,蜘蛛不會自動合並。
- 协议與主机名:http 與 https、带 www 與不带 www,都是不同的主机入口。
- 預設端口::80 或 :443 寫出来與不寫出来,可能形成两個地址。
- 查询參數:顺序不同、跟踪參數、會话 ID、排序篩選參數,都會制造大量變体。
- 锚点片段:#section 通常不參與服務器請求,但頁面内連結寫多了,容易让人誤以為产生了新 URL。
归一化没做好,抓取路径會變成什么样
最直接的影响是抓取预算被摊薄。蜘蛛本来可以用于更新重要頁面的時間,被拿去反复請求同一内容的多個地址。日誌里看起来抓取量很大,實际有效覆盖並没有增加。
其次是信号分散。内鏈、外鏈、Sitemap、canonical 如果各指一個變体,蜘蛛收到的就是互相矛盾的提示:到底哪個地址该被当作代表頁?在极端情况下,蜘蛛可能把權重和更新信号分给不同地址,頁面表現變得不稳定。
归一化不是“消灭所有參數”,而是让蜘蛛在發現 URL 时,能沿着一條明确的路径走到代表頁,而不是在几個等價地址之間反复打轉。
站点可以做的几件事
1. 内鏈先统一
站内連結是蜘蛛最常走的路径。導航、面包屑、列表頁、正文推荐位,都尽量指向同一個規范地址。如果模板里有时輸出 /list,有时輸出 /list/,蜘蛛就會跟着两個入口走。
2. 用 301 收拢舊變体
已经存在的變体,尽量用 301 永久重定向到規范地址。重定向鏈不要太長,一次跳到目标比多次跳轉更容易被顺利跟進。服務器要稳定返回 301,不要时而 302、时而 200。
3. canonical 與 Sitemap 保持一致
canonical 标簽是頁内提示,Sitemap 是站点級清單,两者最好都寫規范 URL。如果 Sitemap 里同时提交多個變体,等于主動把重复入口递给蜘蛛。
4. 參數處理要有邊界
篩選、排序、分頁參數有些是内容必需的,有些只是跟踪或會话用途。對後者,可以在服務器或抓取設定里做归並,但不要一刀切屏蔽,以免誤伤真正需要被發現的列表頁。
服務器稳定性也在影响归一化效果
归一化方案再清晰,如果服務器响應不稳定,蜘蛛可能跟到一半就放弃。301 返回超时、規范頁偶發 5xx、重定向目标不可達,都會让蜘蛛退回舊變体繼續抓。保持响應碼明确、跳轉目标可用,比堆更多規則更重要。
一個简單的自查清單
- 站内連結是否始终指向同一套規范 URL?
- http/https、www/非 www 是否只有一個主入口?
- 舊變体是否 301 到規范地址,且跳轉鏈尽量短?
- canonical 與 Sitemap 里的地址是否一致?
- 跟踪參數是否被有效识別,而不是被当成新頁面?
- 規范頁是否稳定返回 200,服務器超时是否可控?
把這些基础項對齐後,蜘蛛的抓取路径會更干净:發現的是規范 URL,跟進的也是規范 URL,抓取预算才更可能花在真正需要更新的内容上。