字体反爬之快手

快手的直播列表页面的粉丝数用了字体反爬,之前在字体反爬之猫眼电影中提过这类问题的解决方案。
字体反爬的核心是找出字体之间不变的映射关系。
在这里插入图片描述

阅读步骤
  • 效果展示
  • 项目地址
  • 快手字体反爬机制图示
  • 不变的关系
  • 总结
效果展示

在这里插入图片描述

项目地址

快手字体反爬项目

快手字体反爬机制图示

在这里插入图片描述

不变的关系

每个请求字体文件不同,每个字体文件字体的笔画不同。
通过对比n个字体文件找到一个关系

  • 字体的笔画x轴并且on=“1”的关系是固定的,因此我们可以通过这个关系构造一个hash,然后和默认字体进行映射。
   def parser_contour(self, font_xml):
        for k, v in self.font_map.items():
            try:
                element = font_xml.xpath('//TTGlyph[@name="{}"]'.format(k))[0]
                _pts = element.xpath('./contour/pt')
                pts=[''.join(pt.xpath('./@x'))for pt in _pts if ''.join(pt.xpath('./@on'))=='1' ]
                if not pts: continue
                contours = [str(e) for e in pts]
                self.contour_to_font[md5(json.dumps(contours))]=v
            except Exception:
                raise Exception('{}字体改版,请重新更新settings中的配置,key:{},val:{}'.format(self.path,k,v))

    def parser_map(self, font_xml):
        for element in font_xml.xpath('//TTGlyph'):
            try:
                name = ''.join(element.xpath('@name')[0])
                _pts = element.xpath('./contour/pt')
                pts = [''.join(pt.xpath('./@x')) for pt in _pts if ''.join(pt.xpath('./@on')) == '1']
                if not pts: continue
                contours = [str(e) for e in pts ]
                self.uni_to_contour[name.upper()] = md5(json.dumps(contours))
            except Exception as e:
                raise Exception('{}字体改版,请重新更新settings中的配置,error:{}'.format(self.path, e))
总结
  • 字体反爬的关键是找到唯一不变的映射关系
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值