一個頁面要被抓取,得先被蜘蛛發現。而在“發現”這件事上,站点同时给蜘蛛發了好几種信号: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 说的是“我记得這里有内容”。两者不一致时,蜘蛛更愿意相信前者。與其在清單里堆地址,不如先把站内的連結结构理顺。