字体反爬之快手

Posted 「已注销」

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字体反爬之快手相关的知识,希望对你有一定的参考价值。

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

阅读步骤

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

效果展示

项目地址

快手字体反爬项目

快手字体反爬机制图示

不变的关系

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

总结

  • 字体反爬的关键是找到唯一不变的映射关系

以上是关于字体反爬之快手的主要内容,如果未能解决你的问题,请参考以下文章

Python字体反爬之乐居字体反爬,一文看懂,一文学会

Python爬虫入门教程 64-100 反爬教科书级别的网站-汽车之家,字体反爬之二

python反爬之用户代理

python反爬之前端加密技术

python反爬之网页局部刷新1

Python3爬虫反反爬之搞定同程旅游加密参数 antitoken