蜘蛛發現一個 URL 後,通常不會先判断“這個頁面我是不是已经抓過”,而是把 URL 当作唯一标识放進待抓队列。只要地址字符串不同,它就可能当成新頁面再抓一次。同一篇内容如果存在多個地址,重复抓取就會消耗抓取预算,也會让頁面信号變得分散。
同一内容為什么會出現多個 URL
常见差异不一定是有人故意制造,很多是技術配置自然产生的:
- 大小寫不同:/Article/123 和 /article/123 在蜘蛛眼里是两個 URL。
- 末尾斜杠有無:/page 與 /page/ 可能被分別抓取。
- 协议與主机名:http 與 https、www 與非 www、带端口與不带端口。
- 參數顺序或跟踪參數:?a=1&b=2 與 ?b=2&a=1,以及 utm、ref、session 等。
- 分頁、排序、篩選參數:同一列表頁因參數组合生成大量地址。
- 打印頁、AMP、移動版等獨立地址。
這些地址如果都返回 200,且没有明确信号告诉蜘蛛“哪個是主地址”,蜘蛛就可能多次来訪。
蜘蛛如何判断该抓哪個地址
蜘蛛主要依赖几個信号:
- 301 跳轉:把舊地址永久指向新地址,抓取路径會在第一跳後收口。
- canonical:在頁面头部声明規范地址,告诉蜘蛛這一组地址中哪個是主版本。
- Sitemap:只提交規范地址,减少蜘蛛從清單里發現重复 URL 的机會。
- 内鏈锚点:站内連結尽量指向主地址,不要让同一内容在導航里出現多個版本。
需要注意的是,canonical 是提示,不是强制命令;301 更明确,但只适合地址真正迁移的场景。两者如果互相矛盾,蜘蛛會重新判断,收口效果反而變差。
用 canonical 和 301 把地址收口
如果是协议、域名、路径结构變化,優先用 301。比如全站從 http 迁到 https,或從带 www 统一到不带 www,應让舊地址整站跳轉到新地址,而不是只在部分頁面加 canonical。
如果是同一頁面因參數、打印版、排序方式产生多個地址,更适合用 canonical。規范地址應当是自己返回 200、可正常抓取、内容完整的版本。不要把 canonical 指向一個 404、重定向或 noindex 的頁面。
一個常见誤区:把带參數的篩選頁全部 canonical 到無參數列表頁。如果篩選頁有獨立搜尋價值,這样可能让蜘蛛不再抓取篩選内容;如果篩選頁只是组合參數,則可以考虑用 robots 或參數處理規則收口。
Sitemap 與内鏈只保留主地址
Sitemap 是地址清單,不是越多越好。把同一内容的多個版本都寫進 Sitemap,等于主動告诉蜘蛛有更多 URL 需要抓。更稳妥的做法是:
- Sitemap 只放規范 URL,並保持與頁面 canonical 一致。
- 站内導航、面包屑、相關推荐等連結,统一指向規范地址。
- 分頁、篩選、排序等參數地址,按實际需要决定是否進入 Sitemap。
- 跟踪參數尽量在生成連結时去除,不要等蜘蛛抓到後再處理。
怎么检查重复抓取有没有减少
可以结合服務器日誌和抓取工具观察:
- 日誌中同一路径带不同參數、大小寫、斜杠的訪問量是否下降。
- 抓取工具請求主地址时,返回的 canonical 是否指向自己。
- Sitemap 中的 URL 與頁面 canonical 是否大面积一致。
- 带參數 URL 的抓取频次是否仍然很高,如果高,检查内鏈或 JS 是否在大量生成參數連結。
URL 归一化不是一次性配置。改版、上新功能、加統計參數都可能重新产生重复地址。把 canonical、301、Sitemap 和内鏈当作一套持續维護的規則,蜘蛛的抓取路径會更干净,抓取预算也更可能用在真正需要更新的頁面上。