蜘蛛池的入口頁要能被蜘蛛發現,前提是 URL 本身足够干净、稳定、可复現。參數處理看起来只是技術细节,但它直接决定蜘蛛拿到的是同一個 URL,還是十個看起来不同的 URL。同一份内容被拆成多個地址,抓取资源被分散,日誌里也會出現一堆难以判断的记錄。
參數為什么會干扰蜘蛛的判断
蜘蛛對 URL 的识別基于字符串。查询字符串里多一個字符、顺序換一下、大小寫不同,在它眼里就是另一個地址。如果入口頁通過带參數的地址分發連結,而這些參數每次生成都不一样,蜘蛛會把它当成新頁面反复抓取,實际内容却完全一致。
更麻烦的是參數值由程序随机或按時間生成。比如带時間戳的跳轉地址、带随机 token 的入口連結,蜘蛛抓過一次,第二次遇到同样的目标頁时,可能因為 URL 不同而重新進入抓取队列。這通常不會直接導致什么惩罚,但會浪費抓取频次,也會让日誌統計失真。
哪些參數该留,哪些该去掉
追踪參數
utm_source、utm_medium、gclid 這類參數是给統計工具用的。蜘蛛不需要,入口頁也不需要。如果入口頁的連結里带着這些參數,最好在生成連結时就去掉,或者在服務端做一次归一化。保留它們只會制造重复地址。
分頁與篩選參數
page、p、sort、filter 這類參數如果确實對應不同内容,可以保留,但要注意別让蜘蛛無限翻頁。入口頁如果只是列表頁,翻到第 50 頁還是同一批連結,就该在某個位置停止輸出連結,或者用 rel="next" 之類的方式给出邊界。單纯靠蜘蛛自己判断,往往不如自己先设一個上限。
會话與身份參數
sessionid、sid、token、user_id 這類參數不该出現在入口頁的對外連結里。它們既暴露结构,又让同一個頁面产生無數變体。蜘蛛訪問时通常没有會话,入口頁返回的内容應该和普通訪客看到的一致,不要因為缺少參數就跳轉或报错。
參數顺序、大小寫與编碼
?a=1&b=2 和 ?b=2&a=1 是两個 URL。如果入口頁生成連結时顺序不固定,同一批内容就會产生多種地址。建议在生成环节统一參數顺序、统一參數名的大小寫,並對參數值做一致的编碼處理。中文或特殊字符要按同一套規則轉义,避免一半是 %E4%B8%AD 一半是原字符。
路径部分也要注意。末尾带不带斜杠、是否强制小寫、是否带 index.html,最好在入口頁层面统一成一種形式,其余形式用 301 归拢到規范地址。蜘蛛對连續重定向的容忍度有限,別让同一個頁面连跳两次以上。
清理參數时容易踩的坑
- 把带參數的真實内容頁也一並清理,導致部分頁面無法訪問。
- 用 JS 在客戶端删參數,蜘蛛拿到的初始 HTML 里仍然带着參數。
- 只清理入口頁的連結,忽略了 sitemap 或推送接口里带參數的地址。
- 归一化規則寫得過于激進,把不同内容合並成同一個 URL。
判断标准其實很简單:如果两個 URL 返回的正文主体几乎一致,只是參數不同,就應该考虑合並或去掉參數;如果内容确實不同,就保留,並让參數有意义、可讀、稳定。
一個可执行的處理顺序
- 導出入口頁目前輸出的所有連結,按參數名分组統計。
- 标记出纯追踪類參數,直接在生成环节去掉。
- 對内容型參數,確認每個取值是否對應獨立内容,不是就合並。
- 统一參數顺序、大小寫和编碼方式,寫進生成規則。
- 用 301 把歷史遗留的重复地址归拢到規范形式。
- 观察一段時間日誌,看重复 URL 的抓取量是否下降。
參數不是越多越好,也不是一律清空就好。入口頁的 URL 只要做到同一份内容只有一個稳定地址,抓取效率就已经提高了。
最後提醒一点,參數處理属于基础工程,做對了不會因此带来排名,但做错了會持續消耗抓取资源。把入口頁的 URL 規則固定下来,比反复調整連結數量更有意义。