同一套内容做成多个语言或地域版本后,站点的入口数量会成倍增长。蜘蛛看到的不再是一个页面,而是若干指向近似内容的地址集合。如果这些地址之间的归属关系没有理清,抓取就会被分散在重复版本上,真正需要更新的页面反而回访变慢。
先确认哪些入口属于同一份内容
多数多语言站点会用路径前缀(如 /en/、/de/)、子域(en.example.com)或参数(?lang=en)来区分版本。三种方式对发现效率的影响并不相同:路径前缀最容易被普通链接承载,子域需要额外的解析与握手开销,参数形式则容易被内链忽略、也更容易在抓取收敛时被过滤掉。
- 每个版本页面是否 canonical 指向自身,而不是统一指向默认语言版本。
- 默认版本是否用 x-default 做了兜底声明,避免蜘蛛随机挑一个版本当作主版本。
- Sitemap 中是否把各语言版本分别列出,还是只列了其中一套。
- 是否存在内容几乎相同、语言代码却写错的历史遗留地址。
三处声明的一致性往往被忽略
语言与地域标注通常同时存在于三个位置:页面 head 中的 hreflang、HTML 的 lang 属性、以及 Sitemap 里的 xhtml:link 注解。这三处互相矛盾时,蜘蛛只能按较弱的一方处理,结果就是某几个版本长期不被抓取,或者被抓取后迟迟不更新。
- 检查 hreflang 是否双向互指,单向声明等于告诉蜘蛛“这边指向那边,那边不认这边”。
- 检查 Sitemap 中的语言注解是否与页面内的声明一致,包括语言代码大小写与地域后缀写法。
- 检查 lang 属性是否与页面实际内容一致,复制模板后忘记修改的情况相当常见。
内链结构决定蜘蛛先看到哪个版本
蜘蛛的抓取顺序很大程度上由内链密度决定。语言切换器、导航菜单、面包屑是三个主要入口,它们的位置和写法直接影响各版本被发现的速度。
- 语言切换器若用纯前端下拉实现,且链接不带可解析的 href,蜘蛛基本看不到其他版本。
- 切换器放在首屏之外或只在详情页出现,会导致外层列表页长期只有单一语言版本被收录。
- 不同版本之间的内链如果各自独立、互不交叉,站点会逐渐分裂成几个互不相通的入口群。
从抓取日志看分配是否失衡
按语言前缀或子域把日志分组统计,通常能看出三类现象,对应的原因也各不相同。
- 某个版本几乎不出现:入口缺失,或该版本未在 Sitemap 中声明。
- 某个版本持续被访问但返回内容从不变化:canonical 或 hreflang 未被识别,蜘蛛仍在试探归属。
- 所有版本抓取频次同步下滑:多半不是语言结构问题,而要从服务器错误率、响应耗时和回源稳定性上找原因。
多地域站点的额外变量
地域版本常与 CDN、就近回源、按 IP 判断语言等机制叠加。蜘蛛通常从固定的少数 IP 段发起请求,如果站点按访问者 IP 返回不同语言,蜘蛛看到的内容可能与真实用户不一致,进而形成内容错配。更稳妥的做法是让不同地域版本拥有各自明确、稳定、与用户所见一致的 URL,而不是依赖运行时判断。
一份可执行的核对顺序
- 列出全部语言与地域版本的前缀,标注哪些是主推版本、哪些是历史遗留。
- 逐版本确认 canonical 自指向,默认版本额外确认 x-default 声明。
- 把页面 hreflang、Sitemap 注解、lang 属性三方对齐,去掉单向声明。
- 确认语言切换器输出的是带 href 的普通链接,且在各层模板中都存在。
- 按前缀分组读日志,记录各版本的发现时间与回访间隔差异。
- 同步观察服务器状态码分布与响应耗时,区分是入口问题还是可用性问题。
抓取频次不是固定配额,而是蜘蛛根据站点质量、更新节奏与响应情况动态估算的结果。把入口归属理清楚,比反复提交单个 URL 更有实际意义。
多语言站点的抓取问题,多数不是出在某个页面上,而是出在版本之间的对应关系上。先用声明和日志把归属关系固定下来,再谈内容更新与入口扩展,顺序会顺很多。