zoukankan      html  css  js  c++  java
  • Spider-天眼查字体反爬

    字体反爬也就是自定义字体反爬,通过调用自定义的woff文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容!

    1.思路

    近期在爬取天眼查某公司详情页遇到了字体反爬,经过多次测试,终于解决了字体反爬

    首先我们来看一下字体反爬

    此图可以看出源代码数字跟页面显示的内容是不一样的,在调试器中看到它有一个类tyc-num

    此图可以看出类tyc-num存放的是一个字体,通过network获取这个字体

    此图可以看出正常的字体数字是1234567890而现在显示的是7540129863它是顺序打乱的,把tyc-num.woff下载过来,下载过来之后发现windows是查看不了的,我用的是在线工具查看

    在线工具链接:FontEditor

    此图可以发现索引2对应的是4,说明第4个数字是0,通过Python对woff转换成xml

    from fontTools.ttLib import TTFont
    font = TTFont('tyc-num.woff')
    font.saveXML('tyc-num.xml')

    查看xml文件

    此图发现id2对应是4跟在线查看器是一样的,那就找到了对应关系

    2.代码实现

    安装 fontTools

    pip install fontTools

    上代码(代码更新2019-01-21|19:23:16) PS:发现某些公司时间还是对不上,代码更新了,上面思路是一样的

    #!/usr/bin/env python
    # -*- coding:utf-8 -*- 
    from fontTools.ttLib import TTFont
    import re
    
    font = TTFont('tyc-num.woff')  # 打开tyc-num.woff
    font.saveXML('tyc-num.xml')  # 保存为tyc-num.xml
    with open('tyc-num.xml', 'r') as f:
        xml = f.read()  # 读取tyc-num.xml赋值给xml
    GlyphID = re.findall(r'<GlyphID id="(.*?)" name="(d+)"/>', xml)  # 获得对应关系
    GlyphIDNameLists = list(set([int(Gname) for Gid, Gname in GlyphID])) # 对应关系数量转换
    # print(GlyphIDNameLists)
    DigitalDicts = {str(i): str(GlyphIDNameLists[i - 2]) for i in range(2, len(GlyphIDNameLists)+2)}  # 数字对应关系的字典推导式
    # print(DigitalDicts)
    GlyphIDDicts = {str(Gname): DigitalDicts[Gid] for Gid, Gname in GlyphID}  # 通过数字对应关系生成源代码跟页面显示的字典推导式
    print('-' * 39 + '数字对应关系的字典推导式' + '-' * 39)
    print(DigitalDicts)
    print('-' * 27 + '通过数字对应关系生成源代码跟页面显示的字典推导式' + '-' * 27)
    print(GlyphIDDicts)

    代码运行结果

  • 相关阅读:
    2021.2.5 学习总结
    2021.2.1 学习总结
    2021.2.4 学习总结
    学习:C#中struct与class的区别(转)
    学习:DirectoryEntry::Path 属性(winnt、LDAP、IIS)(转)
    学习:Asp.net页面传值总结(转)
    学习:WinForm分页控件(转)
    学习:c#中抽象类和接口的相同点跟区别(转)
    学习:C#中获取当前路径的几种方法(转)
    记录:new关键字、new修饰符、new约束
  • 原文地址:https://www.cnblogs.com/Python-XiaCaiP/p/10297698.html
Copyright © 2011-2022 走看看