蜘蛛是按 URL 记帳的。同一個頁面,只要能用两種寫法訪問,在抓取队列里就是两條记錄:各自排队、各自占用预算、各自回传一份内容几乎相同的 HTML。很多站点觉得抓取量不少,但真正需要更新的頁面却迟迟不刷新,問题常常出在這里。
同一個頁面常见的几種寫法
下面這些差异,人眼看不出来,對 URL 来说却是两個不同的地址:
- 协议:http 與 https 各自算一條 URL。
- 主机名:example.com 與 www.example.com 是两條 URL。
- 大小寫:/About 與 /about 在多數服務器上是两個路径。
- 结尾斜杠:/list 與 /list/ 是否算同一頁,取决于服務器配置。
- 預設文件名:/index.html、/index.php 與目錄根。
- 參數:排序、分頁、来源追踪參數的顺序與有無。
單看每一條都不算什么,叠在一起,一個頁面可能生出七八個可訪問地址。
抓取量是怎么被分掉的
抓取队列里排的是 URL,不是“頁面”。当同一份内容有多個地址,通常會發生三件事:
- 多個 URL 争夺同一份抓取額度,每個都抓得少、更新慢;
- 内鏈如果指向不同寫法,連結信号被拆到几個地址上;
- 日誌里抓取次數看着不少,按路径去重之後有效頁面却不多。
這不一定會立刻带来排名問题,但它會让该被重新抓取的頁面排在更後面。
收敛的四步
選定一個規范地址
确定唯一的协议、主机名與路径寫法,其余寫法一律 301 到它。301 是服務器端動作,比頁面里的 canonical 更确定。
内鏈只寫規范地址
導航、面包屑、正文連結、分頁連結统一指向同一寫法。内鏈是蜘蛛發現 URL 的主要入口,入口寫成什么样,它就记成什么样。
Sitemap 只放規范 URL
Sitemap 是“希望被抓的地址清單”。把變体寫進去,等于主動請蜘蛛去抓重复内容。
canonical 用来兜底
canonical 是提示而非指令。当 301 不便實施(例如參數頁需要保留)时用它补充,但不要拿它替代 301。
容易被忽略的几個角落
- 站内搜尋、篩選、排序生成的參數連結,是否有對應處理;
- 分享、广告、邮件里的追踪參數,落地頁會不會被记成新地址;
- 歷史連結里的大小寫混用,服務器是否统一;
- CDN 回源时 Host 是否归一,避免同一内容在两套主机名上都可訪問。
怎么驗證
從日誌里按路径去重再看一遍抓取分布:把协议、大小寫、斜杠归一之後,統計每個路径被訪問的次數。如果归一後的次數明顯低于归一前的總和,說明變体确實在分走抓取量。归一之後如果某個路径仍長期不被訪問,那更可能是内鏈或 Sitemap 上的入口問题,而不是 URL 寫法問题。
抓取額度不會因為多寫了几個地址而變大,只會被摊薄。
URL 寫法的统一是一件偏底层的事,不做也不會立刻出問题,但它决定了後續的抓取效率是否被無谓消耗。先把地址收敛干净,再谈抓什么、什么时候抓,會省下不少功夫。