3 使用FontCreator查看字体文件

4 使用python的第三方库fontTools读取字体文件

5 观察xml文件里面的cmap映射关系以及FontCreator得出规律并替换源码

1 什么是字体反爬

网页开发者自己创造一种字体,因为在字体中每个文字都有其代号,那么以后在网页中不会直接显示这个文字的最终的效果,而是显示他的代号,因此即使获取到了网页中的文本内容,也只是获取到文字的代号,而不是文字本身。

简单的说,字体反爬指的就是浏览器页面上的字符和调试窗口或者源码中的内容,显示的不一样,这就是字体反爬。

2 如何找到 网页开发者创造 字体

1 )直接源码搜索 @font-face

(2)打开调试窗口,点击要获取的数据,查看css引用的字体,去源码搜索

(3)抓包获取获取字体文件请求的接口

3 使用FontCreator查看字体文件

4 使用python的第三方库fontTools读取字体文件

使用pip install fontTools安装fontTools库

from fontTools.ttLib import TTFont
# TTFont()用来打开woff文件的
font = TTFont('font.woff')
# 使用save()将拿到的文件数据保存为XML格式的文件
font.saveXML('font.xml')

观察xml文件里面的cmap映射关系以及FontCreator得出规律并替换源码

font = open('font.xml','r').read()
cmap = re.findall('<map code="(.*?)" name="(.*?)"/>', font)
result = {}
for item in cmap:
	if item[1] == 'x':
		continue
	result['&#'+item[0][1:]] = chr(eval('0x'+item[1][3:]))
# 目标url
url = 'https://www.shixiseng.com/interns?keyword=python&city=%E5%85%A8%E5%9B%BD&type=intern'
res = requests.get(url,headers=headers).text
# 替换响应回来的html源码
for item in result:
	res = res.replace(item,result[item])

6 实习僧案例完整代码

import requests
import re
from bs4 import BeautifulSoup
from fontTools.ttLib import TTFont
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0'
# 找到字体的文件或者url发起请求
url = 'https://www.shixiseng.com/interns/iconfonts/file?rand=0.3992527190781152'
font_res = requests.get(url, headers=headers)
with open('font.woff', 'wb') as fp:
    fp.write(font_res.content)
# TTFont()  用来打开woff文件的
font = TTFont('font.woff')
# 使用save()将拿到的文件数据保存为XML格式的文件
font.saveXML('font.xml')
# 使用FontCreator打开文件以及观察xml里面的cmap映射规则得出规律
font = open('font.xml', 'r').read()
cmap = re.findall('<map code="(.*?)" name="(.*?)"/>', font)
result = {}
for item in cmap:
    if item[1] == 'x':
        continue
    result['&#' + item[0][1:]] = chr(eval('0x' + item[1][3:]))
# 目标url
url = 'https://www.shixiseng.com/interns?keyword=python&city=%E5%85%A8%E5%9B%BD&type=intern'
res = requests.get(url, headers=headers).text
# 替换响应回来的html源码
for item in result:
    res = res.replace(item, result[item])
bs4 = BeautifulSoup(res, 'html.parser')
offers = bs4.select('.intern-wrap.interns-point.intern-item')
for offer in offers:
    title = offer.select('.f-l.intern-detail__job p a')[0].text
    company = offer.select('.f-r.intern-detail__company p a')[0].text
    job_money = offer.select('.f-l.intern-detail__job p .day.font')[0].text
    print(title, company, job_money)
突破入口,响应数据里面有个eval,所以直接hook eval hook eval步骤1:先根据堆栈回溯打上断点,然后刷新网页断在send断点这个位置,然后控制台输入hook_eval的js,然后取消send的断点,然后F8调试进入下一步 步骤2观察:此时已经hook住,断点停在了此位置,这里即给window的一个属性进行了 该案例将真实数据隐藏到字体文件中,使我们即使获取了页面源代码,也没法直接提取数据的真实值案例网站: https://antispider4.scrape.center/打开之后,看不出有什么特别的地方我们按照常规逻辑进行爬取 部分输出这里通过 Selenium 打开案例网站, 等待所有电影加载出来,然后获取源代码, 并通过 pyquery 提取和解析每一个电影信息,得到名称,类别和评分, 之后输出。我们发现输出结果中 score 字段并没有任何信息,经过观察发现评分对应的源代码不包含数字信息我们观察源代码发 2. 字体反爬 2.1 字体反爬简介 ​ 在 CSS3 之前,Web 开发者必须使用用户计算机上已有的字体。目前的技术开发者可以使用@font-face为网页指定字体,开发者可将心仪的字体文件放在 Web 服务器上,并在 CSS 样式中... 最后验证总的答案的时候,被打脸了!!! 又被默默设埋伏了,踩了一个坑,巨大的,为何悲伤辣么大 <(-︿-)> 不将html源码页面下载下来还真发现不了在哪写错了,不多说,赶紧来看一下呗~~ 0x01、分析目标网站 还是同样的手段,打开F12进行选中数字,查看它的标签内容是什么 大家好,我是辰哥今天准备爬取某某点评店铺信息时,遇到了『字体反爬。比如这样的:还有这样的:可以看到这些字体已经被加密(反爬)竟然遇到这种情况,那辰哥就带大家如何去解决这类反爬字体反爬类... 本文主要是通过哦爬取汽车之家论坛一些用户热门精华帖子,介绍利用前端页面自定义字体的方式来实现反爬的技术手段,来实践破解它。 自定义字体:@font-face是CSS3中的一个模块,主要是实现将自定义的Web字体嵌入到指定网页中去。 使用了其中一个网址来进行分析:https://club.autohome.com.cn/bbs/thread/d1751c7bd0539de0/79229668-... 字体字形坐标点与编码之间的对应关系不会随着多次请求而变化,例如:58同城房子出租 字体字形坐标点每次请求时,位置不固定,但是每个文字的打点数量一致,例如:猿人学第7题 字体的打点坐标点与打点数量随着每次请求都会发生变换,例如:58同城招聘 我们之所以认为1这个形状是数字一。是因为我们通过学习后才懂得,“哦!这个是 ‘1‘ 。” 所以,为了让电脑识别出文字,就可以依靠机器学习,啊,但是我不会。直接上手机器学习针对的是比较难识别的图像,例如:复杂的验证码。 你已经知道了对方是如何自定义字体加密的了你要想去反反爬你就要先站在对方的角度去思考问题有句话这么说来着“知己知彼,才能那啥”那么对于像猫眼电影、大众点评等等那样的 css 自定义字体加密应该怎么破呢?接下来就是学习 python 的正确姿势有人说了不就是把字体通过 unicode 编码吗?那就简单了啊把每个字的编码找到然后使用字典把编码和对应的字对应起来抓取分析的时候直接替换不就得了有道理是有道理...