搜索抓取

Sitemap 和内链给出了两套地址,蜘蛛会按哪一套走

站点同时向蜘蛛发出几种信号:Sitemap 清单、内链指向、canonical 声明。三者一致时没问题,一旦打架,蜘蛛得到的信号就变模糊。本文说明蜘蛛更依赖哪一套,几种常见冲突的表现,以及按什么顺序把它们对齐,减少重复抓取和无效抓取。

搜索抓取

Sitemap 和内链给出了两套地址,蜘蛛会按哪一套走

一个页面要被抓取,得先被蜘蛛发现。而在“发现”这件事上,站点同时给蜘蛛发了好几种信号:Sitemap 里列的地址、内链指向的地址、canonical 声明的规范地址、robots.txt 允许的范围。多数时候它们是一致的,蜘蛛顺着走就行。但做站久了总会遇到互相打架的时候——清单里躺着一批页面,站内却找不到入口;内链指向 A 版本,Sitemap 里写的是 B 版本。信号一乱,蜘蛛通常不会帮你纠错,它只会按自己更容易接受的那条路径走。

内链是主干,Sitemap 更像补充

从蜘蛛的角度看,内链是自然爬行时会遇到的路径,成本低、上下文清楚;Sitemap 则是一份候选清单,蜘蛛会读,但不等于照着抓。清单里的地址如果没有内链支撑,被发现的概率会明显低一截。反过来,内链上有的页面,即使清单漏了,通常也能慢慢被抓到。所以两者冲突时,应该优先相信内链所描述的结构,让 Sitemap 去贴合它,而不是反过来。

几种常见的冲突场景

清单里有,内链里没有

典型情况是栏目改版或内容下架后,页面还留在 Sitemap 里,站内已经没有入口。蜘蛛按清单访问一次,发现没有内链指向,之后基本不会再回来。这类地址要么补回内链入口,要么从清单里删掉,不要挂着占位。

同一内容出现两个地址

内链用的是简短版本,Sitemap 里写的是带参数的版本,canonical 又指向第三个。三个地址都返回 200,蜘蛛就可能各抓一遍,日志里看着热闹,实际是重复消耗。这时需要把三者统一到同一个规范地址上,并让内链和清单都指过去。

内链指 A,实际跳到 B

站内链接写的是旧地址,靠 301 跳到新地址。蜘蛛能跟过去,但每跟一次都要多花一点时间,链接本身的指向也被打了折扣。把内链直接改成目标地址,比留一串跳转更省事。

参数版本与干净版本并存

排序、筛选、追踪参数生成的地址,如果既进 Sitemap 又出现在内链里,会稀释蜘蛛对真正内容页的注意力。常见做法是只把干净的规范地址放进清单,内链也指向它,参数页用 robots 规则或 canonical 收口。

清单里的地址返回非 200

Sitemap 里写着 301、404,或者被 robots.txt 拦住的地址,蜘蛛读一次就会把这些条目标成低优先。更麻烦的是它们占着清单篇幅,真正该被抓的页面反而没列进去。定期抽查清单里地址的状态码,是性价比很高的一件小事。

lastmod 长期不动或频繁跳动

lastmod 写的是页面真实更新时间,蜘蛛会拿它判断“值不值得再来一次”。长期没更新却写着今天,或者每次生成都刷一遍,都会让这个字段失去参考价值,之后再改也容易被忽略。

冲突时的处理顺序

  1. 先定规范地址:每个页面只保留一个可访问、返回 200 的版本。
  2. 让内链指向规范地址,能直连就直连,少用跳转。
  3. Sitemap 只放规范地址,并确认这些地址可以被抓取。
  4. 检查 robots.txt 与 canonical 有没有拦到本不该拦的页面。
  5. 改的时候三处一起对齐:内链、Sitemap、canonical,只改一处往往等于没改。

上线前可以顺手做的几件事

  • 从 Sitemap 里随机抽二十来个地址,看状态码和内链入口是否都正常。
  • 翻一遍主导航、面包屑和正文内链,确认它们指向的是规范地址。
  • 已下架的内容从清单移除,而不是留一个 404 占位。
  • 参数页、分页页是否必须进清单,多数情况下不必。
内链说的是“我这里确实有内容”,Sitemap 说的是“我记得这里有内容”。两者不一致时,蜘蛛更愿意相信前者。与其在清单里堆地址,不如先把站内的链接结构理顺。