很多站点在内容數量上没有明顯增長,抓取日誌里的 URL 却翻了好几倍。翻一翻被频繁請求的地址,往往不是新頁面,而是同一批内容套上不同參數的版本:?utm_source=…、?orderby=price、?page=2&filter=red。參數本身没有错,但当它可以被蜘蛛自由组合时,一個栏目就可能衍生出成百上千個可抓取的地址。
參數是從哪里進来的
先要弄清楚這些地址是天然存在的,還是被頁面連結带出来的。常见来源有三個:
- 外部推廣:广告、邮件、社交平台附加的跟踪參數,通常只出現在少數落地頁上。
- 站内交互:篩選、排序、分頁、视图切換,往往由前端拼接進連結或表單。
- 程序與中間件:會话标识、語言偏好、缓存标记,有时會被服務端自動附加到 URL 上。
外部来源的參數影响相對有限,真正需要處理的是站内交互生成的連結,因為它們會被蜘蛛反复爬到,並顺着内鏈扩散到全站。
判断這段參數该不该被抓
不是所有带參數的地址都要屏蔽。判断标准可以简單一些:這段參數是否产生了用戶看得见、且值得被搜尋到的獨立内容。
- 值得保留:真正的内容篩選,例如某品牌、某價格区間或某场景的聚合頁,有獨立标题、稳定地址和持續價值。
- 應当合並:排序方式、每頁條數、列表與網格视图切換,内容相同,只是排列或呈現不同。
- 應当屏蔽或丢弃:會话标识、跟踪參數、空篩選值、無效的排序字段。
處理顺序:先改連結,再谈規則
不少站点一上来就寫 robots.txt 或加 canonical,结果參數連結仍然從頁面里被蜘蛛發現,只是抓回来被拦掉了。更稳妥的顺序是:
- 從連結源头减少:排序、视图切換這類交互尽量走前端狀態,不生成可点击抓取的連結;跟踪參數只在外部落地頁使用,站内連結不再携带。
- 给出規范地址:确實要保留的篩選頁,在頁面上加自引用 canonical,指向该篩選结果自身的干净 URL,而不是一律指回主列表。
- 统一參數寫法:同一個篩選值只用一種形式,避免大小寫、參數顺序、空值造成多個地址。
- 必要时才用 robots.txt:屏蔽只對抓取生效,被屏蔽的地址仍有可能被收錄成無描述的结果。屏蔽與 canonical 同时使用时,要確認两者不冲突。
- 服務端兜底:對無意义的參數直接 301 到干净地址,或明确返回 404,比放任程序生成空白頁更清晰。
几個常见誤区
- 把過滤參數整体屏蔽,等于把有價值的篩選聚合頁一起關掉。
- canonical 一律指向主列表頁,但篩選頁在标题和内容上差异很大,用戶点進来會觉得货不對板。
- 只在頁面里加 canonical,站内連結却仍然大量指向带參數的地址。
- 分頁參數與多個篩選參數叠加,形成组合爆炸,却没有對這類组合做任何限制。
處理之後要看什么
規則生效不等于問题解决,還是要去日誌里看真實請求。重点观察三件事:带參數請求的占比是否下降;被請求的參數组合是否集中在少數几類;改動過的地址返回狀態碼是否與预期一致。也可以定期從站内連結出發抓一遍 URL,統計參數出現的模式,通常比翻代碼更快找到入口。
參數治理的目标不是让带參數的 URL 彻底消失,而是让每一類參數都有明确归属:要么是值得收錄的獨立頁面,要么是不该浪費抓取资源的重复地址。