搜尋抓取

URL 參數與蜘蛛抓取:篩選、排序和分頁參數该怎么取舍

同一批内容因為排序、篩選、分頁和追踪參數,可能變成成百上千個 URL。本文按參數類型拆解它們對蜘蛛抓取的影响,並给出内鏈、canonical、robots 與缓存上的處理思路,让抓取路径更集中,服務器压力更可控。

搜尋抓取

URL 參數與蜘蛛抓取:篩選、排序和分頁參數该怎么取舍

蜘蛛在站内發現 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 不被發現,也不代表連結權重不传递。真正省事的做法是從源头减少參數連結的产生。

  1. 導航、面包屑、正文推荐位里的連結,尽量指向静態、無參數的地址。
  2. 列表頁的排序和篩選,預設用 JS 交互或表單提交,不生成新 URL。
  3. 如果确實需要可抓的篩選頁,用路径形式 /category/price-100-200/,並在頁面里寫清 canonical。
  4. 分頁使用可抓的 a 标簽,而不是纯 JS 点击加载,除非你能確認渲染後的連結可被解析。

服務器與抓取节奏

參數頁一旦被大量抓取,压力會集中在資料库查询上。篩選组合通常意味着多條件查询,比静態頁更重。如果日誌里出現大量带參數的請求集中在同一時間段,先看两件事:這類 URL 有没有被内鏈大量引用,以及响應時間是否明顯高于普通頁面。

控制方式並不复杂:给參數頁加缓存;在 robots.txt 里用通配符挡住明顯的组合,例如 /*?sort=;對确實不需要的目錄直接返回 410,而不是 200 空頁。返回 200 的空頁面會让蜘蛛反复来確認,反而更耗资源。

判断一個參數该不该放出去,可以問一句:這個 URL 的内容,用戶會主動搜到它吗?答案是否定的,就尽量別让它出現在内鏈里。

抓取路径上的检查清單

  • 站点地图里是否混進了带參數的 URL?如果有,先清理。
  • 頁脚、導航、相關推荐是否夹带了排序或追踪參數?
  • 篩選頁是否做了 canonical,且指向可訪問的干净地址?
  • 同一批内容是否存在两種以上可訪問形式,比如參數版和路径版?
  • 日誌里參數 URL 的抓取占比是多少?如果超過三成,值得排查。

參數本身不是問题,失控的參數组合才是。把入口收窄一点,蜘蛛的抓取路径會更集中,服務器的压力也更可预测。