问题:怎么将源代码中的加密字体正常显示?
当爬取数据时,经常会发现一些既不是想要的对应文字,也不是乱码。那么该网站是进行了字体加密的反爬虫。如何解决这一问题呢?
那么就会用到了我们的TTFont模块:
from fontTools.ttLib import TTFont
那么我们来看一下解决的流程,以实习僧网为例:
实习僧:https://www.shixiseng.com
1、获取网页源代码
url = "https://www.shixiseng.com/interns?keyword=python&city=%E5%85%A8%E5%9B%BD&type=intern"
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.52"}
resp = requests.get(url,headers=headers)
print(resp.text)
找到加密的字体,如:
2、在网页中找到加密字体格式
通常在网页的(网络-字体-url)中,可直接转码下载。
下载后点击打开即可,这里会用到一个浏览文件的辅助性软件(High-Logic FontCreator),下载打开查看。
然后将文件放到pycharm中。
3、添加解密字体
找到相应文件(file),将数据进行手动整理至glyfmap字典中以用于读取。(数据不多手动整理即可,若编程能力底子厚可写一个程序自动提取内容,不过这个过程太麻烦0.0)。
font = TTFont("file")
glyf = font["glyf"]
glyfmap={
0: glyf['uni30'],
1: glyf['uni31'],
2: glyf['uni32'],
3: glyf['uni33'],
4: glyf['uni34'],
5: glyf['uni35'],
6: glyf['uni36'],
7: glyf['uni37'],
8: glyf['uni38'],
9: glyf['uni39'],
'p': glyf['uni70'],
'y': glyf['uni79'],
't': glyf['uni74'],
'h': glyf['uni68'],
'o': glyf['uni6f'],
'n': glyf['uni6e'],
'工': glyf['uni5DE5'],
'程': glyf['uni7A0B'],
'师': glyf['uni5E08'],
}
4、寻找对应关系
在这里观察到&#由0代替,运用.replace代替即可。
resp = requests.get(url,headers=headers)
response = resp.text.replace("&#",str(0))
- 读取解密字体
cont = font.getBestCmap()
- 遍历键和值,将键转化为十六进制。
- 将cont中的值转化为glyfmap中的值(赋值)。
name = glyf[name]
遍历glyfmap字典中的值,若其值与cont中的值相同,将源代码中的加密字体转换成解密后的字体。
for data,name in cont.items():
hex_data = hex(data)
print(hex_data)
name = glyf[name]
for data_new,name_new in glyfmap.items():
if name_new == name:
response = re.sub(hex_data,str(data_new),response)
- 打印后就可以看到解密好的字体了。
5、完整代码展示
import requests
from fontTools.ttLib import TTFont
import re
url = "https://www.shixiseng.com/interns?keyword=python&city=%E5%85%A8%E5%9B%BD&type=intern"
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.52"}
# resp = requests.get(url,headers=headers)
# print(resp.text)
font = TTFont("file1")
glyf = font["glyf"]
glyfmap={
0: glyf['uni30'],
1: glyf['uni31'],
2: glyf['uni32'],
3: glyf['uni33'],
4: glyf['uni34'],
5: glyf['uni35'],
6: glyf['uni36'],
7: glyf['uni37'],
8: glyf['uni38'],
9: glyf['uni39'],
'p': glyf['uni70'],
'y': glyf['uni79'],
't': glyf['uni74'],
'h': glyf['uni68'],
'o': glyf['uni6f'],
'n': glyf['uni6e'],
'工': glyf['uni5DE5'],
'程': glyf['uni7A0B'],
'师': glyf['uni5E08'],
}
# 寻找对应关系
resp = requests.get(url,headers=headers)
response = resp.text.replace("&#",str(0))
# 读取解密字体
cont = font.getBestCmap()
for data,name in cont.items():
hex_data = hex(data)
print(hex_data)
name = glyf[name]
for data_new,name_new in glyfmap.items():
if name_new == name:
response = re.sub(hex_data,str(data_new),response)
print(response)
原文地址:http://www.cnblogs.com/LoLong/p/16916744.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性