常见問题

入口頁的目标連結带锚点或查询參數,搜尋蜘蛛會当成不同 URL 分別抓吗?

入口頁里的目标連結如果带上锚点或查询參數,搜尋蜘蛛的识別與抓取结果並不一样:锚点一般不构成新 URL,查询參數會构成新 URL,却未必带来更多抓取。本文說明两者的差异、常见的重复地址来源,以及排查时该按什么顺序清理連結寫法。

常见問题

入口頁的目标連結带锚点或查询參數,搜尋蜘蛛會当成不同 URL 分別抓吗?

這個問题常被混成一件事来問,其實要拆成两层:第一层,搜尋蜘蛛把這两個連結当成同一個 URL 還是两個 URL;第二层,它會不會因此多抓或少抓。两层的答案並不一致,需要分開看。

锚点(# 後面的部分)一般不參與 URL 标识

按 URL 規范,井号及其後面的片段标识符不會發送给服務器,服務器永遠只看到井号之前的部分。因此:

  • 同一個頁面里寫 /a.html 和 /a.html#top,對搜尋蜘蛛来说通常视為同一個地址,不會因為锚点不同而各抓一次。
  • 早期對 #! 這類 hash 路由有特殊處理,但現在主流做法是直接渲染 JavaScript,不要再指望靠這種寫法做 URL 發現。
  • 如果入口頁靠锚点区分不同目标内容,搜尋蜘蛛抓到的仍然只是同一個 URL 返回的内容,锚点带来的差异不會被單獨抓取。

查询參數會參與 URL 标识,但不一定带来更多抓取

?id=1 和 ?id=2 在字符串层面是两個不同的 URL,搜尋蜘蛛在發現阶段确實會把它們分別记錄下来。但接下来會發生什么,取决于内容是否真的不同:

  • 參數不同、内容确實不同:一般是两個獨立頁面,各自按自身價值获取抓取。
  • 參數不同、内容基本相同(例如只是排序、来源追踪):容易被视為重复,通常只保留一個代表地址,其余地址的抓取频率明顯下降。
  • 參數组合爆炸(如 ?a=1&b=2&c=3 的各種排列):抓取预算被大量消耗在相似 URL 上,真正想被發現的目标可能反而排在後面。

參數顺序和寫法上的小差別

?a=1&b=2 與 ?b=2&a=1 在字符串上是不同 URL,但很多站点返回的是同一份内容。這類寫法如果在入口頁里混用,等于人為制造重复地址。類似的情况還有大小寫不一致、中文參數是否编碼、末尾斜杠有無、http 與 https 混寫。

另一個容易被忽略的点是,入口頁里有时把带參數的連結寫成相對地址,不同頁面解析出的绝對地址可能不同,最终产生的 URL 數量會比预想的多。

對抓取节奏的實际影响

入口頁的連結數量、站点整体的抓取歷史表現、目标 URL 的响應速度,都會影响搜尋蜘蛛在這里停留多久。同一批地址重复出現、參數變体過多,等于在有限的抓取窗口里塞進大量低價值連結。常见的現象是:入口頁被訪問了,但真正被抓到的目标 URL 數量遠少于頁面上的連結數。

不要指望靠多寫几個參數變体就能让搜尋蜘蛛多抓目标内容。參數變体通常只會稀释抓取,而不是放大。

排查时可以按這個顺序做

  1. 從入口頁源碼里把連結完整抓一遍,用绝對地址列出並去重,看是否存在同一目标的多份變体。
  2. 检查是否把锚点当成不同目标使用;如果有,改成不同路径或不同頁面。
  3. 清理僅用于統計、排序、来源追踪的參數,避免它們出現在入口頁的目标連結中。
  4. 统一协议、域名、大小寫、末尾斜杠的寫法,让同一個目标只對應一個地址。
  5. 確認目标 URL 本身响應正常、返回 200,再谈是否被抓;參數再干净,目标地址返回 5xx 也抓不下去。
  6. 在服務器日誌里對比入口頁的蜘蛛訪問次數與目标 URL 的抓取條數,判断問题出在發現环节還是抓取环节。

小结

锚点通常不构成新的 URL,查询參數會构成新的 URL,但新 URL 不等于會获得抓取。入口頁真正该做的是让每個目标對應一個干净的地址,而不是靠參數堆出看起来更多的連結。