在蜘蛛池入口頁上放連結时,一個很常见的小動作是给連結加上各種尾巴:?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 發現。
三、蜘蛛池入口頁的實操建议
- 入口頁輸出的連結尽量是最终形態的干净 URL,不要為了統計方便批量加參數。
- 統計需求交给服務端日誌或落地頁自己的埋点,不一定要改寫連結。
- 如果歷史連結已经带了參數,先看日誌里带參數版本的請求量,再判断是否值得保留。
- 對同一内容的多版本地址,用 canonical 收口,让權重集中到主版本。
- 定期在日誌里看同一路径出現了多少種 URL 變体,變体突然增多,通常意味着某處批量加了參數。
參數和锚点都不是“越多越好”。參數會制造重复地址、消耗抓取预算,锚点則基本不增加請求。入口頁要做的,是把有限的可抓次數花在真正需要被發現的地址上。
四、怎么驗證有没有被当成两個地址
最简單的方法是看服務器日誌:把同一個路径的訪問记錄按“去掉參數”的版本分组,對比請求數、蜘蛛 IP 分布和時間段。如果带參數版本的請求數几乎和不带參數版本一样多,說明蜘蛛确實把两者都抓了一遍;如果只有零星几條,說明它已经做了归一化處理。两種结果都不必紧張,關键是別让參數版本的數量持續膨胀。
總结一句:查询參數會生成新的 URL 字符串,可能带来重复抓取;锚点通常不會。设計蜘蛛池入口頁时把連結寫干净,比事後用各種規則补救要省事得多。