搜尋抓取

多語言站点的抓取路径: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 分片。入口不通,關系标注再規范,也不會凭空带来額外抓取。