ocr字体反爬

这文章是两位大佬的思路 我只是结合下 本人菜鸡一个

https://blog.harumonia.moe/font-antispider-cracker/ 这里的是大佬字体反反爬思路

然后是ddddocr 哲哥无敌

fontforge 这是个字体应用

https://fontforge.org/en-US/

首先,需要写一个 python 脚本,暂且命名为 script.py.

import fontforge 
F = fontforge.open("gRYimlGgKp1mW5ldNU5LIoLTJdKXEnKo.ttf") 
for name in F:     
    filename = name + ".png"     
    F[name].export(filename) 

然后通过

fontforge -script script.py

即可完成 ttf -> png 的工作.结果如下.

这里大佬的文章中没说 为什么 import fontforge会失败;其实找了很久发现这个是人家fontforge自己的python环境,所以pypi没有扩展

请添加图片描述

<think>好的,我现在需要帮助用户解决懂车帝详情页字体的问题。首先,我得回忆一下之前用户提供的参考引用内容,里面提到了三个引用,都是关于懂车帝字体的案例。用户的问题是如何解决这个问题,所以我要根据这些引用和我的知识来整理步骤。 首先,用户提到的引用1中,提到字体的网站通常需要检查字体文件是固定地址还是动态获取的。动态获取的话,每次请求可能都需要重新下载字体文件。然后使用ddddocr来识别字体,可能需要调整识别结果,建立映射表,最后替换页面上的字符。引用3也提到处理数据时要和映射表一致,替换后得到正确数据。所以步骤应该包括分析字体加载方式、获取字体文件、解析字体、生成映射、替换数据这几个关键点。 接下来,我需要把这些步骤详细化。首先分析字体加载方式,可能需要用浏览器开发者工具查看网络请求,找到woff或ttf文件的来源,看是固定URL还是每次动态生成的。然后,获取字体文件,可以用Python的requests库下载。解析字体可能需要用fontTools库提取字形信息,或者用ddddocr识别字形图片。生成映射表时,可能需要将字体中的字符代号与实际字符对应起来,比如数字0-9被替换成其他Unicode字符,需要找到对应关系。最后,替换页面中的加密字符为真实数据。 另外,引用3中提到处理数据时要注意空格的问题,可能是在分割字符串时容易出错,这点需要提醒用户注意。还要考虑到字体可能定期更换,所以需要动态更新映射表,或者每次请求都重新解析字体文件。 可能遇到的问题包括字体文件动态变化、识别准确率不高、字符映射复杂等。解决方案可能需要自动化下载和解析字体,使用更准确的OCR工具,或者手动验证映射关系。此外,代码示例可能会有帮助,比如如何用fontTools解析字体,生成XML,提取字形信息,或者用ddddocr识别字形图像。 需要确保步骤清晰,用户能一步步跟随操作。同时,生成相关问题,可能涉及动态字体处理、提高识别准确率、处理多页面字体变化等。</think>### 懂车帝字体解决方案 懂车帝详情页的字体主要通过动态加载自定义字体文件实现,关键字符(如价格、评分)会被替换为特殊字形。以下是解决步骤和代码示例: --- #### **1. 分析字体加载机制** - 打开浏览器开发者工具(F12),在**Network**面板筛选`Font`类型文件,观察`.woff`或`.ttf`字体文件的加载方式[^3]。 - 确认字体文件是**固定URL**还是**动态生成**(例如通过接口返回或加密参数生成)。 --- #### **2. 获取并解析字体文件** 使用Python的`requests`下载字体文件,并用`fontTools`解析字形映射关系: ```python from fontTools.ttLib import TTFont import requests # 下载字体文件 font_url = "https://example.com/path/to/font.woff" response = requests.get(font_url) with open("custom_font.woff", "wb") as f: f.write(response.content) # 解析字体 font = TTFont("custom_font.woff") font.saveXML("font.xml") # 导出XML分析字形名称与编码的对应关系 ``` --- #### **3. 生成字符映射表** - **方法1(字形坐标匹配)**:提取字体中每个字符的坐标特征,与真实字符手动建立映射[^1]。 - **方法2(OCR识别)**:使用`ddddocr`等工具识别字体生成的图片: ```python from PIL import Image, ImageDraw, ImageFont import ddddocr # 生成字体图片并识别 def get_char_map(font_path): ocr = ddddocr.DdddOcr() char_map = {} font = TTFont(font_path) for glyph_name in font.getGlyphOrder(): if glyph_name.startswith("uni"): unicode_code = glyph_name[3:].lower() char = chr(int(unicode_code, 16)) # 生成字形图片(模拟渲染) img = Image.new("RGB", (50, 50), "white") draw = ImageDraw.Draw(img) draw.text((10, 10), char, font=ImageFont.truetype(font_path, 30), fill="black") # OCR识别 result = ocr.classification(img) char_map[glyph_name] = result return char_map ``` --- #### **4. 替换页面加密字符** 根据映射表替换HTML或JSON中的加密字符: ```python def decrypt_text(encrypted_text, char_map): decrypted = [] for char in encrypted_text: # 查找字符对应的Unicode名称(如'uniE643') glyph_name = font["cmap"].getBestCmap().get(ord(char), "") decrypted.append(char_map.get(glyph_name, char)) return ''.join(decrypted) # 示例:替换加密价格 encrypted_price = "" # 页面中看到的乱码 price_map = {'uniE643': '1', 'uniE644': '2', 'uniE645': '3'} # 自定义映射 real_price = decrypt_text(encrypted_price, price_map) print(f"真实价格: {real_price}") # 输出: 123 ``` --- #### **5. 动态更新映射表(关键)** - 若字体文件**每次请求变化**,需在爬虫中实时下载最新字体并更新映射。 - 建议将字体解析和映射生成封装为独立函数,每次请求页面时触发。 --- #### **注意事项** 1. 使用`split()`处理加密数据时,注意隐藏的空格或特殊分隔符[^3]。 2. 验证映射准确性:人工抽查关键字段(如价格、评分)。 3. 结合**请求头加密参数**(如`x-sign`)提高绕过成功率[^2]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值