GlidedSky字体反爬2

今天撸一发字体反爬2的代码
打开浏览器-登入网页-F12-F5
GlidedSky字体反爬2_第1张图片
这网页的数字。。。
很犀利,后台的我看不懂就算了,页面展示的有些我也看不懂。。。这怎么搞,不过看样子这个应该
GlidedSky字体反爬2_第2张图片
页面用了4中数字的0-9,零-玖,0-九,罗马的一到九
F12的却是一些和数字无关的中文了

通过思考,这里应该有2个数字加密的地方,第一个是源代码中的解密成页面上的,然后页面上的在解密成0-9的阿拉伯数字
后一个就很简单了,可以直接手动弄一个字典,例如dict_s = {‘0’ : ‘一,壹’}等,那个圈圈里放个1我不会打。。。
所以现在我需要做的就是把第一个加密弄出来

一、找加密的文件

这种加密的文件一般在网页的源代码中就能找到,如果找不到的话请百度一下看有啥别的方法没有
GlidedSky字体反爬2_第3张图片
因为字段太大了,所以我打开了两个浏览器,合并在一起,这段字符疑似加密的文件,下载下来看看
下载下来以后文件是这个样子的
GlidedSky字体反爬2_第4张图片
有很多字啊,而且我还翻页查了一下,发现下一页中有不在字体文件中的字,所以“判定”这个字体文件应该是有多份的,需要我们翻页就下载一次文件,然后找出对应关系
查看字体文件能看到字符有101个,其实第一个是不需要的,此处就能提个问题?为什么第一个是无效的?既然无效为什么还要写在字体文件中?故意的?
字体文件中的
GlidedSky字体反爬2_第5张图片
我测试了一下uni57F9,换成u’\u57F9’,是字’培’,培字就是源代码中的字
GlidedSky字体反爬2_第6张图片
就是上面的这些字体,所以它们的对应关系应该是
GlidedSky字体反爬2_第7张图片
网页显示的是(1)(1)零
我们以零为例子,源代码中零变成了‘培’,然后‘培’的Unicode码u‘\u57F9’换成字体文件中的uni57F9
然后查看uni57F9对应的位置就能知道是几了
GlidedSky字体反爬2_第8张图片
我将字体文件中的100个字,也就是100个uniXXXX按0-9,0-9,0-9这样分配好

ttf_name = '10.ttf'
save_ttf(font_data,ttf_name)
#onlineFonts = TTFont(ttf_name)#
#onlineFonts.saveXML('10.xml')#用来查看文件的,在抓取途中就不需要了
ori_font = TTFont(ttf_name)
a = ori_font.getGlyphOrder()[1:]#提取字体文件中的uniXXXX
dict_s = {}
#创建一个0-9的列表
number_list = [0,1,2,3,4,5,6,7,8,9] * 10

for x,y in zip(a,number_list):
	#將unixxxx转换成'\u57F9'
	keys = x.replace('uni','\\u')#将uniXXXX换成u'\uXXXX'
	keys = json.loads(f'"{keys}"')#将u'\uXXXX'换成中文
	dict_s[keys] = y
	return dict_s

font_data 是网页中加密文件的那段字符
GlidedSky字体反爬2_第9张图片
这段字符是用ba64加密过的,先加密,然后下载文件

def save_ttf(font_data,ttf_name):
	online = base64.b64decode(font_data)
	with open(ttf_name,'wb')as f:
		f.write(online)

dict_s弄好以后是这样的
GlidedSky字体反爬2_第10张图片
注意我标出来的这个鱼字,在dict中的鱼小了一号,但是在获取网页中的鱼却是正常的,电脑在匹配的时候会认为这两个不是同一个字,也就没法获取字所对应的数字了,导致我在抓取的时候本来是129却成了19。
所以我们要将字典的键用ASCII码来代替
在这里插入图片描述
这个换了,那个网页源代码上获取的‘培’也需要换成ASCII码

用ord和chr就行
ord()

这里要注意一下
ori_font.getGlyphOrder()[1:]#获取文件中Glyphorder的name
ori_font.getBestCmap().items()#获取cmap顺序

GlidedSky字体反爬2_第11张图片
这张图是getBestCmap().items()组成的字典,我提取了数字部分,但是这个顺序和字体文件是不一样的
后来改回getGlyphOrder(),再做一下转换就行,以后查找顺序的时候可以两个都打印一下,然后自己看哪个的顺序和文件的对上就用哪个
改好以后,这个网页的字体加密就弄完了
这个应该还算是简单的字体加密,困难一点的可以试一下猫眼的,猫眼的有些也简单,但是有些它用了位置的偏移,需要用到knn计算相似度

最后跑了一下,发现还是不对。。。。
还是鱼与鱼的问题
GlidedSky字体反爬2_第12张图片
ord那个瓦是网页爬虫抓下来的瓦字
chr那个瓦是字体文件上的瓦字
两个瓦就不是同一个字,所以不管用汉字做字典的键还是ascii的数字做键,都匹配不到这个字
怎么搞?没法搞?只能强怼,因为字体文件是每次都变化的,有这样的情况就重新抓,直到没有这种字,这叫强怼。。。

每天进步一点点,缩短和大佬的距离

你可能感兴趣的:(爬虫,python)