woff文件需用fonttools库解析为xml格式查看内容,直接文本编辑器无法读取;实操中应先用ttfont加载,注意区分woff/woff2格式,重点分析cmap和name表,并结合页面明文锚点校准字形映射。

woff 文件怎么打开看内容
woff 是压缩过的字体文件,直接用文本编辑器打不开有效信息;得先转成可读的 xml 格式。Python 里最稳的方式是用 fontTools 库解析,别指望用正则硬扒二进制流——woff2 结构复杂,header 和 table offset 都要校验,手写解析大概率漏字形或错位。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 装
fontTools:运行pip install fonttools - 用
ttf = TTFont("xxx.woff")加载,不是所有 woff 都能被识别为 TTFont,遇到报错Unsupported sfnt version说明可能是 woff2,得换woff2工具先解包 - 关键命令是
ttf.getGlyphOrder()和ttf['cmap'].getBestCmap(),前者列出所有字形名(如uniE800),后者给出 Unicode 映射关系 - 别直接看
ttf['glyf']——里面是轮廓数据,对还原文字没用;重点盯cmap和name表
怎么从网页里提取当前用的 woff 文件地址
字体反爬通常靠 CSS 的 @font-face 规则动态加载 woff,但地址可能藏在 JS 变量、内联 style 或 xhr 响应里。光靠 requests + BeautifulSoup 抓 HTML 往往拿不到真实链接,因为字体 URL 经常是拼接生成的。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用浏览器开发者工具,在 Network → Font 标签页里刷新页面,找状态码 200 的 woff 请求,右键 Copy → Copy link address
- 如果字体请求被 JS 动态发起,去 Sources → Page → 找含
woff或font-family的 JS 文件,搜fetch、new XMLHttpRequest或字符串拼接模式(如`/font/${hash}.woff`) - 注意 Referer 和 User-Agent:有些站点校验 referer,直接用
requests.get(url)会返回 403,得手动加headers={'Referer': 'https://xxx.com/'} - woff 地址可能是相对路径,需和页面 base url 拼接,别直接丢给
requests
字符映射字典怎么建才不翻车
映射字典不是简单把 woff 里的 Unicode 码点和文字一一对应——很多反爬字体故意把汉字映射到私有区(U+E800–U+F8FF),甚至同一字体每次加载都随机重排字形顺序。靠一次解析建静态字典,第二天就失效。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 必须结合页面上的“明文锚点”来校准:比如网页中有一段可见文字“电话:138****1234”,旁边用字体渲染了另一串“138****1234”,这时拿 woff 解析出的字形轮廓,和已知数字的轮廓做比对(用
ttf['glyf'][glyph_name].coordinates提取坐标点) - 优先用轮廓哈希(如 MD5 坐标序列)而非字形名匹配,因为
uniE800这类名字每次可能变,但“数字 1”的轮廓几乎不变 - 别存整张字典到代码里,用
pickle或 JSON 存本地,下次爬前先检查 woff 文件 hash 是否变化,变了就触发重新校准流程 - 常见坑:中文标点(如顿号、破折号)和英文标点共用一个 glyph,映射时得按上下文区分,不能无脑替换
Python 怎么把字体渲染的文本还原成可读字符串
拿到映射字典后,真正还原时不是靠“查表替换”,而是模拟浏览器行为:把字体文件、文本内容、CSS 样式一起喂给渲染引擎,再 OCR 或比对像素。纯 Python 不依赖浏览器很难 100% 还原,尤其当字体做了轻微扭曲或叠加干扰线。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 最轻量方案:用
PIL.ImageDraw.text+ImageFont.truetype加载 woff(需先转 ttf),把每个疑似字符单独渲染成小图,和页面截图中对应位置裁剪图做像素比对(SSIM 或模板匹配) - 避免用
pytesseract直接 OCR 渲染块——字体非标准、字号小、背景噪点多,识别率低于 40% - 如果目标网站结构稳定,建议把“字体 hash → 字符映射”缓存下来,后续只更新映射,不重复解析字体文件,省 IO 和 CPU
- 注意 woff 中的
loca表偏移可能异常,fontTools有时会跳过损坏字形,导致getGlyphOrder()返回数量少于实际显示字符数,得配合len(ttf['cmap'].tables[0].cmap)校验
字体反爬的麻烦不在解析本身,而在映射关系的脆弱性——同一个站点,今天用 woff,明天切 woff2;今天字形固定,明天加随机偏移。别想着一劳永逸建个通用字典,得把“字体获取→解析→校准→缓存→失效检测”做成闭环流程。










