字体加密是网站对抗爬虫的常见手段,通过自定义字体文件将关键数据(如价格、电话号码等)映射为特殊编码,使爬虫获取乱码而浏览器正常显示。以下是破解技术的核心方法和实践要点:
一、字体反爬原理
1.‌静态字体‌:字体文件固定,字符映射关系不变,如58同城通过CSS加载自定义字体文件,数字被替换为特定Unicode编码。
2.‌动态字体‌:每次请求生成不同字体文件,如猫眼电影票房数据使用动态WOFF文件,需实时解析映射关系。
3.‌混合加密‌:结合Base64编码或SVG映射,如大众点评将字体文件编码后嵌入CSS,需先解码再分析。
二、破解技术方案
1. 静态字体破解
‌步骤‌:
从网页源码或API响应中提取字体文件(TTF/WOFF)。
使用fontTools解析字体文件,获取cmap表中的编码映射关系。
建立编码与真实字符的映射字典,替换网页中的加密字符。
‌示例代码‌:
python

from fontTools.ttLib import TTFont
font = TTFont("font.woff")
cmap = font.getBestCmap()  # 获取编码映射
relation = {"uniE908": "5", "uniE909": "3"}  # 手动建立映射

2. 动态字体破解
‌关键点‌:
实时下载最新字体文件,分析字形坐标差异(如glyf表中的coordinates)。
对多次请求的字体文件聚类,提取稳定特征(如笔画数量)建立动态映射‌工具‌:
FontCreator可视化分析字形。
fonteditor在线工具辅助比对字体差异。
3. Base64/SVG加密处理
‌流程‌:
解码CSS中的Base64字体(如实习僧网站)。
解析SVG路径映射(如大众点评的eb类字符)。
‌代码片段‌:
python

import
 base64
woff_data = base64.b64decode(css_text.split(
"base64,")[1].split(")")[0
])
with open("font.woff", "wb") as
 f:
    f.write(woff_data)


三、完整项目实现
以下为破解猫眼动态字体的完整代码框架:


import requests
from fontTools.ttLib import TTFont
from io import BytesIO

def parse_font(font_url):
    font_data = requests.get(font_url).content
    font = TTFont(BytesIO(font_data))
    glyphs = font.getGlyphOrder()[2:]  # 跳过前两个保留字符
    # 根据坐标差异建立映射(示例逻辑)
    return {glyph: str(i) for i, glyph in enumerate(glyphs)}

def main():
    page_html = requests.get("https://maoyan.com/board/1").text
    font_url = re.search(r"url\('(.*?\.woff)'\)", page_html).group(1)
    mapping = parse_font(font_url)
    # 替换页面中的加密字符...

四、注意事项
反反爬策略‌:部分网站会检测字体解析行为,需模拟正常请求头并控制请求频率。
OCR辅助‌:对复杂字体加密(如番茄小说),可结合Tesseract识别截图内容。
自动化更新‌:动态字体需定期校验映射关系,推荐使用cron定时任务。
以上方法覆盖了当前主流的字体反爬类型,实际应用中需根据目标网站的加密特点灵活组合。

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐