今天无聊,来写个爬虫,正好用昨天写的字体映射库试一下
爬取网站https://fanqienovel.com/rank/1_2_124
通过打开开发者工具观察:文字使用了字体加密
知道了是字体加密,那当然就是找字体文件,通过抓包,可以发现字体文件:
然后下载保存
接下来要安装一个库
pip install FontMap
这个工具库用于生成字体字形映射关系
#导包
import FontMap
#savepath为生成的字形图片保存地址
#fontpath为下载的字形文件
fontmap = FontMap.HuiFontMap(savepath=r"C:\Users\21761\Desktop\新建文件夹",fontpath=r"C:\Users\21761\Desktop\dc027189e0ba4cd.woff2")
执行会生成字体字形图片,并按照savepath路径保存:图片名是字形id,
生成后得到如下:
我们可以打开工具查看生成是否与字体文件一致:
这里随便抽了一个,然后内容对上了
接下来就是使用FontMap库的ocr识别方法,来生成字体映射
#这里添加使用了一个新参数:issaveimg设置为false,意思是不开启保存图片,
#因为这个网站字体文件不会每次都刷新,加上是我手动下载的保存一次就够了,
#默认会每次执行都会保存
fontmap = FontMap.HuiFontMap(savepath=r"C:\Users\21761\Desktop\新建文件夹",fontpath=r"C:\Users\21761\Desktop\dc027189e0ba4cd.woff2",issaveimg=False)
#这个方法会返回一个识别结果
#jsonpath设置结果保存,默认是不保存的
#fontmap.ocrFontImg(jsonpath='生成结果的保存地址')
ocrContent = fontmap.ocrFontImg(jsonpath='fontmap.json')
print(ocrContent)
打印结果
有了这个就可以来替换请求页面原文本了
#导包
import httpx
from lxml import etree
import json
#请求链接
url = 'https://fanqienovel.com/rank/1_2_124'
res = httpx.get(url).text
html = etree.HTML(res)
#获取标题
title = html.xpath('//*[@href="/page/7112656623956397088"]//text()')[0]
#读取之前ocr保存的结果
with open('fontmap.json','r',encoding='utf-8')as f:
fontmap = json.load(fp=f)
print(title)
打印了一下获取的标题,可见字体加密文本不可见
接下来就是循环标题,获取每一个文本,去匹配ocr识别的结果,然后拼接
t = ''
a = []
for i in title:
n = 'gid'+str(ord(i))
try:
t+=fontmap[n]
a.append(f'{n}:{fontmap[n]}')
except:#如果报错就说明不是加密文本
t+=i
print(t)
print(a)
运行之后发现,我们想要的结果就出来了