全国水雨情信息 字体反爬

网址:aHR0cDovL3h4ZmIubXdyLmNuL3NxX2RqZGguaHRtbA==
在这里插入图片描述
打开后F12发现字体都是乱码,不用想,肯定是加载了自定义的字体

把字体下载下来后加载看一下,都是正常的
在这里插入图片描述
解决思路:

先加载字体文件,然后遍历每一个字体,用OCR识别出来真实的文字,然后用一个字典建立映射关系,还原数据中的乱码

下面用fontTools这个库来处理字体 pip install fontTools

转xml文件看一下

from fontTools.ttLib import TTFont

if __name__ == '__main__':
    # 字体文件路径
    font_file_path = 'Db9FdR8Zv3_1725640418447.ttf'

    font = TTFont(font_file_path)
    font.saveXML('font.xml')

fontTools的一些操作

font.getGlyphOrder() # 返回一个字形名称列表,以其在文件中的顺序排序
font.getGlyphNames() # 返回一个字形名称列表,以字母顺序排序
font.getBestCmap() # 返回一个字形ID为键、字形名称为值的字典
font.getReverseGlyphMap() # 返回一个字形名称为键、字形ID为值的字典
font.getGlyphName(10000) # 输入字形ID返回字形名称
font.getGlyphID("uni70E0") # 输入字形名称返回字形ID
font.getGlyphSet() # 返回一个_TTGlyphSet对象,包含字形轮廓数据

这里以第41个字来举例
在这里插入图片描述
第41个字对应的name是glyph00040
在这里插入图片描述
下面用freetype-py这个库将字画出来 pip install freetype-py

ddddocr这个库来识别字体 pip install ddddocr

import ddddocr
import matplotlib.pyplot as plt
from fontTools.ttLib import TTFont
from fontTools.pens.freetypePen import FreeTypePen
from io import BytesIO
from loguru import logger

ocr = ddddocr.DdddOcr(beta=True,show_ad=False)

if __name__ == '__main__':
    font_file_path = 'Db9FdR8Zv3_1725640418447.ttf'
    font = TTFont(font_file_path)

    # 实例化Pen子类
    pen = FreeTypePen(None)
    glyph00038 = font.getGlyphSet()['glyph00040']
    glyph00038.draw(pen)
    pen.show()
    byteArray = pen.array()
    buffered = BytesIO()
    plt.imshow(byteArray)
    plt.axis('off')
    plt.savefig(buffered, format='PNG')
    ocrResult = ocr.classification(buffered.getvalue())
    glyph_table = font.getReverseGlyphMap()
    glyph_table = font.getBestCmap()
    for code,glyph_id in glyph_table.items():
        if glyph_id == 'glyph00040':
            logger.info('{} ====> {}'.format(chr(code),ocrResult))
            break

在这里插入图片描述
这样就成功把glyph00040对应的乱码给还原了

最终成品效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值