多语言、多区域站点在抓取上遇到的麻烦,往往不是内容太少,而是同一份内容被拆成了好几份地址:语言版本、区域版本、货币或参数变体。蜘蛛必须自己判断哪些是同一主题的不同表达,哪些是真正的独立页面。判断错了,常见的结果是抓取预算被摊薄,某一两个语言版本长期没人来。
先定 URL 结构,再谈标注
结构决定了后续所有工作的成本。三种常见做法各有取舍:
- 子目录(example.com/de/、example.com/fr/):域名权重集中,运维简单,适合大多数站点。
- 子域名(de.example.com):隔离性好,但要额外做域名验证、分别提交 Sitemap,日志也要分开看。
- 独立域名(example.de):区域信号最强,但需要各自建设,抓取和收录都要分别维护。
不管选哪种,关键是统一:不要一部分语言用子目录、一部分用子域名。地址风格不统一时,hreflang 的对应关系很容易写错,蜘蛛也会把本该归在一起的页面当成两套站点。
hreflang 是一份“互为副本”的说明
hreflang 的作用不是告诉蜘蛛该收录哪一个,而是说明这几个地址是同一内容的不同语言版本。它有两条硬性要求:
- 必须互指。A 页面标注 B,B 页面也要标注 A,缺一边就是单向标注,容易被忽略。
- 必须包含自身。每个页面都要列出自己的语言版本,这是很多站点漏掉的一步。
另外两点容易被忽略:语言代码要用规范写法(zh-Hans、pt-BR 之类),x-default 用来兜底没有匹配语言的访客。标注放在 HTML head 里或直接写进 Sitemap 都可以,但同一站点最好只用一种,别两边都写、内容还不一致。
Sitemap 里的多语言标注
页面数量较大时,把 hreflang 放进 Sitemap 比散布在 head 里更好维护。每个 URL 条目下用 xhtml:link 列出所有语言版本的地址,蜘蛛读一次地图就能拿到完整的对应关系,不必逐页去解析 head。分语言拆成多个 Sitemap 也可以,但每个分片里的映射关系要写完整,不要指望蜘蛛靠“猜”补齐。
内链与语言切换器要能被走通
很多站点的语言切换是一个 JavaScript 下拉菜单,点了才跳转。对用户很方便,但蜘蛛拿到的 HTML 里可能只有一个空的 select 元素,看不到任何指向其他语言版本的链接。做法上尽量让切换器输出成普通的 a 标签,放在页面顶部或页脚固定位置,这样每个语言版本都能从其他版本被爬到。
正文里的跨语言引用也要留意:如果德语页面里提到某个只存在于法语页面的活动,链接就指向法语地址,别指向德语首页。指向首页的泛链接对蜘蛛判断页面归属没有帮助。
服务器与 CDN 的一致性
多区域站点经常按访客 IP 做跳转或返回不同内容。这里有个边界:如果不同地区的蜘蛛(比如不同出口 IP)拿到的是完全不同的页面,站点看到的抓取表现会变得很难解释。稳妥的做法是把自动重定向限制在真人访问上,或者至少保证按语言版本返回的内容是一致的,不因 IP 变化。CDN 缓存同理,各语言版本要有独立的缓存键,避免德语页面被法语缓存命中。
上线前可以按这份清单过一遍
- 所有语言版本的 URL 结构是否统一,没有混用子目录和子域名。
- 每个页面是否都包含了 hreflang 互指和自指,x-default 是否设置。
- Sitemap 是否覆盖全部语言版本,xhtml:link 的映射是否完整。
- 语言切换器是否是真实的可抓取链接,而不是纯 JS 交互。
- 各语言页面的 title、description 是否做了本地化,而不是同一份模板翻译。
- 日志里各语言目录的抓取频次是否都在正常区间,有没有某一版本长期为零。
多语言站点的问题很少出在某一条规则写错,多半出在几条线之间对不上:目录结构和 hreflang 对不上,Sitemap 和内链对不上。检查时按“同一个页面的所有版本能否互相走到”这个标准串一遍,通常比逐条查规范更快找到问题。
小结
把多语言站点的抓取理顺,核心是把“同一内容的多份地址”这件事讲清楚:结构统一、标注互指、地图完整、链接可达。做到这四点,蜘蛛才不需要在每个语言版本之间反复试探,抓取预算也能更均匀地分到各个市场上。