保姆级教学,起点中文网字体反爬。

我们发现86.81被乱码取代了。虽然不知道为什么会显示乱码,但是说明这个内容是有价值的,我们尝试破解,并将86.81等等数字正常显示在控制台上。

打开网页的源代码,找到86.81的源代码,我们发现“万字”前面有5串的数字,而86.81刚好时5个字符,我们猜测86.81被这5串数字取代了,说明源码可能是这些数字。

那么思路就清晰了,我们只需要将这些源码破解了,并将破解的源码替换未破解的源码,那么就可能实现目的。

我们刷新一下网页。突然发现那5串数字改变了,说明字体会刷新:

我们发现这个数字指向一个class,,一个类。它的名称为hcMFhsGt。在右边的样式栏中,我们看到有个font-family,这个是他的字体。

我们能看到定义的字体文件:

分析获得信息:

加密内容:𘛩𘛯𘛮𘛩𘛫

字体文件名称:class=“piQOMNSL”

字体文件:piQOMN.woff

要求映射为正常内容:86.81

首先把解密前网页下载下来,并保存:

下载完成后左边项目栏还会增加一个html文件,这个就是解密前的网页源代码。

为了防止文件破损,用代码将woff字体文件下载:

打开下载的字体文件:

发现更加详细的信息无法获取。

使用fontTools工具查看:

查看下载的font文件:

我们发现id跟name完全对不上,那么我们暂时忽略id。我们再观察name发现,name后面对应的跟我们用网站解析出来的字体一一对应。

不过信息依旧不足,我们继续查看:

我们看到cmap的区域有了我们想要的信息。Name没有发生改变,但是前面id变成了code。

观察发现code为0x开头说明是16进制的数。此时前面一片开阔。

我们将这些16进制的数转换为10进制查看一下:

"0x186e6" =100070

"0x186e8"=100072

"0x186e9"=100073

"0x186ea" =100074

然后:

100070对应name“nine”

100072对应mame“zero”

我们发现转义到10进制后的数字非常眼熟,查看一下未解密的网页源代码,这不就是86.81加密的内容吗!

加密内容:𘛩𘛯𘛮𘛩𘛫

那么验证一下:

Name=“eight”="0x186e9"=100073

Name=“six”=“0x186ef”=100079

Name=“period”=“0x186ee”=100078

说明这就是86.81加密方式,那么接下来只需要将16进制的数转化并替换即可。

将解析到的字体,从字典中从英文替换为数字:

将网页中的加密内容替换为破解的数字

 

然后我们发现解密后的网页源代码中加密的内容已经解密了:

我们再看看网页中的:

发现已经解密完成了。

那么就可以爬取想要的信息了。

import re
import requests
from fontTools.ttLib import TTFont

#先把网页下载下来
response = requests.get('https://book.qidian.com/info/1001535146/')
html = response.text
#'w'只写,不存在则创建
with open('解密前.html',mode='w',encoding='utf-8') as f:
    f.write(html)

#代码下载字体文件
with open('解密前.html',mode='r',encoding='utf-8') as f:
    html = f.read()

#正则匹配需要下载的字体文件下载地址
font_url=re.findall("\('eot'\); src: url\('(.*?)'\) format\('woff'\)",html)[0]#目的是获取字体文件链接
print(font_url)

#下载
font_response = requests.get(font_url)
font_path = font_url.split('/')[-1]#用split将/之间分隔开,取最后一个元素将字体文件链接中的’piQOMNSL.woff‘提取出来给font_path命名
with open(font_path,mode='wb') as f:#二进制
    f.write(font_response.content)

#用fonttools查看字体源码
# font_path = 'piQOMNSL.woff'
fi = TTFont(font_path)#打开当前目录的font_path文件,也就是”piQOMNSL.woff“
fi.saveXML('font.xml')#另存为font.xml

#解析到字体,并将英文替换为数字
font_map = fi['cmap'].getBestCmap()

d = {
    'one':'1','two':'2','three':'3','four':'4','five':'5','six':'6','seven':'7',
    'eight':'8','nine':'9','zero':'0','period':'.'
    }

print('font_map',font_map)
print('d',d)

#将字典的值从英文转换为数字
for key in font_map.keys():
    # key:100070
    # font_map[key]:  'key'
    # d[font_map[key]]:  '5'
    font_map[key]=d[font_map[key]]
print(font_map)

#font_map字典,将网页中的加密内容替换为破解的数字
for key,value in font_map.items():
    print(key,value)
    html = html.replace('&#'+ str(key)+';',str(value))

with open('解密后.html',mode='w',encoding='utf_8') as f:
    f.write(html)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值