python爬虫字体反爬--FontMap

今天无聊,来写个爬虫,正好用昨天写的字体映射库试一下

爬取网站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)

在这里插入图片描述
运行之后发现,我们想要的结果就出来了

最后,如果FontMap这个库有啥问题请告诉我,我没有经过很多测试,可能偶尔会报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值