蜘蛛池知识

蜘蛛池入口页的乱码与空白:蜘蛛抓到的页面为什么读不出内容

入口页返回 200、日志里也有蜘蛛到访,但正文却是乱码或空白,问题通常出在页面自身。文章把“空”拆成字节为空、编码错乱、文字在图片里、内容由脚本写入四类,分别给出编码冲突、模板变量未替换、数据库字符集等常见成因与自查方法。

蜘蛛池知识

蜘蛛池入口页的乱码与空白:蜘蛛抓到的页面为什么读不出内容

入口页返回 200,抓取日志里也确实有蜘蛛来过,但过一段时间去核对,发现蜘蛛拿到的正文要么是乱码,要么干脆是空的。这种情况在批量铺入口页时并不少见,问题往往不在蜘蛛,而在页面自己交出去的东西。

先把“空”拆成几类

在动手之前,先要把“蜘蛛没读到内容”分成几类,否则容易在错误的方向上反复调整:

  • 字节是空的:HTML 的 body 里没有可见文字,或者只剩一个容器标签。
  • 字节有内容但读不懂:页面输出了中文,但编码声明与实际字节不一致,呈现为问号或方块。
  • 文字在图片里:内容以图片形式展示,HTML 中只有 img 标签。
  • 文字由脚本写入:初始 HTML 是空壳,正文靠 JS 渲染后才插入。

这四类的成因和处理方式完全不同,先判断清楚,再去改,能省掉很多无效操作。

编码声明与实际字节不一致

这是最常见的一类。典型表现是:响应头里写着 Content-Type: text/html; charset=gbk,而页面 meta 里写的是 charset=utf-8;或者反过来。当两者冲突时,蜘蛛通常以响应头为准,于是同一份字节被按错误的字符集解码,中文就成了乱码。

还有一种更隐蔽的情况:程序连接数据库时使用了 latin1 之类的字符集,中文在写入阶段就已经被转成了问号,页面上看起来只是“文字怪怪的”,其实原始内容早就丢了。

自查方式很直接:带上响应头抓一次,再用十六进制工具看正文开头的几百个字节。如果服务器发出的是 GBK 字节流,而响应头声明 UTF-8,乱码现象基本就能对上。

模板变量和循环输出没被替换

批量生成的入口页,常见问题出在模板层。占位符没有被替换,页面直接把 {title}、{{content}} 这类标记渲染了出来;或者列表循环为空,页面上只留下一个空的 ul 容器,正文区域一片空白。

这类问题的排查点有三个:模板引擎是否跑完、数据源是否取到记录、缓存是否把未渲染完成的页面存了下来。尤其是第三种,静态化任务中途失败,缓存里留下的就是半成品页面,蜘蛛抓到的正是它。

文字被放进了图片或画布

为了让页面看起来整齐,有些入口页把介绍文字直接做成图片,HTML 中只留一个 img 标签。蜘蛛能拿到图片地址,但拿不到文字内容。如果确实需要图片,至少要保留一段文字说明,并把图片的 alt 属性写清楚。

一份可执行的自查顺序

  1. 抓取响应头,确认 Content-Type 与 charset 声明。
  2. 抓取正文,看前 1KB 字节,比对编码是否与声明一致。
  3. 关闭 JS 再抓一次,看初始 HTML 里有没有正文。
  4. 检查是否残留未替换的模板占位符。
  5. 检查循环输出为空时,页面是否退化成空白。
  6. 抽查多个入口页,而不是只看首页。
入口页的作用是把蜘蛛带到下游,如果它本身就是一堵空白墙,蜘蛛走进去也带不走任何线索。编码和渲染这类问题不显眼,却会直接影响入口页能不能被读懂。