qzuser 发表于 2022-8-3 10:27

申请会员ID:爱吃香菜123【申请通过】

1、申 请 I D:爱吃香菜123
2、个人邮箱:2914258815@qq.com
3、原创技术文章:网站字体加密原理,起点中文网小说网站破解字体加密
一,网站字体加密原理
当我们在爬取网站资源时,难免会遇到网站字体加密,js混淆,验证码,ip,cookies检测,base64图片加密等等,这些都是近些年来网站反爬的一些措施,但道高一尺,魔高一丈,既然网站有反爬,那我们就反反爬,逐个去破解这些反爬措施,今天说的就是反爬措施之一———字体加密。
要了解字体加密,肯定要先理解网站是怎么进行字体加密的,这就要用到html,css的知识,下面我用HBuilder X来演示这一过程。
      1,css字体隐藏
当在爬取网站时,不免会遇到一下情况,爬取到的数据div里面没有内容
https://s1.328888.xyz/2022/08/03/OI1UJ.png
https://s1.328888.xyz/2022/08/03/OIIOn.png
            当看到想要的数据网页上有而爬取的页面没有,就要考虑,异步加载和css隐藏了,这里用的是css隐藏,真实的数据在哪里呐,就在css文件里,所以html代码里面是看不到的,这样就实现了简单的加密。
https://s1.328888.xyz/2022/08/03/OIQQU.png
       2,网站特殊字体加密
这种方法就是利用网站自己的字体对重要的数据进行加密,使我们爬取到的数据显示为一堆乱码(如下图所示)
https://s1.328888.xyz/2022/08/03/OIrCR.png
               下面跟着我来一步一步了解字体加密的过程
            首先,在字体网站上随便下载一款字体ttf文件,由于这个ttf文件是对于所有字体都进行一个修改,但我们只想对数字加密,于是要用到Python里面的pyftsubset命令,将字体按数字进行替换(在Pycharm里Terminal里修改)(代码如下)
https://s1.328888.xyz/2022/08/03/OVl3w.png
                  将修改后的ttf文件转换成svg文件,以便后面使用(ttf在线转svg文件网站分享:https://convertio.co/zh/)
               再通过Fontello网站将svg文件编码成font文件,以供加密HTML页面重要数据(Fontello网站分享:https://fontello.com/)
将下载好的font文件放入html文件夹中。
https://s1.328888.xyz/2022/08/03/OVaoC.png
https://s1.328888.xyz/2022/08/03/OVkSd.png
https://s1.328888.xyz/2022/08/03/OV5lU.png
                以上就是我了解的两种字体加密方法,当然还有base64加密,动态混淆等等。了解了字体加密的原理,下面就是要怎么上手去破解它,了解原理就是为了破解的时候做到“知其然而知其所以然”,下面当然要找一个字体加密的网站来练手了,我选择的是起点中文网这个小说网站,去爬取网站里VIP小说月票榜,拿到数据并且打印,下面就跟着我的步骤来破解
二,起点中文网小说网站破解字体加密(爬取网站:https://www.qidian.com/rank/yuepiao/chn0/)
1,先用F12打开网站调试器,查看所要数据的情况
https://s1.328888.xyz/2022/08/03/OVAbF.png
          2,右键网站查看网站源代码,搜索字体所对应的ttf文件
https://s1.328888.xyz/2022/08/03/OVvrC.png
             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 = 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_num6:count])]
      count += 6
    l.append(s)

count
# 打印出榜单
for i in range(0, len(result_title)):
    print(i + 1, result_title, str(l) + "月票")

          当然这个网站只是比较简单的字体加密,只是为了练手,了解破解加密的流程,可以尝试更难得一些字体加密,(如大众点评网,汽车之家等等)

Hmily 发表于 2022-8-8 11:19

I D:爱吃香菜123
邮箱:2914258815@qq.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。

爱吃香菜123 发表于 2022-8-8 16:50

Hmily 发表于 2022-8-8 11:19
I D:爱吃香菜123
邮箱:



来报道了

wangguang 发表于 2022-8-26 10:43

爱吃香菜123 发表于 2022-8-8 16:50
来报道了

欢迎新人,吾爱有你更精彩。{:301_1003:}

toufaluanle 发表于 2022-11-6 16:51

欢迎新人

8392973 发表于 2022-11-9 06:12


欢迎新人

scorpio455 发表于 2022-11-17 15:01

欢迎欢迎
页: [1]
查看完整版本: 申请会员ID:爱吃香菜123【申请通过】