搜尋抓取

同一個頁面多個地址:URL 形態不统一,蜘蛛會重复抓几遍

同一份内容挂在 http、https、带 www、带尾斜杠等多個地址下,蜘蛛會把它們当成不同頁面分別排队抓取。本文梳理常见的重复地址来源,以及用 301、canonical、内鏈和 Sitemap 做归一化的具体做法,並說明服務器端需要配合的响應细节。

搜尋抓取

同一個頁面多個地址:URL 形態不统一,蜘蛛會重复抓几遍

同一份内容,為什么會有好几個地址

做站点运营时,常见的現象是:一份内容其實只有一個頁面,但在蜘蛛眼里却像有好几個。原因通常不在内容重复,而在地址形態不统一。下面這些寫法往往都能打開同一個頁面,對浏览器来说差別不大,對抓取系統来说却是不同的 URL。

  • 协议不同:http:// 與 https:// 各有一套地址
  • 主机名不同:带 www 與不带 www
  • 结尾斜杠不同:/about 與 /about/
  • 大小寫不同:/List 與 /list,在部分服務器上等價
  • 預設文件名:/ 與 /index.html
  • 參數残留:會话 ID、来源跟踪參數、排序與篩選參數

單看每一條都不嚴重,叠在一起就麻烦了。同一篇文章可能被展開成四五個地址,分別進入抓取队列。

蜘蛛會怎样處理這些地址

抓取队列的去重是按 URL 字符串做的,不是按頁面内容做的。只要地址不同,就會被当作不同资源排队。抓取額度是有限的,用在重复地址上的每一次請求,都是從真正需要抓取的頁面上挪走的。

影响還不止抓取。当多個地址都返回 200 且内容相同,搜尋引擎在整理时需要在它們之間做選擇;如果内鏈指向不统一,選擇的结果可能来回變動,頁面在结果里呈現的地址也會不稳定。

把同一份内容收敛到一個地址上,是抓取效率里成本最低的一步,但它需要全站一起做,只改一處往往没有效果。

归一化要做的几件事

1. 先定一個規范形態

确定协议、主机名、路径寫法是否带尾斜杠、預設文件名規則,然後把它固定下来。規范形態一旦确定,後面所有動作都围绕它做。

2. 用 301 把舊形態收拢

非規范形態统一做 301 跳轉到規范地址,並且尽量一步到位,不要 A 跳 B、B 再跳 C。重定向鏈越長,蜘蛛到達目标頁的成本越高,中途出問题的概率也越大。

3. 内鏈只寫規范地址

站内導航、面包屑、正文連結、分頁連結,尽量统一寫成規范形式。相對路径可以减少协议和主机名寫错的可能,但尾斜杠這類差异仍然要人為對齐。

4. 頁面里标注 canonical

在頁面头部用 canonical 指向規范地址。它不能替代 301,但能覆盖一些無法做跳轉的场景,例如带參數的頁面。

5. Sitemap 只放規范 URL

Sitemap 里的地址應当與頁面最终返回 200 的地址完全一致。如果 Sitemap 寫的是带 www 的地址,實际响應却是跳轉,那這份清單的作用就打折了。

6. 處理參數類地址

會话 ID 不要寫進 URL;跟踪參數尽量在服務端去掉或做跳轉;篩選、排序、站内搜尋這類參數组合要單獨设規則,避免生成大量近似地址。

服務器端要配合的地方

归一化做得好不好,最终体現在响應上。几個容易被忽略的点:

  • 跳轉目标要稳定,不要出現今天 301 到 A、明天 301 到 B 的情况
  • HTTPS 證书覆盖到位,避免規范地址本身因為證书問题抓不到
  • 規范地址的响應時間维持在合理区間,跳轉頁和落地頁都算在内
  • 不要在非規范地址上返回完整的 200 頁面,這會抵消前面的工作

怎么检查有没有收敛

比較直接的办法是翻服務器日誌,把同一路径的不同形態放在一起看:

  1. 找出被反复抓取、内容相同的几组地址
  2. 看非規范形態返回的是 301 還是 200
  3. 观察規范地址與非規范地址的抓取比例是否在下降
  4. 抽查頁面源碼里的 canonical 是否與實际規范地址一致
  5. 核對 Sitemap 中的 URL,逐條確認最终响應

這類整理通常不會立刻见效,更多是把長期浪費的抓取額度慢慢收回来。它也不保證頁面會被收錄,只是让蜘蛛在同样的時間里走到更多真正有用的地址。