搜索抓取

主域、子域与 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 发现这件事也从「碰运气」变成了「可维护」。