在蜘蛛池里,入口頁上挂着同一個目标頁的好几種 URL 寫法,是很常见的事。有人甚至觉得這样等于多推了几次。實际上蜘蛛並不會這么理解:對它来说,這几種寫法要么是同一個頁面,要么是几個内容高度相似、需要逐一去確認的頁面,两種情况都要花掉抓取次數。
本文只谈一件事:蜘蛛池入口頁的 URL 归一化。它不复杂,核心就是把同一個頁面只用一種寫法這件事做扎實。
重复 URL 一般從哪来
先看来源。蜘蛛池的入口頁大多靠程序批量生成,URL 到底唯不唯一,取决于生成規則寫得细不细。常见的重复来源有這几類:
- 大小寫不一致:/Page/1 與 /page/1 在多數服務器上等價,但蜘蛛按字面区分。
- 尾斜杠:/abc 與 /abc/ 经常都能返回正常頁面。
- 协议與主机名:http 與 https、带 www 與不带 www,如果没做跳轉,就是四份 URL。
- 預設文件名:/index.php、/index.html 與根目錄 / 往往指向同一個頁面。
- 查询參數:utm_source、from、ref、随机 id 之類的參數,每換一次就是一個新 URL。
- 分頁參數:?page=1 與不带參數的第一頁。
- 連結里锚点寫法與參數值大小寫混杂。
這些問题在普通站点上也會出現,但蜘蛛池的入口頁量大、更新频繁,一旦規則没寫死,重复會被成倍放大。
重复抓取的代價不只是浪費
最常被提到的代價是抓取预算。蜘蛛對一個站点的抓取總量在一段時間内大致存在上限,重复 URL 越多,真正需要被發現的頁面能分到的次數就越少。這一点在入口頁數量多、目标頁也多的时候尤其明顯。
除此之外還有两個更隐蔽的代價:
- 日誌失真:同一條請求在日誌里分散成好几種路径,統計某個入口頁被蜘蛛訪問了几次时會偏低或偏高,判断池子有没有起作用就失去了依據。
- 頁面價值判断受影响:如果一個入口頁只有連結、几乎没有内容,而它又被蜘蛛以多種 URL 反复抓取,容易被看成低價值的重复頁,進而影响後續的抓取频率。
把重复 URL 理解成多一次曝光是一種错觉。多出来的那几次抓取不會轉化成額外的發現机會,只是把同样的工作重复做了一遍。
归一化的几個基本動作
先把内部連結寫统一
入口頁上指向目标頁的連結,寫法必须统一:统一用小寫、统一用绝對路径、统一带或不带 www、统一带或不带尾斜杠。批量生成的时候,這些規則最好寫進模板里,而不是靠後期手工修。
用 301 把變体收拢
如果同一頁面已经可以從多個地址訪問,用 301 把變体统一跳到規范地址。301 的语义是永久的,蜘蛛在多次遇到後通常會记住規范地址,後續抓取以它為准。相比之下,302 容易被理解為临时跳轉,收拢效果不如 301 稳定。
用 canonical 作為补充
對于 URL 结构本身不方便改的情况,比如带有业務參數的頁面,可以在頁面头部加 canonical,指向規范地址。canonical 是建议而不是强制,所以它更适合当作补充手段,而不是替代内部連結统一。
蜘蛛池场景下的几個注意点
- 目标頁的規范 URL 最好只有一份,並在推送时固定使用它。
- 入口頁的連結列表尽量別带追踪參數。需要統計的话在服務端记錄,不要寫進 URL。
- 分頁的第一頁统一使用不带參數的形式,避免 ?page=1 與根路径並存。
- 如果入口頁本身也是批量生成的,注意生成規則不要产出參數互不相同、内容却完全一样的頁面。
- 站点地图、其他入口頁里出現的同一個頁面,寫法也要保持一致。
怎么自查有没有問题
- 從訪問日誌里按路径去重,看看同一個頁面被訪問過的不同寫法有多少種。
- 對比日誌里的總請求數和去重後的頁面數,差距越大,說明重复越嚴重。
- 挑一個目标頁,在入口頁里搜尋它的連結,看看一共出現了几種寫法。
- 把發現的變体逐一用 301 或统一連結處理掉,再观察一段時間日誌。
归一化不會让蜘蛛突然多来几次,它解决的是別把有限的抓取次數用在重复的地方。這件事做完,日誌會更干净,效果评估才有意义;否則你看到的抓取量,可能有一大半是同一個頁面被反复抓的計數。