蜘蛛池里的入口页通常是同一套程序、同一个模板批量铺出去的,所以字符集这类基础设置一旦出错,不是一个页面出错,而是一整批页面一起出错。中文站尤其容易踩这个坑,因为浏览器在显示上帮我们兜底了太多东西,肉眼看不到问题,不代表蜘蛛那边也没问题。
浏览器会兜底,蜘蛛不一定
一个页面里其实有三处可能声明编码: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 里如果带中文参数,也要确认编码方式统一,避免同一个页面出现多个不同编码形式的地址。链接锚文本同理,尤其是从表格或采集源直接复制过来的内容。另外,建议把编码规范写进入口页的生成流程里,批量产出的东西靠人工一页页检查不现实,只能在源头统一。
字符集本身不带来排名,也不解决收录,但它决定了蜘蛛能不能准确理解你铺出去的这批页面在说什么。这一层不出错,后面的工作才有意义。