一个页面要被抓取,得先被蜘蛛发现。而在“发现”这件事上,站点同时给蜘蛛发了好几种信号: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 写的是页面真实更新时间,蜘蛛会拿它判断“值不值得再来一次”。长期没更新却写着今天,或者每次生成都刷一遍,都会让这个字段失去参考价值,之后再改也容易被忽略。
冲突时的处理顺序
- 先定规范地址:每个页面只保留一个可访问、返回 200 的版本。
- 让内链指向规范地址,能直连就直连,少用跳转。
- Sitemap 只放规范地址,并确认这些地址可以被抓取。
- 检查 robots.txt 与 canonical 有没有拦到本不该拦的页面。
- 改的时候三处一起对齐:内链、Sitemap、canonical,只改一处往往等于没改。
上线前可以顺手做的几件事
- 从 Sitemap 里随机抽二十来个地址,看状态码和内链入口是否都正常。
- 翻一遍主导航、面包屑和正文内链,确认它们指向的是规范地址。
- 已下架的内容从清单移除,而不是留一个 404 占位。
- 参数页、分页页是否必须进清单,多数情况下不必。
内链说的是“我这里确实有内容”,Sitemap 说的是“我记得这里有内容”。两者不一致时,蜘蛛更愿意相信前者。与其在清单里堆地址,不如先把站内的链接结构理顺。