用蜘蛛池做 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、内容重复度、内链指向这些索引层的信号一起理顺,否则抓取再多,也只是在重复确认同一个取舍结果。