蜘蛛在站内發現 URL 的主要途径是連結,而連結里最容易失控的部分就是參數。同一個列表頁,加上 ?sort=new、?price=100-200、?page=3 之後,會變成一串看起来各不相同的地址。蜘蛛不會因為你觉得它們是同一個頁面就少抓,它看到的是一個個獨立 URL。
參數為什么會放大抓取量
一個只有 20 個條目的篩選维度,和分頁、排序组合起来,理论上能生成几十上百個 URL。這些 URL 大部分内容高度重复,只有几十個字的差异,甚至完全相同。對蜘蛛来说,它們都是待抓取對象;對服務器来说,它們都是真實請求。
問题不只是浪費。參數组合越多,蜘蛛越难判断哪個是主版本,權重和信号也容易被分散到一堆近重复頁面上。
先给參數分個類
分頁參數
page、p、start 這類參數通常承载真實内容,是應该被抓的。它們串起列表的深层内容,如果被挡掉,後面的條目可能就没有別的入口了。處理方式一般是:保留可抓,但控制頁數上限,別让分頁無休止地翻下去。
篩選與排序參數
sort、order、filter、price_range 這類參數,多數情况下只是同一批内容換了個顺序,往往是抓取量膨胀的主因。
- 如果篩選结果有獨立搜尋需求,可以考虑做成静態路径,並只保留少量有價值的组合。
- 如果没有獨立需求,用 canonical 指向無參數版本,或直接在 robots.txt 里挡掉。
- 不要让篩選連結出現在全站導航和頁脚里,那等于把參數頁提升成入口頁。
追踪與無關參數
utm_、ref、from、session id 這些參數和内容無關。它們最好在服務端或 CDN 层就清理掉,让带參數的請求跳轉到干净地址,而不是靠蜘蛛自己去判断。會话 ID 尤其要注意,同一個用戶每次訪問生成一個新 ID,會制造出無穷無尽的 URL。
内鏈设計比屏蔽更有效
robots.txt 只是不让抓,不代表 URL 不被發現,也不代表連結權重不传递。真正省事的做法是從源头减少參數連結的产生。
- 導航、面包屑、正文推荐位里的連結,尽量指向静態、無參數的地址。
- 列表頁的排序和篩選,預設用 JS 交互或表單提交,不生成新 URL。
- 如果确實需要可抓的篩選頁,用路径形式 /category/price-100-200/,並在頁面里寫清 canonical。
- 分頁使用可抓的 a 标簽,而不是纯 JS 点击加载,除非你能確認渲染後的連結可被解析。
服務器與抓取节奏
參數頁一旦被大量抓取,压力會集中在資料库查询上。篩選组合通常意味着多條件查询,比静態頁更重。如果日誌里出現大量带參數的請求集中在同一時間段,先看两件事:這類 URL 有没有被内鏈大量引用,以及响應時間是否明顯高于普通頁面。
控制方式並不复杂:给參數頁加缓存;在 robots.txt 里用通配符挡住明顯的组合,例如 /*?sort=;對确實不需要的目錄直接返回 410,而不是 200 空頁。返回 200 的空頁面會让蜘蛛反复来確認,反而更耗资源。
判断一個參數该不该放出去,可以問一句:這個 URL 的内容,用戶會主動搜到它吗?答案是否定的,就尽量別让它出現在内鏈里。
抓取路径上的检查清單
- 站点地图里是否混進了带參數的 URL?如果有,先清理。
- 頁脚、導航、相關推荐是否夹带了排序或追踪參數?
- 篩選頁是否做了 canonical,且指向可訪問的干净地址?
- 同一批内容是否存在两種以上可訪問形式,比如參數版和路径版?
- 日誌里參數 URL 的抓取占比是多少?如果超過三成,值得排查。
參數本身不是問题,失控的參數组合才是。把入口收窄一点,蜘蛛的抓取路径會更集中,服務器的压力也更可预测。