做蜘蛛池时,很多人习惯在入口頁的目标連結後面加一串參數,比如 ?utm_source=pool1 或 ?from=entry05,用来区分流量来源。這样寫本身没問题,但需要先清楚一件事:搜尋蜘蛛看到的是 URL,不是你的統計意图。
带參數的 URL,在搜尋蜘蛛眼里算不算新頁面
從技術上讲,URL 不同就是不同资源,抓取系統會按不同地址分別請求。至于它最终會不會把两個變体当成同一個頁面,取决于平台自己的參數處理規則,這類規則不公開,也不固定。常见可能出現三種结果:
- 识別為已知的跟踪參數,直接忽略或归一到無參版本;
- 保留參數分別抓取,但只選擇一個版本進入索引;
- 完全当成两個獨立 URL,分別抓取、分別處理。
你無法指定它走哪條路,只能通過日誌和抓取结果去观察實际表現。
參數變体被單獨抓取,會带来什么
- 抓取预算被切碎:同一個目标 URL 有五種參數寫法,就可能是五倍請求量,而信息量几乎為零。
- 日誌失真:路径統計看起来很热闹,去掉參數後,真正被覆盖的目标 URL 數量可能没變。
- 归因變模糊:不同入口頁用不同參數指向同一個目标,很难判断到底是哪個入口頁起了作用。
- 容易生成無限變体:參數里一旦带上時間戳、排序值、會话 ID,组合會越来越多。
哪些參數相對安全,哪些要小心
区分的核心在于:這個參數是否改變頁面正文内容。
- utm_*、gclid、fbclid、spm 這類纯跟踪參數,被忽略的概率較大,但不保證。
- ?id=、?p=、?page=、?cat= 這類决定内容的參數,必须保留。
- 會话 ID、排序、篩選组合、時間戳,最容易制造大量低價值變体,應尽量避免寫進静態連結。
怎么判断有没有被重复抓取
- 在服務器日誌里,把同一目标路径的請求按 query string 分组,看带參與不带參的比例。
- 對比不同入口頁指向的同一個目标 URL,是否出現了多種參數寫法。
- 抽查几個目标 URL,確認被采用的版本是不是無參的那一個。
- 隔一段時間再看一次,观察變体數量是在收敛還是持續增加。
日誌里出現大量带參請求,並不等于抓取效率高;有时恰好說明抓取预算被同一條路径的多個變体消耗掉了。
比較稳妥的做法
- 入口頁里指向目标 URL 的連結,尽量寫成無參形式,来源統計放在服務端日誌或前端脚本里做。
- 如果确實需要參數区分来源,就固定參數顺序和寫法,不要每次生成新的随机值。
- 存在带參版本时,用 canonical 指向無參版本,作為表達偏好的手段,它不是强制指令。
- 不要為了“省抓取”直接把參數路径寫進 robots.txt 的 Disallow,那同时也切断了連結發現路径。
两個常见誤区
- “加了 canonical 就一定不會重复抓取”:canonical 只是提示,抓取阶段仍可能對變体發起請求。
- “參數一定會被忽略,所以随便加”:忽略與否取决于平台規則,把關键連結建立在不确定的假设上並不划算。
在實际运营中,更值得關心的不是參數會不會被抓,而是每個參數變体背後指向的是不是同一個目标 URL。如果是,參數带来的往往只是額外的請求量,而不是額外的覆盖范围。定期比對日誌里的路径分布,比纠结平台規則更有效。