用蜘蛛池做 URL 發現时,经常遇到一種情况:入口頁正常返回 200,搜尋蜘蛛也确實過来抓了目标 URL,但過一段時間去看,被收錄的却是另一個頁面。排查下来,目标 URL 的 HTML 里寫着一條 canonical,指向了別處。這时候很多人會問:既然最後收錄的不是它,那這次抓取還有意义吗?
先把抓取和收錄分開看
搜尋蜘蛛的動作可以拆成两步:抓取(fetch)和索引(index)。canonical 属于頁面提供给搜尋引擎的索引层信号之一,它本身並不阻止抓取。只要入口頁上的連結是普通可抓取的 a 标簽、目标 URL 没有被 robots 拦截、服務器正常响應,搜尋蜘蛛一般還是會去抓這個地址,canonical 不會让抓取這件事不發生。
真正被 canonical 影响的是後半段:這個 URL 值不值得作為一條獨立结果進入索引。所以“抓了還有没有意义”這個問题,要先看你希望它被收錄,還是只希望它被抓到。
canonical 在不同情形下的表現
1. 自己指向自己
目标 URL 的 canonical 指向自身,這是最干净的狀態。抓取信号和索引信号一致,入口頁带来的抓取基本能被正常消化,頁面的收錄判断也不會因為這條标簽而产生歧义。
2. 指向同站另一個頁面
這是蜘蛛池场景里最常见、也最容易出問题的一種。搜尋蜘蛛仍然會抓目标 URL,但會更倾向于把 canonical 指向的那個地址当作代表頁。如果被指向的頁面内容更完整、内鏈更多,這個结果通常是合理的;如果你其實希望两個頁面各自收錄,那就是 canonical 寫错了位置。
3. 指向跨站地址或無效地址
canonical 是提示而非强制指令。如果它指向一個 404、被 robots 拦截、或者明顯不相關的跨站頁面,搜尋蜘蛛通常不會照單全收,而是结合内容、内鏈、URL 结构自己判断。這種情况下,目标 URL 反而有可能被当作代表頁收錄,结果和寫标簽时的预期正好相反。
蜘蛛池场景下的實际建议
- 先確認目的。入口頁鏈向的如果是聚合頁、篩選頁、带參數的列表頁,本来就不打算單獨收錄,寫 canonical 是合理做法,不必因為“抓了但不收錄”而硬改。
- 不要為了收錄而删 canonical。如果两個頁面内容确實高度重复,删掉标簽只會把重复内容的問题留给搜尋引擎去猜,结果往往更差。
- 检查 canonical 鏈。A 指向 B、B 又指向 C,這種鏈條會让搜尋蜘蛛多绕一圈,最後可能谁都没有被選中。
- 入口頁連結本身仍有價值。即使目标 URL 最终不單獨收錄,抓取路径依然有助于發現頁面上的其他連結、更新缓存,让新内容更快進入候選池。
- 別用 canonical 替代 robots。两者作用不同,一個管索引信号,一個管抓取许可,混用容易两头都不讨好。
自查顺序
- 用不带 JavaScript 的方式查看目标 URL 的 HTML 源碼,確認 canonical 的實际取值,而不是只看浏览器渲染後的结果。
- 確認被指向的地址可以正常訪問、返回 200,並且没有被 robots.txt 或頁面上的 meta robots 拦住。
- 如果是自己寫的 canonical,检查是否存在模板批量輸出導致的错誤指向,尤其是多語言、多分站场景。
- 在日誌或抓取记錄里確認搜尋蜘蛛确實抓到了目标 URL,把“根本没抓到”和“抓到了但被 canonical 合並”這两種完全不同的情况区分開。
- 根據頁面定位决定是保留、修正還是移除 canonical,一次只改一項,观察一段時間再判断效果。
抓取是發現,收錄是取舍。蜘蛛池能影响的主要是前者,後者由頁面自身信号和整站质量决定。
所以回到最初的問题:目标 URL 有 canonical 指向別處时,蜘蛛池带来的抓取多數情况下仍然有意义——它让搜尋蜘蛛知道了這個地址存在,也让它有机會顺着頁面繼續發現更多連結。但如果你期待的是“這個 URL 被單獨收錄”,那就不能只靠入口頁,還要把 canonical、内容重复度、内鏈指向這些索引层的信号一起理顺,否則抓取再多,也只是在重复確認同一個取舍结果。