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库详解