搜尋抓取

主域、子域與 www:蜘蛛在多個域名之間是怎么走的

同一個站点常常有 www、手机站、博客、静態资源等多個主机名,對訪問者是一回事,對搜尋蜘蛛却是各自獨立的抓取對象。本文梳理主机名在抓取队列、robots.txt、Sitemap 中的划分方式,說明主地址如何确定、子域名该不该參與 URL 發現、跨主机名内鏈會把蜘蛛带到哪,以及迁移时的處理顺序。

搜尋抓取

主域、子域與 www:蜘蛛在多個域名之間是怎么走的

一個站点在域名层面往往不止一個入口:www 與非 www、手机站、博客、帮助中心、静態资源域名、接口域名、活動专题域名。對訪問者来说這些都是一家公司;對搜尋蜘蛛来说,它們首先是不同的主机名,抓取、判断和索引都會分開處理。理解這一点,能解释不少「内容明明一样、抓取表現却完全不同」的情况。

主机名是蜘蛛最基础的分组單位

蜘蛛的抓取队列、robots.txt 的生效范围、Sitemap 的归属,基本都按 协议 + 主机名 来划分。也就是说 https://www.example.com 和 https://example.com 在抓取层面是两個對象:各自需要能被訪問到,各自有自己的 robots.txt 生效范围,各自需要被發現入口。少一個环节,那一侧的抓取就會明顯稀疏。

www 與非 www:先确定唯一主地址

如果两種寫法都返回 200,蜘蛛很可能两條都抓、都尝试入库,後面再靠規范化信号去合並,這個過程既浪費抓取動作,也让日誌分析變得难讀。更省事的做法是選一個作為主地址,另一個用 301 永久跳過去,並且全站内鏈、Sitemap、對外分享统一使用主地址。

301、canonical、Sitemap 里的地址都属于「建议」,蜘蛛仍要先把舊地址抓一遍才能讀到這些信号。所以要缩短路径,關键是入口尽量少、寫法尽量一致。

子域名:能顺着連結抓過去,但不等于同一個站点

把博客、帮助中心、商城放在 blog.example.com、help.example.com 下很常见。它們通過主域的内鏈能被正常發現,抓取本身没有障碍;但從站点识別角度看,子域名通常被当作相對獨立的實体對待,抓取表現、索引狀態會各算各的。

所以「用子域名還是子目錄」的取舍点在于内容關系:如果内容属于同一主题体系、需要互相借力,子目錄通常更直接;如果是獨立品牌、獨立运营、獨立技術栈,子域名反而更清晰。两種選擇都没有绝對優劣,怕的是含混——一半内容在子域、一半在子目錄,内鏈又互相缠绕。

子域名的入口不能只靠主域導航

子域名如果只被主域某一處連結指過去,蜘蛛的抓取路径就會拉長;反之,如果子域名自己有導航、有列表頁、有内鏈閉环,蜘蛛進入一次就能展開。给每個主机名准备一份 Sitemap,在各自 robots.txt 里声明,是成本最低的一步。

资源域名和接口域名不该參與 URL 發現

img、static、cdn、api 這類主机名通常不需要被索引。可以這样處理:

  • 不要把它們的 URL 寫進任何 Sitemap;
  • 每個主机名下放一份 robots.txt,明确禁止抓取;
  • 頁面里不产生指向這些域名的、蜘蛛能跟随的超連結,资源用图片、脚本、样式引用即可;
  • 域名本身给出明确响應,或干脆不解析到公網,避免出現一個空白首頁被抓走。

需要留意的是,robots.txt 只约束抓取,不约束 URL 被外部連結、日誌或其他頁面暴露出来。所以「入口不出現」比「事後拦截」更靠前一步。

跨主机名的内鏈:抓取會顺着走

主域正文里鏈到子域,蜘蛛會顺着抓;子域鏈回主域同理。跨主机名不會让抓取「重置」,它同样消耗一次抓取机會。因此不要把重要頁面藏在很深的子域頁面里,也不要用子域名做大量與主站内容無關的跳轉层。連結层級越浅、上下文越相關,蜘蛛越容易判断這個地址值不值得繼續跟。

域名迁移或合並时的顺序

把几個主机名收敛成一個时,顺序比速度重要:

  1. 先在目标主机名把頁面做全,確認可正常訪問、结构完整;
  2. 再從舊主机名逐條 301 到對應新地址,避免全站一律跳到首頁;
  3. 同步更新内鏈、Sitemap、canonical 和頁面里寫死的绝對地址;
  4. 观察一段時間服務器日誌,看舊主机名的抓取是否逐步减少、新主机名是否逐步增加。

如果這一步做急了,舊地址先跳、新頁面還没铺好,蜘蛛抓到的是空壳,重新被發現又要再等一轮。

把域名邊界寫清楚

域名结构不是越少越好,而是邊界要清楚:哪些主机名是给蜘蛛抓的,哪些不是;哪個是主地址,其余怎么指向它;每個主机名的 robots.txt 和 Sitemap 是否各就各位。邊界清楚,蜘蛛脚下的路径就短,URL 發現這件事也從「碰运气」變成了「可维護」。