蜘蛛池里的入口頁通常是同一套程序、同一個模板批量铺出去的,所以字符集這類基础設定一旦出错,不是一個頁面出错,而是一整批頁面一起出错。中文站尤其容易踩這個坑,因為浏览器在顯示上帮我們兜底了太多東西,肉眼看不到問题,不代表蜘蛛那邊也没問题。
浏览器會兜底,蜘蛛不一定
一個頁面里其實有三處可能声明编碼:HTTP 响應头里的 Content-Type、HTML 里的 meta charset、以及文件實际的儲存编碼。三者不一致的时候,浏览器會按自己的優先級去试,试不通還會猜,最後经常能把中文顯示正常。蜘蛛拿到的是同一份响應,但解碼策略更直接,它更倾向于相信响應头,按声明的方式去解字节。解出来是什么,它就讀什么。
這就是問题所在:你在浏览器里看到的“一切正常”,可能只是浏览器替你把痕迹擦掉了。
常见的几種不一致
- 响應头寫 GBK,頁面 meta 寫 UTF-8,而正文文件實际是 UTF-8 儲存的。
- 頁面 meta 明确寫了 UTF-8,但資料库连接没设 utf8mb4,内容入库时就已经變成問号或方块。
- 模板文件用 GBK 儲存,中間又插入了一段 UTF-8 的采集内容,拼接後两種字节混在同一個頁面里。
- 生成静態頁时,把 GBK 编碼的标题、描述拼進 UTF-8 的頁面骨架。
- 采集或接口接入的内容没有统一轉碼,直接落库再輸出。
- 文件带了 BOM 头,頁面開头多出几個不可见字节,個別解析器會把它当成正文的一部分。
蜘蛛讀到乱碼之後會怎样
一般不會立刻上升成屏蔽,但影响是持續的。标题變成一串問号,蜘蛛就没法從标题判断主题;正文關鍵詞對不上,入口頁與锚文本、目标頁之間的语义關联就断了;如果整批入口頁都是同样的乱碼特征,還可能被归為同质内容。最後表現出来的,就是這批頁面的抓取和後續處理都不太积极。
字符集不是顯示問题,而是蜘蛛能不能讀懂内容的問题。
怎么自检
- 用命令行带 -I 看响應头,確認 Content-Type 里声明的编碼。
- 查看頁面源碼前几百字节,確認 meta charset 與响應头声明一致。
- 用十六進制查看工具讀几個中文字,看字节序列是否符合声明的编碼。
- 在浏览器里關閉自動编碼檢測,强制按声明编碼渲染,观察是否乱碼。
- 检查資料库、表、字段、连接四层编碼是否统一。
- 抽样几個入口頁,對比浏览器顯示、頁面源碼、响應头三者是否一致。
顺带留意的地方
URL 里如果带中文參數,也要確認编碼方式统一,避免同一個頁面出現多個不同编碼形式的地址。連結锚文本同理,尤其是從表格或采集源直接複製過来的内容。另外,建议把编碼規范寫進入口頁的生成流程里,批量产出的東西靠人工一頁頁检查不現實,只能在源头统一。
字符集本身不带来排名,也不解决收錄,但它决定了蜘蛛能不能准确理解你铺出去的這批頁面在说什么。這一层不出错,後面的工作才有意义。