蜘蛛抓頁面时,拿到的是一串字节,而不是已经排好版的文字。它需要先按字符编碼把字节還原成字符,才能繼續切词、识別标题、判断主题。這一步出問题,頁面本身能正常訪問,返回碼也是 200,可蜘蛛讀到的内容却可能是問号、方块或者错位的符号。對站点运营来说,這類問题不像 404 那样一眼可见,但一旦發生,往往牵涉整批頁面。
编碼不對时,蜘蛛會看到什么
乱碼不一定會让頁面抓取失敗,更常见的是“抓到了但讀不懂”。表現通常集中在几個地方:
- 标题與摘要里出現替換字符,搜尋结果展示異常;
- 正文關鍵詞提取失敗,頁面主题判定偏移;
- 内鏈锚文本變成乱碼,連結的语义信息丢失;
- 栏目名、面包屑顯示错乱,站点结构理解受影响。
這些問题里,最容易被忽略的是锚文本。锚文本本身是蜘蛛理解連結目标的重要线索,如果它讀到的是乱碼,這條内鏈就只剩下一個地址,描述性信息基本作废。
三個声明位置,優先級要理清
頁面编碼通常有三個来源:HTTP 响應头里的 Content-Type、HTML 里的 meta charset,以及蜘蛛在两者缺失时的自動檢測。多數情况下,响應头的優先級高于 meta。如果响應头寫着一種编碼,meta 里寫着另一種,解析结果就取决于抓取端的取舍策略,等于把不确定性留给了別人。
所以自查的第一步不是看哪個声明寫得漂亮,而是看它們是否一致。
具体的自查步骤
- 用 curl 或浏览器開發者工具查看响應头中的 Content-Type,確認是否带上 charset 參數。
- 抓取 HTML 源碼的前几百字节,確認 meta charset 是否存在、是否放在 head 靠前的位置。
- 检查文件開头是否多出 BOM 字节,BOM 有时會让头部声明位置整体後移。
- 核對資料库连接、建表语句與資料表本身的字符集是否统一。
- 抽查含中文标点、生僻字、特殊符号的頁面,這類頁面最容易暴露编碼問题。
- 检查同域下 JS、CSS、JSON 接口的编碼声明是否與頁面保持一致。
抽查时建议覆盖不同類型模板:首頁、列表頁、詳情頁、搜尋结果頁。有些乱碼只出現在某個模板的某一處輸出變量上,只看首頁很难發現。
修复时容易踩的坑
- 只改 meta 不改响應头。两者矛盾时,改動可能完全不起作用。
- 只改頁面不改資料源。如果資料入库时已经损坏,輸出端再怎么声明也還原不回来。
- 忽略缓存层。CDN 或頁面缓存里還留着舊版本,修复後抓到的仍是乱碼頁。
- 忘记後台與表單。編輯提交、接口回传如果用的是另一套编碼,内容會在寫入环节被破坏。
编碼問题属于改一次、長期受益的類型,但要留意新上线的栏目模板別把老毛病带回来。建议把编碼检查寫進模板上线前的確認清單。
把它放進例行巡检
编碼不會天天出問题,可一旦出問题,影响面往往不小。比較務實的做法是:统一使用 UTF-8,在响應头里明确声明,meta 作為兜底且與响應头保持一致;每次更換服務器、調整 CDN、更新模板後,重新抽查几個含中文的頁面。
這件事不需要频繁做,但需要在關键节点做。它不是能立刻看到效果的操作,只是让蜘蛛在解析环节少一次誤判的机會。