常见問题

入口頁連結带跟踪參數或 # 锚点:搜尋蜘蛛會当成两個 URL 重复抓取吗

入口頁連結一旦带上 utm_source 之類的跟踪參數,或者加上 # 锚点,URL 字符串就變了样。本文說明搜尋蜘蛛對查询參數的通常處理方式、锚点為什么不會額外产生請求,以及蜘蛛池入口頁在輸出連結、使用 canonical 和用日誌驗證时该注意什么。

常见問题

入口頁連結带跟踪參數或 # 锚点:搜尋蜘蛛會当成两個 URL 重复抓取吗

在蜘蛛池入口頁上放連結时,一個很常见的小動作是给連結加上各種尾巴:?utm_source=xxx、?from=spider,或者干脆加個 #anchor。表面上只是“标记一下来源”,但對搜尋蜘蛛来说,這些尾巴意味着 URL 字符串已经變了。下面把两種情况分開说清楚。

一、查询參數:算不同的 URL

URL 里問号後面的部分属于查询參數。對搜尋蜘蛛而言,带參數的地址和不带參數的地址在字符串层面就是两個地址,服務器收到的也是两條請求。比如入口頁同时出現這两個連結:

  • /article/100
  • /article/100?utm_source=zhizhu

它們會被当作两個不同的 URL 去請求。如果入口頁里几千個連結全都加上互不相同的參數,等于把目标 URL 複製成了几千份,抓取量被分散,而最终能正常參與展示的往往只有其中一個版本。

哪些參數值得留意

  • 跟踪類:utm_source、utm_medium、gclid、fbclid、ref、from,對頁面内容没有影响,纯属标记。
  • 會话類:sessionid、sid、phpsessid,同一個頁面每個訪客一個地址,重复度极高。
  • 功能類:page、sort、filter、lang,可能改變頁面内容,属于有意义但也有風險的一類。

處理方式通常有三種:入口頁直出干净連結;确需带參數时,在目标頁用 canonical 指明主版本;或者在 robots.txt、站長平台的參數處理工具里声明不抓某些參數。

二、# 锚点:通常不算獨立 URL

井号後面的片段在 HTTP 請求里根本不會發给服務器,搜尋蜘蛛請求的仍然是去掉锚点的那段地址。所以:

  • 入口頁里的 /page#section1 和 /page#section2,對蜘蛛来说只對應一個請求地址 /page。
  • 锚点不會額外产生抓取請求,也不用担心它把抓取预算摊薄。
  • 例外是纯前端路由:如果站点用 #/list/123 這種 hash 路由,服務端收到的永遠是同一個入口地址,能否被识別取决于前端渲染方式,這類结构本身不利于 URL 發現。

三、蜘蛛池入口頁的實操建议

  1. 入口頁輸出的連結尽量是最终形態的干净 URL,不要為了統計方便批量加參數。
  2. 統計需求交给服務端日誌或落地頁自己的埋点,不一定要改寫連結。
  3. 如果歷史連結已经带了參數,先看日誌里带參數版本的請求量,再判断是否值得保留。
  4. 對同一内容的多版本地址,用 canonical 收口,让權重集中到主版本。
  5. 定期在日誌里看同一路径出現了多少種 URL 變体,變体突然增多,通常意味着某處批量加了參數。
參數和锚点都不是“越多越好”。參數會制造重复地址、消耗抓取预算,锚点則基本不增加請求。入口頁要做的,是把有限的可抓次數花在真正需要被發現的地址上。

四、怎么驗證有没有被当成两個地址

最简單的方法是看服務器日誌:把同一個路径的訪問记錄按“去掉參數”的版本分组,對比請求數、蜘蛛 IP 分布和時間段。如果带參數版本的請求數几乎和不带參數版本一样多,說明蜘蛛确實把两者都抓了一遍;如果只有零星几條,說明它已经做了归一化處理。两種结果都不必紧張,關键是別让參數版本的數量持續膨胀。

總结一句:查询參數會生成新的 URL 字符串,可能带来重复抓取;锚点通常不會。设計蜘蛛池入口頁时把連結寫干净,比事後用各種規則补救要省事得多。