搜尋抓取

URL 規范化與抓取:同一個頁面被寫成多個地址,蜘蛛會怎么處理

同一篇内容常常能以带 www、不带 www、带斜杠、不带斜杠等多種地址打開,這在日誌里會表現為一组被反复抓取的近似 URL。本文說明這些寫法的来源、如何從日誌和 Sitemap 里比對,以及用跳轉、内鏈和 Sitemap 统一地址时需要注意的细节。

搜尋抓取

URL 規范化與抓取:同一個頁面被寫成多個地址,蜘蛛會怎么處理

翻服務器日誌时,常能看到這样一幕:同一個栏目頁,以 /news、/news/、/News、http 版和 https 版几種寫法轮流被訪問。對运营者来说這只是同一個頁面的几種入口,對抓取系統来说,它們是一组需要分別請求、分別判断、分別存储的地址。

同一份内容,常见的几種地址寫法

重复地址很少是刻意制造的,多數来自模板、跳轉配置和用戶複製連結的习惯。比較常见的有這几類:

  • 协议與主机名不一致:http 與 https 都能打開,带 www 與不带 www 都返回 200。
  • 末尾斜杠差异:/about 與 /about/ 各自能訪問,且都不跳轉。
  • 大小寫差异:/About 與 /about 指向同一份内容,服務器未做大小寫归一。
  • 預設文件名:目錄地址與目錄下的預設頁面(如 index.html)同时可用。
  • 參數顺序與無用參數:同一组篩選條件,參數顺序不同,或者多带了一個来源标记。
  • 编碼寫法不同:中文路径、空格、特殊符号用不同编碼形式表示。
  • 分頁、排序、篩選參數生成的近似地址,數量往往成倍增長。

為什么要收敛這些寫法

每一個可訪問的 URL,都會在抓取时占用一次請求机會、一次解析、一次存储和一次去重判断。当地址寫法分散时,抓取资源會被摊到多條近似地址上,而真正需要被更新的頁面反而排到後面。這種影响不是马上能看出来的,通常要结合日誌里的抓取分布来判断。

把同一份内容寫成多個可訪問的地址,不會让内容變得更丰富,只會让抓取和索引阶段的判断更模糊。

從日誌和 Sitemap 里找线索

  1. 導出近一段時間的抓取日誌,按路径做統計,看看是否存在同一路径的多種寫法被分別訪問。
  2. 把 Sitemap 中提交的地址和實际被抓的地址放在一起比對,看差集里有多少是寫法不同的同一頁面。
  3. 抽查頁面源碼,確認内鏈、導航、面包屑、分頁連結是否统一使用一種寫法,模板里最容易混用。
  4. 在返回 200 的地址中抽样,检查有多少属于近似重复内容,這一步能大致估出收敛的必要程度。

收敛时可以用的几種手段

  • 先确定一個主地址形態,例如统一使用 https、统一带 www、统一带末尾斜杠,然後全站按這個形態执行。
  • 其余寫法通過 301 跳轉到主地址,跳轉要一步到位,避免形成跳轉鏈。
  • Sitemap 只放主地址,不要同时提交多種寫法。
  • 站内所有連結,包括導航、正文内鏈、分頁、面包屑,都用主地址寫法,减少蜘蛛在站内就會遇到的重复入口。
  • canonical 可以作為补充声明,但它不是替代跳轉的手段,两者建议配合使用而不是只留一個。
  • 參數類地址如果确實不需要被抓取,可在 robots 或頁面层面處理,別指望靠一個标簽解决全部問题。

服務器层面的配合更省事

如果 http 與 https、裸域與 www 都能返回 200,說明统一跳轉没有配置到位。在服務器配置里加一层 301,让所有非主形態的請求都落到同一個地址,比在頁面层面事後修补要稳定得多。反過来,如果服務器狀態碼本身不稳定,地址统一也很难真正生效。

另外要注意,抓取系統确實會做一定程度的去重判断,但那是它内部的逻辑,你無法指定它最终選中哪一條作為代表。能控制的部分是:自己站点對外暴露的地址寫法保持一致,让蜘蛛進入站内後遇到的每一條内鏈、每一個 Sitemap 條目,都指向同一個地址。把這件事做扎實,比研究它怎么去重更實际。