K近邻思想解决字体反爬

2023-11-11

猫眼电影字体反爬

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 TTFont

def 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+contour5
	return contours

def 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].coordinates
		contour_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 infos

if __name__=='__main__':
	get_font_infos()

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

import numpy as np
from . import font_data

def 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)]=array
	return 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,没有就为0
		count_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_list
	num=get_num(new_array,base_array,orders,5)
	return num

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

K近邻思想解决字体反爬 的相关文章

随机推荐

  • 利用javascript的算术运算符获取一个数字的每位数字

  • element tree 树形控件

    组件 Element 地址 http element eleme io zh CN component tree Tree树形控件
  • 【VAR模型

    向量自回归 VAR 是一种随机过程模型 用于捕获多个时间序列之间的线性相互依赖性 VAR 模型通过允许多个进化变量来概括单变量自回归模型 AR 模型 VAR 中的所有变量都以相同的方式进入模型 每个变量都有一个方程式 根据其自身的滞后值 其
  • IBM MQ 故障诊断(一)

    说明 本文主要是针对运维人员的手册 前面部分主要是应用三板斧的方式 后面的步骤可能会发散和具体深入一些 不过也不是严格的划分 读者就当看一遍杂文的方式来看待此文吧 一 队列管理器的启停 QMGR的启停是故障诊断中遇到最多的需求之一 启动队列
  • 【C语言】可变参数列表

    文章目录 前言 一 可变参数列表是什么 二 怎么用可变参数列表 三 对于宏的深度剖析 隐式类型转换 对两个函数的重新认知 总结 前言 可变参数列表 使用起来像是数组 学习过函数栈帧的话可以发现实际上他也就是在栈区定义的一块空间当中连续访问
  • 无服务器编程语言,腾讯云之无服务器云函数运行golang程序-Go语言中文社区

    使用腾讯的 无服务器云函数启动了一个服务 用golang代码生成以太坊的私钥跟地址 genEthAddr png 无服务器云函数是什么 腾讯云的无服务器云函数 跟 aws lambda类似 把一段代码放到云函数服务器上 设定好访问路径 就可
  • 高等代数 多项式环(第7章)5* 结式与域

    一 结式 1 概念 2 结式与公共复根 1 多项式存在公共复根的判定 定理1 设 f x a
  • 数据结构——>单向环形链表

    单向环形链表 一 单向环形链表应用场景 二 单向环形链表介绍 三 单向环形链表代码实现 1 代码实现思路 2 代码实现 一 单向环形链表应用场景 提起单向环形链表 就不得不说约瑟夫问题 约瑟夫环 什么事约瑟夫问题呢 1 约瑟夫问题 有时也称
  • 机器学习:EM算法

    一 初识EM算法 EM算法也称期望最大化 Expectation Maximum 简称EM 算法 它是一个基础算法 是很多机器学习领域算法的基础 比如隐式马尔科夫算法 HMM 等等 EM算法是一种迭代优化策略 由于它的计算方法中每一次迭代都
  • FreeRTOS基础五:软件定时器

    软件定时器简介 软件定时器的作用 在指定的时间到来时执行指定的函数 或者以某个频率周期性地执行某个函数 被执行的函数叫做软件定时器回调函数 软件定时器由FreeRTOS内核实现 不需要硬件支持 软件定时器只有在软件定时器回调函数被调用时才需
  • 用EditPlus来编辑网页代码 写网页代码 网页软件安装包大小1.91MB JQ代码编辑软件

    如何使用EditPlus这款软件来编辑网页代码 第一步 我们先来安装这款软件 我就先分享一下这款软件 链接 https pan baidu com s 1YtMJboQ0abPTybIZMZu8Bg 提取码 jes4 第二步 等安装好这款软
  • Python GUI 设计(三)---Widget组件详解

    1 1 Canvas画布组件 Tkinter模块中的Canvas组件主要用于绘制图形 文字 设计动画等甚至也可以将其他小部件放在画布上 比如视频 它的语法格式如下 Canvas 父窗口 options 第一个参数是父窗口 表示这个画布建立在
  • STM32的RTC时钟及其相关寄存器

    1 什么是RTC时钟 RTC时钟本质上上一个定时器系统 但是其定时器的计数值最终是以2020 1 30 16 27 类似这样的形式呈现的 说白了就是它就是实时时钟 并且这个时钟不怕断电 断电后它在后备区继续计时 而后备区是有电池供电的 2
  • vscode使用remote-ssh连接远程服务器 报错:“过程试图写入的管道不存在”

    问题如题 网络上有很多解决 过程试图写入的管道不存在 的方法 笔者基本试过了一遍 也没能解决问题 这里不是指他们的方法没有用 只是能解决的问题可能不是我遇到的这种 我的解决方法是 修改配置文件的格式 就这么简单 这种格式才是正确的 从第二行
  • sqli-labs/Less-31

    欢迎界面和上一关差不多 所以我们还是使用双参数注入 首先判断第二个参数是否为数字型 输入如下 id 1 id 1 and 1 2 回显如下 所以属于字符型 然后判断是单引还是双引 输入如下 id 1 id 1 回显如下 正确回显了 所以不属
  • ^A在linux的处理

    这是hive的默认分隔符 用脚本awk或python可以把分隔符设置为 x01 在vim中选中时 用ctrl a来表示这个分隔符
  • 工业互联网+5G 发展策略研究

    本文首发于 邮电设计技术 边缘计算社区经过授权转发 摘要 工业互联网发展水平与一个国家的国际竞争力强相关 截至2020 年我国工业互联网发展初见成效 但商业模式还需要持续探索 首先探索工业互联网定义及发展情况 其次理清工业互联网与5G 关系
  • C++ DLUT 上机作业(四)

    文章目录 C DLUT上机作业 四 1 intArray 2 Goods 3 Cpoint 4 Account C DLUT上机作业 四 啥都不说 直接来 1 intArray 设计整型数组类intArray 实现若干数据的相关操作 包括构
  • React-实现循环轮播

    问题 写字体轮播的时候 不使用swiper库 使用top定位 让字体过渡上下移动 发现写成的效果就是每次播到最后一个元素后 只能突然展示第一个元素 失去了那种上下移的动过渡效果 ss 解决 import useRef useEffect u
  • K近邻思想解决字体反爬

    猫眼电影字体反爬 1 解决思路 1 1 获取对照组字体文件 按照不同字形字体的unicode得到文字与其坐标的对应关系形成可遍历的数据结构 然后处理成可计算的数组或者直接遍历出所有的坐标数据 1 2 再提取当前访问页面的自定义字体文件 取出