字体反爬之快手

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

阅读步骤

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

效果展示

在这里插入图片描述

项目地址

快手字体反爬项目

快手字体反爬机制图示

在这里插入图片描述

不变的关系

每个请求字体文件不同,每个字体文件字体的笔画不同。
通过对比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))

总结

  • 字体反爬的关键是找到唯一不变的映射关系
发布了33 篇原创文章 · 获赞 21 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/u013356254/article/details/90523223