搜索抓取

多语言站点的抓取路径:hreflang、语言切换器与各版本入口

多语言站点常出现默认语言被抓得勤、其他语言版本长期不动的情况。本文从语言切换器写法、目录结构选择、Sitemap 分片和 hreflang 常见错误入手,说明如何给每个语言版本留下稳定的 HTML 入口与回程链接,并用日志和 Sitemap 交叉检查抓取情况。

搜索抓取

多语言站点的抓取路径:hreflang、语言切换器与各版本入口

多语言站点最常见的状况是:默认语言版本抓得挺勤,其他语言版本却长期停在“已发现未抓取”。排查之后往往发现不是服务器问题,而是蜘蛛从默认语言页出发后,找不到一条稳定的 HTML 路径走到其他语言版本。hreflang 本身不创造入口,它只在你已经把各版本都暴露出来的前提下,帮助搜索引擎理解它们之间的关系。

蜘蛛发现各语言版本的三条路

实际能用的入口基本就三种,条件允许时最好都配上,而不是只靠其中一种。

  • 页面内链:语言切换器用真正的 a 标签,每个语言对应一个可直接访问的 URL,不要用按钮加 onclick 拼出来。
  • Sitemap:可以放在同一个 Sitemap 里,也可以按语言分片;每个语言的 URL 都要能被独立抓取,不要只在默认语言 Sitemap 里写几行 hreflang 注释。
  • 站点地图索引:语言多、URL 量大时,用索引文件把各语言的 Sitemap 列清楚,方便蜘蛛按分片抓取。

语言切换器的写法决定了蜘蛛能走多远

下拉菜单加 JS 跳转是最常见的坑。蜘蛛执行脚本的能力和时机都不确定,很多时候它只看到一个不能点的 select,或者只能抓到默认语言。更麻烦的是用 cookie 或 IP 自动 301 到默认语言:蜘蛛从 /en/ 进来被跳到根路径,反复几次之后,它可能就不再尝试这个分支。

如果确实需要自动跳转,至少保证每个语言 URL 直接返回 200 和对应语言内容,跳转只发生在用户第一次访问根路径时。

语言切换器最好在页头和页脚各放一份,让各个语言版本互相链接形成闭环,而不是只从默认语言单向往外指。

目录结构怎么选更利于抓取

  • 子目录 /en/、/ja/:抓取路径集中在一个域名下,内链和 Sitemap 都好管理,多数站点可以优先考虑。
  • 子域名 en.example.com:分隔更彻底,但需要单独维护抓取入口和 Sitemap,容易出现一边抓得勤、一边没人管的情况。
  • 参数 ?lang=en:最容易产生大量近似 URL,需要在 canonical、hreflang 和站内链接上保持一致,否则重复版本会持续消耗抓取资源。

hreflang 的常见写法问题

  1. 只写单向:A 页写了自己和 B 页,B 页没有写回来,关系不闭环,判断会打折扣。
  2. 指向不能访问的 URL:hreflang 目标返回 302、404 或被 robots 屏蔽,标注等于白写。
  3. 缺少 x-default:没有默认版本声明时,语言选择只能交给搜索引擎自己猜。
  4. 代码不规范:写成 en-UK 之类的随意组合,或者把地区码当成语言码使用。
  5. 只在 Sitemap 写一半:页面和 Sitemap 中的 hreflang 不一致,两边容易互相矛盾。

让每个语言版本都有回程

抓取路径不只要进得去,还要出得来。英文页的面包屑如果指回中文首页,而中文首页又没有明显指向英文页的链接,蜘蛛很容易在这个分支上打转。每个语言版本最好有独立的导航和面包屑,至少在页脚保留一组指向其他语言版本的链接。

用日志和 Sitemap 做交叉检查

想确认问题出在哪,可以先做三件事:

  • 看服务器日志里各语言版本的抓取次数比例,是否只有默认语言在被抓。
  • 抽查 Sitemap 中的语言 URL,确认返回 200、内容语言正确、canonical 指向自身。
  • 用抓取工具在不带脚本的情况下跑一遍语言切换器,看能不能点到其他语言版本。

顺序上,先把每个语言版本的 HTML 入口和回程链接做扎实,再补 hreflang 与 Sitemap 分片。入口不通,关系标注再规范,也不会凭空带来额外抓取。