首页 > 编程语言 >Python爬虫-字体加密 ddddocr FontCreator

Python爬虫-字体加密 ddddocr FontCreator

时间:2024-06-07 15:30:23浏览次数:16  
标签:img Python ddddocr 字体 time print import font FontCreator

目录

应用场景

解决思路

1.下载字体文件

2.分析

3.代码实现

版本1

版本2


应用场景

在爬取网页数据时我们有时可能会遇到如下面的情况,价格数字在网页上能正常显示,但在控制面板查看时却是显示空白,我们通过 requests 等库爬取该页面后得到的数据也是无法显示出来。

解决思路

1.下载字体文件

我们可以去控制面板找到该网页的字体文件,双击即可下载

这里提供字体文件下载地址:字体文件

如果想要查看该字体文件,需借助字体查看软件 FontCreator 进行查看(这步可以跳过,这里只是进行查看操作)

字体查看软件下载地址:FontCreator

打开后查看:

2.分析

每个字体有它对应的id,那么我们就可以通过该id,去匹配对应的字体,最后进行输出即可。

在python通过 requests 等库获取到该无法显示的空白字符串后,通过 for 循环遍历该空白字符串,用 ord() 函数即可输出每个空白的字符对应的id,最后根据映射规则进行替换输出。

3.代码实现

版本1

速度较慢,在我本机上实测30秒完成识别

只需在 jiexi_fontFile 函数中输入对应的字体的路径即可

import time
import ddddocr
import io
import matplotlib.pyplot as plt
from fontTools.ttLib import TTFont
from fontTools.pens.freetypePen import FreeTypePen

def jiexi_fontFile(filepath):
    start_time=time.time()
    font = TTFont(filepath)  # 解析字体文件
    fontdata=font.getGlyphSet()
    dic = {}  # 保存识别结果的字典
    ocr = ddddocr.DdddOcr(beta=True,show_ad=False)    # ocr识别字体
    for n, v in font.getBestCmap().items():
        glyph = fontdata[v]
        pen = FreeTypePen(None)  # 实例化Pen子类
        glyph.draw(pen)  # 画出字形轮廓
        b = pen.array()
        iodata = io.BytesIO()
        plt.imshow(b)
        plt.axis('off')  # 禁用坐标轴
        plt.savefig(iodata, format='PNG')
        plt.close()
        result = ocr.classification(iodata.getvalue())    # 识别结果
        dic[n] = result
        print(n,'——>',result)
    print('耗时:',time.time()-start_time)
    print('长度:',len(dic))
    return dic


print(jiexi_fontFile('96fc7b50b772f52.woff2'))

输出结果:

 

版本2

速度更快,在我本机上实测4秒完成识别

只需在 identify_word 函数中输入对应的字体的路径即可

import time
import ddddocr
from io import BytesIO
from PIL import Image, ImageDraw, ImageFont
from fontTools.ttLib import TTFont

def font_to_img(_code, font_path):
    """
    将每个字体画成图片
    :param _code:字体的数字码点
    :param font_path:字体文件路径
    :return: 每个字体图片对象
    """
    img_size = 1024
    img = Image.new('1', (img_size, img_size), 255)
    draw = ImageDraw.Draw(img)
    font = ImageFont.truetype(font_path, int(img_size * 0.7))
    txt = chr(_code)
    bbox = draw.textbbox((0, 0), txt, font=font)
    x = bbox[2] - bbox[0]
    y = bbox[3] - bbox[1]
    draw.text(((img_size - x) // 2, (img_size - y) // 7), txt, font=font, fill=0)
    return img


def identify_word(font_path):
    """
    :param font_path:字体文件地址
    :return:字体印射规则
    """
    font = TTFont(font_path)
    ocr = ddddocr.DdddOcr(beta=True)
    font_mapping = {}
    for cmap_code, glyph_name in font.getBestCmap().items():
        bytes_io = BytesIO()
        pil = font_to_img(cmap_code, font_path)
        pil.save(bytes_io, format="PNG")
        word = ocr.classification(bytes_io.getvalue())  # 识别字体
        print(f'数字Unicode:{[cmap_code]}-{[glyph_name]}-识别结果:{word}')
        # 构建字体印射规则
        font_mapping[cmap_code] = word

    """去除字体印射识别为空的键值对"""
    del_key = []  # 收集要删除的键
    for key, value in font_mapping.items():
        if not value:
            del_key.append(key)
    for i in del_key:
        font_mapping.pop(i)
    return font_mapping  # 返回字体印射规则

s_t = time.time()
mapping = identify_word('96fc7b50b772f52.woff2')
print('耗时:', time.time() - s_t)
print('长度:', len(mapping))
print('字体印射规则:', mapping)

输出结果:

标签:img,Python,ddddocr,字体,time,print,import,font,FontCreator
From: https://blog.csdn.net/zwq_zwq_zwq111/article/details/139526079

相关文章

  • python获取多只股票价格信息的方法
    python代码如下:importefinanceasefimporttimefromdatetimeimportdatetimeimportcsvfreq=1defprocess_row(row):#在这里处理每一行数据print('股票:'+row[0],'日期:'+row[2],'现价:'+row[3],'最高:'+row[5],'最低:�......
  • 单个python文件代码的车牌检测系统 使用pyqt做界面进行车牌检测,可以保存结果到excel文
    融合了hyperlpr3和opencv来检测车牌通过图片检测车牌的系统,使用了pyqt和hyperlpr3结合来进行检测,可以保存检测的结果到excel文件 亲自测试修改代码,运行正常并且不依赖百度网络api,纯本地运行,融合了2个车牌检测模型,第一个模型使用opencv来模糊图像,然后进行边缘检测和......
  • Python自动化发送邮件如何实现?怎么配置?
    Python自动化发送邮件需要注意什么?邮件群发的技巧?无论是个人使用还是企业需求,电子邮件的发送都是必不可少的。而Python作为一门功能强大的编程语言,可以通过自动化脚本实现批量发送邮件,从而提高工作效率。AokSend将详细介绍如何使用Python自动化发送邮件。Python自动化发送邮......
  • Python实现投递多线程任务
    使用Python的apscheduler库中的BackgroundScheduler实现投递多线程任务的示例代码。这个示例将展示如何根据任务ID投递和停止任务,设置任务同时执行的上限,以及删除全部任务。首先,确保你已经安装了apscheduler库:``pipinstallapscheduler``代码示例:``fromapscheduler.sched......
  • python系列:FASTAPI系列 04-GET请求 params参数
    FASTAPI系列04-GET请求params参数FASTAPI系列04-GET请求params参数前言一、查询参数二、参数的默认值三、多路径查询参数四、查询参数为必填项总结FASTAPI系列04-GET请求params参数前言get请求的参数在url后面携带,通常称做queryparams一、查询参数在......
  • Python简单实现多线程例子
    使用Python实现多线程的例子,演示如何在主线程内分别启动ABC三个线程,并实现启动和停止指定线程的功能``importthreadingimporttime#定义一个全局标志,用于控制线程的运行状态stop_thread_A=Falsestop_thread_B=Falsestop_thread_C=False#线程A的函数......
  • Python数据分析常用开源库 pycharm
    内容介绍Pandas数据处理的库,可以做可视化文件类数据交互的是比较好的CSVExcel环境搭建起来SeriesDataFrame前3天主要介绍DataFrame的使用(Pandas的API)第四天数据可视化day05~day08Pandas解决数据分析问题报表,取数(SQL,Pandas,Excel)业务分析能......
  • python各种加解密方法
    #-*-encoding:utf-8-*-fromhashlibimportmd5importbase64#MD5加密obj=md5()str="你是个小可爱"obj.update(str.encode("utf-8"))#obj.update("wusir".encode('utf-8'))#可以添加多个被加密的内容bs=obj.hexdigest()print("md5......
  • 8-4 【Python0036】中文级联菜单
    importtkinterastkfromtkinterimportttkfrompypinyinimportlazy_pinyin#省份、城市、地区数据data={"北京":{"北京市":["东城区","西城区","朝阳区"],},"上海":{"上海市......
  • 用 Python 撸一个 Web 服务器-第9章:项目总结
    项目总结本教程带大家一起实现了一个TodoList程序,包含基础的增删改查功能,和用户登录认证。这也是Web开发中最常见的需求。我画了一张思维导图,帮助你从宏观的角度来概览TodoList程序,加深你对Web开发的理解。TodoList项目整体思路参考MVC设计模式。有意设计utils......