Python爬虫 - 字体文件反爬

字体文件反爬
在搞定静态字库反爬之后, 可以解决部分字体文件的反爬, 但动态字文件反爬是解决不掉的。此文章就是为解决动态字体文件的反爬而写。用猫眼电影的字体文件反爬为例

一、开发者模式查看网页内容
学徒 - 字体反爬
二、下载网页源码到本地

学徒 - 字体反爬

三、字体文件保存本地通过 font creator 查看字体文件信息

学徒 - 字体反爬

四、通过 fontTools库,将字体文件转换成xml格式
在这里插入图片描述

from fontTools.ttLib import TTFont
font = TTFont('b5e01985820a383fce486bf70db66a8f2076.woff')
font.saveXML('b5e01985820a383fce486bf70db66a8f2076.xml')

学徒 - 字体反爬
通俗来说这个是它的键

学徒 - 字体反爬
这个是它的值他们两个是映射的关系

将字体文件转换成xml格式可以发现字体保存的图行信息是不变的, 变化的是unicode映射

五、通过fonttools库,获取字体信息中不变的部分

dict = {
		'uniEE7F': '4',
        'uniF341': '8',
        'uniF626': '0',
        'uniF76F': '3',
        'uniE9B2': '6',
        'uniF5A3': '5',
        'uniEA75': '9',
        'uniF126': '7',
        'uniE640': '1',
        'uniE079': '2',
    }
    font2 = TTFont('base1.ttf')
    obj_list2 = font2.getGlyphNames()[1:-1]
    # print(obj_list2)
    uni_list2 = font2.getGlyphOrder()[2:]
    # print(uni_list2)
    # font2.saveXML('base2.xml')
    mapping_dict = {}
    for uni2 in uni_list2:
        obj2 = font2['glyf'][uni2]
        # print(obj2)
        for uni1 in uni_list1:
            obj1=font1['glyf'][uni1]
            # print(obj2)
            if obj2 == obj1:
                # print(uni2,dict[uni1])
                mapping_dict[r'\u'+ uni2[-4:].lower()] = dict[uni1]

六、存入CSV

    def main1(self):
        while True:
            list = []
            quan = self.html.xpath("//div[@id='ticket_tbody']/ul[@class='canTouch']")
            for i in quan:
                # list = {}
                name = i.xpath("./li[@class='c1']/b/text()")[0]
                # print(name)
                zong_price = str(i.xpath("./li[@class='c1']/em[2]/i[@class='cs']/text()"))
                # print(zong_price)
                # print(self.font())
                for key, val in self.font().items():
                    zong_price = zong_price.replace(key, val)
                print(zong_price[2:-2])
                list = [name,zong_price[2:-2]]
                list.append(list)
                with open('Myan1.csv','a+', newline='') as f:
                    title = csv.writer(f)
                    f.seek(0)
                    title.writerow(list)
            time.sleep(4)

结果:
学徒 - 字体反爬
参考资料:
fontTools库详解
github fonttools库详解

相关文章: