搜尋抓取

參數化 URL 的抓取代價:同一份内容為什么會有多個地址

站内排序、篩選和追踪參數會让同一批内容對應多個地址,蜘蛛需要逐個抓取、逐個去重。本文梳理參數如何造成地址膨胀、它對抓取预算的影响,以及用 canonical、robots.txt、内鏈清理和篩選頁取舍来收敛地址的具体做法。

搜尋抓取

參數化 URL 的抓取代價:同一份内容為什么會有多個地址

在服務器日誌里翻蜘蛛的抓取记錄,经常會看到同一批内容對應着一長串地址:带 sort 的、带 filter 的、带 utm 的、带 sessionid 的。它們在蜘蛛眼里不是“同一個頁面的變体”,而是各自獨立的 URL,各自要排队、各自要抓一次。

參數是怎么把地址拆開的

一個典型的列表頁,只要開放了排序和篩選,地址數量就會随着可選维度的组合快速膨胀。常见的參數類型包括:

  • 排序類:sort=price、order=desc,同一批内容換個顺序就變成一個“新地址”。
  • 篩選類:品牌、價格区間、颜色,两两组合就能生成几十上百個地址。
  • 追踪類:utm_source、from、ref,本来是给統計工具看的,對頁面内容没有任何影响。
  • 會话類:早期站点常见的 sessionid、sid,每個訪客生成的地址都不一样。

其中只有篩選類可能承载真實的、有搜尋需求的内容,其余几類基本属于纯粹的地址膨胀。

為什么這會让蜘蛛做大量無用功

蜘蛛的去重通常發生在抓取之後,也就是说,它得先把頁面拉回来,才能判断内容是不是已经见過。這意味着:

  • 每個參數组合都會消耗一次抓取配額,挤占真正需要更新的頁面。
  • 新發現的大量地址會進入抓取队列,把老頁面的回訪周期拉長。
  • 同一批内容被反复抓取,服務器端的開销和带宽也跟着上去。

對小站来说,抓取预算本来就有限,被參數吃掉一部分之後,新發布的内容可能要等更久才被發現。

几種收敛办法,以及各自的邊界

canonical 指向标准地址

可以在带參數的頁面上加 canonical,指向不带參數的版本。它表達的是“這几個地址代表同一份内容”。需要注意的是,canonical 是建议而非强制,蜘蛛仍然可能出于其他原因去抓參數地址,但它在合並信号时是有價值的。

robots.txt 里處理參數

對于纯追踪參數,可以在 robots.txt 里用通配符屏蔽,例如 Disallow: /*?utm_ 這類規則,能减少一部分無效抓取。但要小心:robots.txt 屏蔽的是抓取,不是索引。如果被屏蔽的地址在別處有外鏈,它仍可能以缺少描述的形式出現在结果里。所以只對确定没有内容的參數使用。

内鏈里不要带無意义參數

很多參數地址其實是站内連結自己带出来的:導航、面包屑、列表頁里的“下一頁”如果拼上了追踪參數,就等于在每個頁面上主動告诉蜘蛛“這里還有一個新地址”。清理模板里的這類拼接,往往比事後屏蔽更有效。

把參數收敛当成連結規范的一部分来看,比單獨去處理某几個地址更省事。

篩選頁面的取舍

篩選组合如果确實有搜尋需求,可以考虑保留一部分,其余用 noindex 或 canonical 收拢;如果没有需求,直接用 robots.txt 屏蔽,或者把前端交互改成不改變地址的形式。不要一邊屏蔽抓取、一邊又在站内鏈過去,那會让蜘蛛反复撞墙。

怎么確認參數地址真的被大量抓取

几個可以直接看的信号:

  • 服務器日誌里带問号的請求占比,以及這些請求的返回碼分布。
  • 站点地图和抓取統計中,參數地址被發現的量與抓取频率。
  • 站内搜尋、篩選項被点開时,地址栏是否發生變化。

一個可执行的顺序

  1. 先把參數按類型列出来,区分“有内容”和“無内容”。
  2. 無内容的追踪類、會话類參數,從模板和連結里清掉。
  3. 有内容的篩選组合,评估搜尋需求後决定保留、收拢還是屏蔽。
  4. 统一标准地址,让 canonical、内鏈、Sitemap 保持一致。
  5. 改完之後观察几周日誌,看參數請求是否下降、核心頁面回訪是否變快。

參數本身不是問题,問题是它让同一份内容有了太多入口。把入口收敛到少數几個明确的地址上,蜘蛛的判断會简單很多,站点运营也更容易看清哪些頁面真的在被抓。