一、问题是什么
不少小说站会把正文做成字体加密。番茄小说这类页面里,HTML 源码拿到手的往往不是正常汉字,而是一串看起来像乱码的私有区字符。直接解析页面当然不行,得先把字体映射关系还原出来。
这类需求里,难点不在请求本身,而在'把字认回来'。
二、处理思路
爬虫部分还是老一套:发请求、带上合适的请求头、拿到页面内容。真正要处理的是字体文件。
我这里的做法比较直接:
- 先在页面里找到自定义字体文件,通常是
.woff或.woff2 - 把字体里的每个码点渲染成黑白图
- 用 OCR 识别图里的真实文字
- 生成一份'字体码点 → 真实文字'的映射表
- 再用这份映射去替换页面里抓到的乱码
这条路不算优雅,但够实用。字体更新频率不高时,维护成本也还能接受。
三、环境准备
需要的 Python 依赖不多,重点是 OCR 和字体处理相关的库。
ddddocr 建议搭配 Python 3.10 或 3.11 使用,版本太老或太新都可能在依赖上多出一些杂活。
四、代码实现
1. 生成字体映射
先写一个字体渲染函数,把单个 Unicode 码点转成一张高对比度图片,方便后面的 OCR 识别。
2. 识别字体并构建字典
接着遍历字体中的字符,逐个渲染、识别,最后整理成映射字典。这个过程里,识别结果不一定一次就准,实际用的时候最好留个校验入口,别把错字静默写进结果里。
3. 获取字体文件
下载到本地的 .woff 文件,放在 Python 脚本同目录下就行。需要查看字体结构时,可以借助 FontCreator 之类的工具。
五、爬取正文
页面里通常只能先拿到第一章。继续往后翻时,番茄小说的'下一章'按钮是 button,没有直接可用的 href,所以更稳的办法还是回目录页提取链接。
分析后会发现,章节链接里的差异主要是数字 id。把这些 id 提出来,循环请求,就能把章节列表顺着抓下来。
然后就是正文替换:先拿到加密文本,再用前面生成的 mapping 做替换,页面里的私有区字符就会恢复成可读内容。
下面这部分就是爬取加密章节内容的主体逻辑,数量可以按需要调整。
六、完整脚本
把字体映射获取和正文抓取两部分拼起来,就能完成整套自动化流程。实际跑的时候,我会先确认字体文件有没有变化,再决定要不要重新生成映射;这一步省不了,跳过去很容易得到一份看着像'成功'、其实全是错字的结果。

