多語言、多区域站点在抓取上遇到的麻烦,往往不是内容太少,而是同一份内容被拆成了好几份地址:語言版本、区域版本、货幣或參數變体。蜘蛛必须自己判断哪些是同一主题的不同表達,哪些是真正的獨立頁面。判断错了,常见的结果是抓取预算被摊薄,某一两個語言版本長期没人来。
先定 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 和内鏈對不上。检查时按“同一個頁面的所有版本能否互相走到”這個标准串一遍,通常比逐條查規范更快找到問题。
小结
把多語言站点的抓取理顺,核心是把“同一内容的多份地址”這件事讲清楚:结构统一、标注互指、地图完整、連結可達。做到這四点,蜘蛛才不需要在每個語言版本之間反复试探,抓取预算也能更均匀地分到各個市场上。