猫眼电影字体反爬

1.解决思路

1.1 获取对照组字体文件,按照不同字形字体的unicode得到文字与其坐标的对应关系形成可遍历的数据结构,然后处理成可计算的数组或者直接遍历出所有的坐标数据;
1.2 再提取当前访问页面的自定义字体文件,取出其各个文字对应的坐标信息,然后也处理成数组或者遍历出所有的坐标;
1.3 将最新的坐标数据与对照字体的坐标数据进行计算,得出最小的差别值的索引值,再根据这个索引取出匹配度最高的文字;
1.4 再根据匹配到的文字对应的unicode找出html源码中加密的位置将文字替换上去。

2.网页解析

2.1 猫眼电影加密字体为数字类型的,并且每次刷新都是不同字形的字体,所以字体文件需实时获取;

2.2 下载字体文件后用分析工具打开对照源码查看编码对应关系,源码中代替数字的编码后四位与字体文件中数字对应的unicode的后四位相同;


2.3 字体文件还包含了了这种字体每个数字形成的坐标数据,可用fonttools模块中的TTFont打开字体文件获取;

# 打开字体文件
new_font = TTFont('./fonts/current.woff')
# 以xml格式保存,查看各种对应关系
new_font.savexml('./fonts/fong.xml')
# 可获取各个数字对应的unicode,索引对应数字的索引
unicodes = new_font.getGlyphOrder()[2:]
# 根据unicode获取对应数字的坐标信息
contour=new_font['glyf'}[unicode].coordinates
3.重要代码实现

3.1 获取5组字体数据,手动创建成对照表;

from fontTools.ttLib import TTFontdef get_font_infos():"""获取下载的各种字体信息,作为样例进行训练:return: 返回全部字体的坐标信息"""font1=TTFont('./fonts/1.woff')order1=[3,8,2,6,5,9,7,1,0,4]contour1=get_contour(font1,order1)font2=TTFont('./fonts/2.woff')order2=[9,4,0,7,1,5,2,8,6,3]contour2=get_contour(font2,order2)font3 = TTFont('./fonts/3.woff')order3 = [9,5,6,0,7,3,2,1,8,4]contour3= get_contour(font3, order3)font4 = TTFont('./fonts/4.woff')order4 = [6,1,3,2,5,7,0,8,9,4]contour4 = get_contour(font4, order4)font5 = TTFont('./fonts/5.woff')order5 = [6,1,4,0,3,7,2,9,8,5]contour5 = get_contour(font5, order5)contours=contour1+contour2+contour3+contour4+contour5return contoursdef get_contour(font,order):"""获取下载好的各个字体的坐标信息:param font: 不同的字体文件:param order: 不同顺序(字体)的实例:return: 返回各个字体的坐标信息"""unicodes=font.getGlyphOrder()[2:]infos=[]font_dict={}# 用枚举函数遍历出字体的Unicode及对应的索引for index,unicode in enumerate(unicodes):contour=font['glyf'][unicode].coordinatescontour_list=[i for items in contour for i in items]# 根据索引得出各个文字对应的坐标信息,并将文字添加到对应的坐标信息列表中contour_list.insert(0,order[index])infos.append(contour_list)# 打印出需要的对照表,新建font_data存储对照表print(font_dict)return infosif __name__=='__main__':get_font_infos()

3.2 获取对照表中坐标及数字顺序的标签,转化成数组以备后续与实时获取的字体信息进行运算比较;

import numpy as np
from . import font_datadef base_array():"""根据制作好的字体对照表创建可以进行比较的数组:return: 创建好的训练数组及各种字体的存在形式"""# 获取对照表中存储的各种字体的数字顺序orders=[data[0] for data in font_data]# 坐标contour=[data[1] for data in font_data]# 创建50行,150个数位0的数组base_array=np.zeros([50,150])# print(base_array)for index,array in enumerate(contour):# base_array中第index+1行且1到len(array)的数据等于array的全部数据(将array替换到base_array[index,:len(array)]索引指示的位置)base_array[index,:len(array)]=arrayreturn base_array,orders

3.3 获取当前访问时的字体数据,转化成数组与对照组进行运算匹配,获取匹配度最高的数字;

def get_num(new_array,base_array,orders,k=5):"""得到自定义字体的坐标数组后与训练数组进行knn计算,得到knn系数后取出最相似的5个对应的索引,再根据索引得到对应的数字:param new_array: 新的自定字体坐标数组:param base_array: 训练数组:param orders: 不同训练字体的样式标签:param k: 获取的相似字体数目:return: 返回匹配度最高的数字"""# 根据knn公式获取knn值diff=(((np.tile(new_array,(50,1))-base_array)**2).sum(axis=1))**0.5# 将对比后的knn系数进行排序并返回其索引值diff_index=diff.argsort()count_num={}for i in range(k):# 根据diff值的索引获取相应位置的数字num=lables[diff_index[i]]# 用字典标记某个字匹配的次数,记录在value上,出现就加1,没有就为0count_num[num]=count_num.get(num,0)+1# 取出字典中某个字的匹配次数(可能有多个字)再按照字的出现频率进行排序count_list=sorted(count_num.items(),key=lambda x:x[1],reverse=True)return count_list[0][0]def knn_main(new_contour_list):"""执行knn操作,获取到匹配度最高的数字"""base_array, orders = train_array()new_array = np.zeros([150])new_array[:len(new_contour_list)] = new_contour_listnum=get_num(new_array,base_array,orders,5)return num

3.4 最后的到当前字体的unicode与数字的对应关系,再根据unicode与源码中替代数字的编码关系对其进行替换,然后进行解析数据(1-3点的代码即可完成字体反爬,这步可根据自己的要求进行定制补充)。

K近邻思想解决字体反爬相关推荐

  1. k 近邻算法解决字体反爬手段|效果非常好

    字体反爬,是一种利用 CSS 特性和浏览器渲染规则实现的反爬虫手段.其高明之处在于,就算借助(Selenium 套件.Puppeteer 和 Splash)等渲染工具也无法拿到真实的文字内容. 这种反 ...

  2. 【机器学习】KNN算法及其用KNN解决字体反爬

    KNN算法及其用KNN解决字体反爬 关于KNN算法 概要 简介 原理 KNN算法Python实现 KNN解决字体反爬 web-font介绍 例子 最后 关于KNN算法 概要 K最近邻(kNN,k-Ne ...

  3. pythonttf字体反爬虫_利用Python采集起点中文网小说,并解决字体反爬的问题

    个人比较喜欢看小说,于是乎想利用Python爬取小说网站--起点中文网,在Python编程爬取定位过程中遇到了Python反爬虫,咨询了我旁边的前端大神,说下方法 当前页面接口返回的html源码 当前 ...

  4. python爬取大众点评字体_python爬取大众点评解决字体反爬

    今天我们弄一下大众点评 学习阶段,我们要抱着学习的目的 重点是思路,做爬虫就不要想着一劳永逸了 方法公开,人家就换了 知识是你自己的,学到了,他换不掉 好了,我们开始吧 网站展示 https://ww ...

  5. 斗鱼关注人数爬取 | 字体反爬的攻与防

    作者:CJ Ting 原文:https://cjting.me/2020/07/01/douyu-crawler-and-font-anti-crawling/ 之前因为业务原因需要爬取一批斗鱼主播的 ...

  6. 斗鱼关注人数爬取 ── 字体反爬的攻与防

    之前因为业务原因需要爬取一批斗鱼主播的相关数据,在这过程中我发现斗鱼使用了一种很有意思的反爬技术,字体反爬. 打开任何一个斗鱼主播的直播间,例如 这个主播,他的关注人数数据显示在右上角: 斗鱼在关注数 ...

  7. 爬虫笔记41之反爬系列四:字体反爬、JS反爬

    一.字体反爬 1.什么是字体反爬? 开发者创作了一种字体(字体代号):网页中显示的就是这种字体代号. 字体反爬也叫CSS反爬,就是因为这个字体是隐藏在我们css文件当中的一个.ttf文件. ​2.如何 ...

  8. Python爬虫编程12——字体反爬

    什么是字体反爬 就是网页的制作者,他在发布他网页数据的时候.将其中一部分的字体变成乱码.即使你把网页的数据爬取下来,你也获取不到真实数据的样貌.这样就达到了一个反爬虫的目的. 如何解决字体反爬 1.下 ...

  9. k-近邻算法 解决 动态字体反爬

    记录k-近邻算法 解决猫眼电影的字体反爬. 此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉. 文章有一些点没有说的很细.因为我相信能看到这篇文章的你,不通过我的 ...

最新文章

  1. DataX 安装和使用
  2. bdm导入mysql_vs 2010下使用水晶报表Crystal Reports
  3. tcp连接多久会自动断开_苹果M1 Mac用户报告蓝牙连接问题:外设经常会断开
  4. 使用Sublime Text作为Markdown编辑器
  5. 【C# interface接口】模拟MP3/AVI播放器
  6. kmeans算法_实战 | KMeans 聚类算法
  7. 严格模式与混杂模式如何区分_品牌商如何规划合伙人模式
  8. linux nfs限制连接数,linux – 对NFS有一个有效的稳定性参数吗?
  9. NoUniqueBeanDefinitionException: No qualifying bean of type ‘XXXX‘ available: expected single matchi
  10. 信息技术处理员和计算机二级,信息处理技术员(信息技术处理员含金量)
  11. 有限差分法MATLAB程序
  12. cass道路设计教程_cass道路设计
  13. 通过Makefile传参数到代码中
  14. 图扑案例合集丨用赛博朋克语言诠释数字孪生
  15. webpack安装使用教程
  16. Oracle之查看建表语句
  17. 今日,首款国产超小体积5G通信模组商用!
  18. 软件好,才是真的好:区块链的1976—2017
  19. Python处理大学英语四级考试数据(Excel文件)案例一则
  20. 1896-2021历届奥运会奖牌动态排序动画(Python数据采集)

热门文章

  1. openssl生成随机密码。
  2. 北京师范大学新闻与传播专硕考研一战上岸经验分享
  3. 发明计算机作文300字,四年级我的发明作文300字
  4. 毕业设计 自制移动机器人,三维零件设计(SolidWorks三维分享)
  5. 找工作,攒人品(4)
  6. 618将至,各产品营销活动通用文案合集分享,有需要的进
  7. RSA进阶之低加密指数攻击
  8. jQuery动画练习
  9. 从技术 Leader 的招聘需求看,如何转岗为当前紧缺的大数据相关人才?
  10. 服务器连接硬盘出错,IBM服务器硬盘常见问题与故障诊断