|
吾爱游客
发表于 2022-8-3 10:27
1、申 请 I D:爱吃香菜123
2、个人邮箱:2914258815@qq.com
3、原创技术文章:网站字体加密原理,起点中文网小说网站破解字体加密
一,网站字体加密原理
当我们在爬取网站资源时,难免会遇到网站字体加密,js混淆,验证码,ip,cookies检测,base64图片加密等等,这些都是近些年来网站反爬的一些措施,但道高一尺,魔高一丈,既然网站有反爬,那我们就反反爬,逐个去破解这些反爬措施,今天说的就是反爬措施之一———字体加密。
要了解字体加密,肯定要先理解网站是怎么进行字体加密的,这就要用到html,css的知识,下面我用HBuilder X来演示这一过程。
1,css字体隐藏
当在爬取网站时,不免会遇到一下情况,爬取到的数据div里面没有内容
当看到想要的数据网页上有而爬取的页面没有,就要考虑,异步加载和css隐藏了,这里用的是css隐藏,真实的数据在哪里呐,就在css文件里,所以html代码里面是看不到的,这样就实现了简单的加密。
2,网站特殊字体加密
这种方法就是利用网站自己的字体对重要的数据进行加密,使我们爬取到的数据显示为一堆乱码(如下图所示)
下面跟着我来一步一步了解字体加密的过程
首先,在字体网站上随便下载一款字体ttf文件,由于这个ttf文件是对于所有字体都进行一个修改,但我们只想对数字加密,于是要用到Python里面的pyftsubset命令,将字体按数字进行替换(在Pycharm里Terminal里修改)(代码如下)
将修改后的ttf文件转换成svg文件,以便后面使用(ttf在线转svg文件网站分享:https://convertio.co/zh/)
再通过Fontello网站将svg文件编码成font文件,以供加密HTML页面重要数据(Fontello网站分享:https://fontello.com/)
将下载好的font文件放入html文件夹中。
以上就是我了解的两种字体加密方法,当然还有base64加密,动态混淆等等。了解了字体加密的原理,下面就是要怎么上手去破解它,了解原理就是为了破解的时候做到“知其然而知其所以然”,下面当然要找一个字体加密的网站来练手了,我选择的是起点中文网这个小说网站,去爬取网站里VIP小说月票榜,拿到数据并且打印,下面就跟着我的步骤来破解
二,起点中文网小说网站破解字体加密(爬取网站:https://www.qidian.com/rank/yuepiao/chn0/)
1,先用F12打开网站调试器,查看所要数据的情况
2,右键网站查看网站源代码,搜索字体所对应的ttf文件
3,刷新网站,可以发现ttf文件一直在变,所以就需要爬取时,还要取到这个ttf文件的地址
4,既然有了ttf文件,就可以把数字与加密编码做个一一对应,然后就可以正常获取数据了
接下来就是代码实现过程:
import requests
import re
from fontTools.ttLib import TTFont
from lxml import etree
# headers 伪装浏览器访问
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 "
"Safari/537.36",
}
response = requests.get("https://www.qidian.com/rank/yuepiao/chn0/", headers=headers)
# 设置正则表达式匹配条件
pattern = re.compile("format\('eot'\); src: url\('(.*?)'\) format\('woff'\)")
fontUrlList = re.findall(pattern, response.text)
# 得到字体文件的链接
fontUrl = fontUrlList[0]
fontResponse = requests.get(fontUrl, headers=headers)
# 将字体文件保存到电脑上
with open('fontWoff.woff', 'wb') as file:
file.write(fontResponse.content)
fontWoff = TTFont("fontWoff.woff")
# 将字体文件保存为xml文件
fontWoff.saveXML('fontXml.xml')
# 获取编码的字体映射表
fontDict = fontWoff.getBestCmap()
numDict = {"zero": "0", "one": "1", "two": "2", "three": "3", "four": "4", "five": "5", "six": "6", "seven": "7",
"eight": "8", "nine": "9"}
combinDict = {}
# 两次遍历使两个字典合并为一个
for k2, v2 in fontDict.items():
for k1, v1 in numDict.items():
if v2 == k1:
combinDict[k2] = v1
html = re.sub(r"&#(\w+?);", r"\1", response.text)
html = etree.HTML(html)
# xpath获取榜单名
result_title = html.xpath('//h2/a/text()')
# xpath获取榜单票数
result_num = html.xpath('//div[@class="total"]//span/text()')
l = []
for i in range(0, len(result_num)):
count = 6
s = ""
while count <= len(result_num):
s += combinDict[int(result_num[count - 6:count])]
count += 6
l.append(s)
count
# 打印出榜单
for i in range(0, len(result_title)):
print(i + 1, result_title, str(l) + "月票")
当然这个网站只是比较简单的字体加密,只是为了练手,了解破解加密的流程,可以尝试更难得一些字体加密,(如大众点评网,汽车之家等等) |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|