蜘蛛池知识

蜘蛛池入口頁的字符集:蜘蛛讀到的可能不是中文

蜘蛛池入口頁多為批量生成,字符集一旦不一致,浏览器能兜底顯示,蜘蛛却按响應头解碼,讀到的可能是一串問号。本文說明响應头、meta 與文件编碼三者冲突的常见场景,並给出一套可落地的自检步骤,帮中文入口頁被蜘蛛正确理解。

蜘蛛池知识

蜘蛛池入口頁的字符集:蜘蛛讀到的可能不是中文

蜘蛛池里的入口頁通常是同一套程序、同一個模板批量铺出去的,所以字符集這類基础設定一旦出错,不是一個頁面出错,而是一整批頁面一起出错。中文站尤其容易踩這個坑,因為浏览器在顯示上帮我們兜底了太多東西,肉眼看不到問题,不代表蜘蛛那邊也没問题。

浏览器會兜底,蜘蛛不一定

一個頁面里其實有三處可能声明编碼:HTTP 响應头里的 Content-Type、HTML 里的 meta charset、以及文件實际的儲存编碼。三者不一致的时候,浏览器會按自己的優先級去试,试不通還會猜,最後经常能把中文顯示正常。蜘蛛拿到的是同一份响應,但解碼策略更直接,它更倾向于相信响應头,按声明的方式去解字节。解出来是什么,它就讀什么。

這就是問题所在:你在浏览器里看到的“一切正常”,可能只是浏览器替你把痕迹擦掉了。

常见的几種不一致

  • 响應头寫 GBK,頁面 meta 寫 UTF-8,而正文文件實际是 UTF-8 儲存的。
  • 頁面 meta 明确寫了 UTF-8,但資料库连接没设 utf8mb4,内容入库时就已经變成問号或方块。
  • 模板文件用 GBK 儲存,中間又插入了一段 UTF-8 的采集内容,拼接後两種字节混在同一個頁面里。
  • 生成静態頁时,把 GBK 编碼的标题、描述拼進 UTF-8 的頁面骨架。
  • 采集或接口接入的内容没有统一轉碼,直接落库再輸出。
  • 文件带了 BOM 头,頁面開头多出几個不可见字节,個別解析器會把它当成正文的一部分。

蜘蛛讀到乱碼之後會怎样

一般不會立刻上升成屏蔽,但影响是持續的。标题變成一串問号,蜘蛛就没法從标题判断主题;正文關鍵詞對不上,入口頁與锚文本、目标頁之間的语义關联就断了;如果整批入口頁都是同样的乱碼特征,還可能被归為同质内容。最後表現出来的,就是這批頁面的抓取和後續處理都不太积极。

字符集不是顯示問题,而是蜘蛛能不能讀懂内容的問题。

怎么自检

  1. 用命令行带 -I 看响應头,確認 Content-Type 里声明的编碼。
  2. 查看頁面源碼前几百字节,確認 meta charset 與响應头声明一致。
  3. 用十六進制查看工具讀几個中文字,看字节序列是否符合声明的编碼。
  4. 在浏览器里關閉自動编碼檢測,强制按声明编碼渲染,观察是否乱碼。
  5. 检查資料库、表、字段、连接四层编碼是否统一。
  6. 抽样几個入口頁,對比浏览器顯示、頁面源碼、响應头三者是否一致。

顺带留意的地方

URL 里如果带中文參數,也要確認编碼方式统一,避免同一個頁面出現多個不同编碼形式的地址。連結锚文本同理,尤其是從表格或采集源直接複製過来的内容。另外,建议把编碼規范寫進入口頁的生成流程里,批量产出的東西靠人工一頁頁检查不現實,只能在源头统一。

字符集本身不带来排名,也不解决收錄,但它决定了蜘蛛能不能准确理解你铺出去的這批頁面在说什么。這一层不出错,後面的工作才有意义。