爬取网站:http://glidedsky.com/level/crawler-font-puzzle-2
说下这个网站吧,个人感觉难度还是挺大的,是个很好的爬虫练手网站
字体反爬主要思路:**找到加密字体的文件 --> 保存为ttf格式文件 --> 用字体编辑器查看是加密字体 --> 解析ttf,保存为xml文件 --> 分析xml文件,找到对应规则 -->按照规则解析源码 **
那接下来先看下这些加密字体到底有多折磨人吧@_@
可以看到页面上显示了很奇怪的数字,并且源码上对应的也是毫无相关的中文,那么现在已经可以断定是字体反爬了
第一步:找到加密文件 查看源码可以看到font-family下面有一长串的字符串,通过格式可以看出这是base64加密,先解密拿到字体加密文件
# 获得base64编码文件 soup = BeautifulSoup(v_repose.text, "html.parser") html = str(soup.select('style')) str_base64 = html.split('base64,',1)[1] font_face_base64 = str_base64.split(') format', 1)[0] # base64 解密 base64_file = base64.b64decode(font_face_base64)第二步: 保存为ttf格式文件
with open('ttf_data/'+str(k)+'.ttf', 'wb') as f: f.write(base64_file) #解析ttf,保存为xml font = TTFont('ttf_data/'+str(k)+'.ttf')第三步:用字体编辑器查看是加密字体 可以看到0-9都有对应的unicode编码,先解码看下到底是什么 那么现在大概的思路应该出来了,0-9对应的unicode编码与源码的中文应该是形成一一对应关系
第四步:解析ttf,保存为xml文件
# 转为 xml 格式文件,并保存 font.saveXML('xml_data/'+str(k)+'.xml')第五步:分析xml文件,找到对应规则
这是0-9对应的编码
这是中文对应的编码
那么总体思路就是:从源码获取每个数字对应的中文,然后解码,利用这个unicode在xml文件中找到与其对应的编码,然后再利用这个编码找到0-9数字(可能有点绕,多看几遍xml文件和源码应该就捋清楚了)
应网站要求,这里就不贴代码了,希望有心人都能通过这一关,加油!