python爬虫#实战练习2#字体反爬

案例需求:

  • 解决**同城二手车价格字体加密
  • 在这里插入图片描述
    -在这里插入图片描述

查找字体加密位置:

在这里插入图片描述
我们发现在这段代码中,base64后面就是加密的字体样式


代码实现:

  • 导入库
import base64
from io import BytesIO
  • 将base64编码字体解码成二进制编码,并保存为woff文件
def make_font_file(base64_string: str):
    # 将base64编码的字体字符串解码成二进制编码
    bin_data = base64.decodebytes(base64_string.encode())
    with open('textwoff.woff', 'wb') as f:
        f.write(bin_data)
    return bin_data
  • 将解码字体保存为xml
def convert_font_to_xml(bin_data):
    # ByteIO把一个二进制内存块当成文件来操作,
    font = TTFont(BytesIO(bin_data))
    # 将解码字体保存为xml
    font.saveXML("text.xml")
  • 查看繁体字编码
    在这里插入图片描述

在这里插入图片描述

  • 打开xml文件找到cmap标签,发现code的后四位和我们解码后的繁体字编码后四位可以对应上,再把其中name最后面的数字减一,就是解码后的价格
    在这里插入图片描述
def run_font(string, fanti):
    price = []
    s = make_font_file(base64_string=string)
    convert_font_to_xml(s)

    # 打开xml文件
    with open('text.xml', 'r', encoding='utf-8') as f:
        xml_data = f.read()
    code_num = re.findall('<map code="(.*?)" name="glyph000(.*?)"/>', xml_data)
    for f in fanti:
        for code, num in code_num:
            if code[-4:] == f.encode('unicode-escape')[-4:].decode('utf-8'):
                n = int(num)-1
                price.append(str(n))
                break
            if f.encode('unicode-escape')[-4:].decode('utf-8') == '.':
                price.append('.')
                break
    p = ''.join(price)
    return p```

# 实现效果:

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b48181578d54461b8493be0190ece46c.png#pic_center)
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1250c209e2244362afa725a9cbdf0b98.png#pic_center)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值