反爬篇 | 手把手教你处理 JS 逆向之字体反爬

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

本篇文章将聊聊另一种更加常见的反爬方案「 字体反爬 」

它的实现原理为通过自定义的字体替换网页元素中的部分内容来实现的反爬策略

常见的字体格式包含:ttf、eot、woff,我们一般在网页中通过关键字「 @font-face 」定义字体样式,然后再设置到元素控件样式中去

//定义字体样式
@font-face{
 font-family:"字体文件的名字,比如:gzfont";
 src:url('字体文件的链接');
}

// 给某个元素控件设置字体样式
.gzfont {
    font-family: gzfont;
}

目前有很多主流网站引入了字体反爬,比如:某 8 同城、某车之家等

今天研究的目标对象是:

aHR0cHM6Ly93d3cuZ3VhemkuY29tL2J1eQ==

1、分析一下

打开目标页面及浏览器的开发者工具栏,我们发现汽车价格、首付金额、公里数中的部分内容在源码中显示为乱码,但在界面中展示正常

元素的字体样式名称为「 gzfont 」

我们在网页源码中通过关键字「 gzfont 」尝试查找字体的实际 URL 地址

但是源码中并未出现字体定义的逻辑,因此我们可以推测字体实际加载地址是通过 Ajax 加载的

我们在「 Sources 」面板下,通过上面的关键字全局搜索该关键字出现的所有代码块进行逐一分析

通过新增一个断点,找到 gzfont 字段生成的逻辑及字体 URL 地址

在浏览器的新窗口中,通过字体 URL 下载字体文件,然后在 PC 上使用软件 FontCreator 打开查看

下载地址:

https://www.pcsoft.com.cn/soft/21156.html

我们发现字体映射关系很简单,数目也很少,并且映射关系是固定的

PS:每次重新加载页面,字体 URL 地址、映射关系都是固定的

所以,我们可以通过一个字典定义它们的映射关系

# 字体映射关系
# PS:由于字体数目很少,所以可以直接写死字体的映射关系
font_relation_map = {
    'uniE9CE': 0,
    'uniE41D': 1,
    'uniE630': 2,
    'uniEAF2': 3,
    'uniE325': 4,
    'uniE891': 5,
    'uniEC4C': 6,
    'uniE1D0': 7,
    'uniE76E': 8,
    'uniE52E': 9
}

最后,我们分析发现页面数据都是通过下面的网络请求获取的

我们只需要将里面的乱码数据根据字体映射关系替换为正常的数据即可

2、具体实现

下面,我们聊聊爬取网页内容的步骤

首先,我们需要安装字体解析的依赖库 fonttools

# 安装依赖
pip3 install fonttools

然后,解析字体文件,根据上面响应数据中的数据格式,重新组成一个新的字典数据

def get_font_map():
    """
    获取字体映射关系
    :return:
    """
    font = TTFont(r'gzfont.woff2')

    # 字体文件转为xml文件
    # font.saveXML(r"font.xml")

    font_map = font.getBestCmap()
    font.close()

    # print(font_map)

    new_font_map = {}

    # 遍历字典,重新组成一个新的映射字典
    for index, key in enumerate(font_map):
        value = font_map[key]

        # 捕获异常
        try:
            temp = font_relation_map[value]
        except:
            temp = ''
        if temp != '':
            # 根据响应结果中字体反爬数据格式,将键值前面添加字符串&#,用于匹配
            new_font_map['&#' + str(key) + ";"] = temp

    return new_font_map

接着,模拟上面的网络请求获取响应数据;遍历上面的字典键值对,判断键 key 是否包含在响应结果中

如果包含,就将响应结果中的键 key 全部替换该键对应的值 value

import json
import time
import requests

def get_car_list(pagenum: int, new_font_map: dict):
    """
    获取车列表数据
    :param new_font_map:
    :return:
    """
    url = f"https://mapi.**.com/car-source/carList/pcList?osv=IOS&minor=&sourceType=&ec_buy_car_list_ab=**"

    payload = {}
    headers = {
        'authority': 'mapi.**.com',
        'accept': 'application/json, text/plain, */*',
        'origin': 'https://www.**.com',
        'platform': '5',
        'referer': 'https://www.**.com/',
        'token': '',
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36'
    }

    resp_str = requests.request("GET", url, headers=headers, data=payload).text

    # 全局替换
    for key, value in new_font_map.items():
        if key in resp_str:
            resp_str = resp_str.replace(key, str(value))

最后就可以进行数据提取了

...
# 数据解析
    resp = json.loads(resp_str)
    postList = resp.get("data").get("postList")

    for item in postList:
        title = item.get("title")
        road_haul = item.get("road_haul")  # 公里
        license_date = item.get("license_date")  # 购买时间
        price = item.get("price")  # 价格
        first_pay = item.get("first_pay")  # 首付

        print(f'车型:{title},公里数:{road_haul},购买时间:{license_date},价格:{price},首付:{first_pay}')
...

运行爬虫,我们发现爬取到的数据不存在乱码,都正常显示了

3、总结一下

在日常工作中,应对字体反爬的常规步骤如下:

  • 检查网页控件的字体名称

  • 通过网页源码、Network 面板(Font)、Source 面板(关键字搜索)及调试的方式获取字体地址

  • 在 PC 端通过软件查看字体的映射关系

  • 通过页面刷新、下载查看字体,判断字体文件是否动态生成

  • 使用依赖库 fonttools 解析字体,根据元素内容生成新的键值对

  • 对响应结果根据键值对进行内容替换

以上就是本次分享的所有内容,如果你觉得文章还不错,欢迎关注公众号:Python编程学习圈,每日干货分享,发送“J”还可领取大量学习资料。或是前往编程学习网,了解更多编程技术知识。

虫学习笔记(二十)—— 字体 文章目录一、什么是字体二、编码原理2.1、ASCII编码对照表2.2、Unicode编号2.3、UTF-8编码方式2.4、字符矢量图三、案例:58同城字体3.1、代码实现 一、什么是字体 网页开发者自己创造一种字体,因为在字体中每个文字都有其代号,那么以后在网页中不会直接显示这个文字的最终的效果,而是显示他的代号,因此即使获取到了网页中的文本内容,也只是获取到文字的代号,而不是文字本身。 简单的说,字体指的就是浏览器页面上的字符和调试窗口或者源码中的内容,显示的不一样,这就是字体 阅读详情

相关推荐

虫技术-字体

文本混淆章节 1. 文本混淆简介 简单而言就是利用前端技术干扰,页面可以正常展示,而使用虫下载后无法提取正常的数据。 1.1 常见的干扰方式 字体 2. 字体 2.1 字体简介 ​ 在 CSS3 之前,Web 开发者必须使用用户计算机上已有的字体。目前的技术开发者可以使用@font-face为网页指定字体,开发者可将心仪的字体文件放在 Web 服务器上,并在 CSS 样式中...

shifengboy的博客 2181

js逆向】Python虫如何突破字体,拿到想要数据

JavaScript逆向工程中,字体(Font Anti-Scraping)是一种常见的虫技术,它通过自定义字体来显示网页中的文字,使得这些文字在标准字体库中无法直接识别,从而增加虫获取文本内容的难度。本文将会你破解字体的方法

景天科技苑 2万+

虫:碰见字体如何处理

目录 THE BEGIN 一 什么是字体? 二 如何解密 1. 人工解密 2.工具解密 三 建立映射关系 四 解密 THE BEGIN 网页数据取可以简单分为三步:抓取页面,分析页面,存储数据。其中第一二步最为头疼,因为每个站点各有特色,你要不断检查网页结构寻找其规律,更不用说现在各种各样的虫手段了。 一般来说,大多数网站会从三方面虫:用户请求,如...

数据自留地的博客 5830

js逆向案例-css字体

目录一、点二、分析1、js逆向解密响应参数2、css字体伪元素分析 一、点 响应参数js加密, css字体伪元素隐藏 二、分析 1、js逆向解密响应参数 突破入口,响应数据里面有个eval,所以直接hook eval hook eval步骤1:先根据堆栈回溯打上断点,然后刷新网页断在send断点这个位置,然后控制台输入hook_eval的js,然后取消send的断点,然后F8调试进入下一步 步骤2观察:此时已经hook住,断点停在了此位置,这里即给window的一个属性进行了

十一姐的博客 3199

虫-------字体

虫-------字体

Dexter的博客 2932

16.网络虫—字体(实战演示)

一·字体原理 🧾 🧾 Python字体原理是指虫在取网站数据时,遇到了基于字体的防护措施。这种措施是通过将网站的文字转换成特定的字体文件,然后在页面上引用该字体文件来显示文字,使得虫无法直接获取文字内容。 🧾 具体原理如下: 网站将需要显示的文字转换成特定的字体文件,通常是TrueType或OpenType格式的字体文件。 网站在页面上引用该字体文件,并使用CSS样式将需要显示的文字的字体设置为该字体文件。 虫在获取页面源代码时,无法直接获取到需要显示的文字内容,只能获

weixin_50804299的博客 8652

| 手把手处理 JS 逆向字体(下)

大家好,我是安果!上一文章我们使用 Scrapy + Selenium 取了某个电影网站即将上映的影片休闲时光:最近上映的电影与虫世界,带您彻底放松!但是该网站针对一些比较敏感的数据(比如:票房、热度、评分等)做了字体文章将以「 影片热度」为例,讲解字体的完整处理方案1、安装依赖#依赖 #OCR pip3installddddocr #字体管理 pip3insta...

AirPython的博客 1492

【python】猫眼电影字体实战案例分析,手把手会你如何破解网站的字体(附源码)

网页字体破解方法主要涉及识别并解析网页中使用的自定义字体文件,以恢复文本信息的原始形态。本文详细讲述具体的破解步骤和方法

景天科技苑 2万+

虫笔记41之系列四:字体JS

1

微信公众号进阶的阿牛哥的博客 1339

手把手JS逆向搞定字体并获取某招聘网站信息

下次点击上方“Python虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤Python让我们相遇。大家好,我是霖hero。之前给大家分享过手把手...

pdcfighting的博客 1156

虫技术之食物链顶端——逆向

一、虫引言 距离最近一次博客的更新,已经快半年了。这么久一直没写博客,是因为最近半年在跟几个小伙伴打造一个tiktok的数据平台,乐不思蜀。今天抽空特意记录分享一下我认为的虫技术的顶端——逆向。这里的逆向主要是指app逆向,这里的app逆向又主要是指安卓的。至于原因,咱们待会聊。 再次回归到虫技术,一方面是因为,在这信息爆炸的时代,信息的抽取、分析和总结是一项非常重要的技能。另一方面,虽然之前一直热衷于dnn和算法领域的探索,后来才意识到,神经网络和算法的落地,一定...

weixin_42078618的博客 7990

JS逆向】某猫商城字体分析

某猫商城字体分析,适合处理一般的字体

weixin_71462234的博客 1899

JS逆向】某茄小说逆向分析

某茄小说逆向分析,打开字体的大门。

weixin_71462234的博客 1463

| 手把手处理 JS 逆向之 SVG 映射

大家好,我是安果!前面三文章分别从图片伪装、字体、CSS 偏移这 3 个方面,讲解了应对这类网站时的解决方案 | 手把手处理 JS 逆向之图片伪装 | 手把手处理 JS 逆向字体 | 手把手处理 JS 逆向之 CSS 偏移本文章聊聊另外一种常见的方案,即:「 SVG 映射 」SVG 全称为Scalable Vector...

AirPython的博客 481

| 手把手处理 JS 逆向之 CSS 偏移

大家好,我是安果!前面 2 文章分别讲解了应对图片伪装、字体网站的常规解决方案 | 手把手处理 JS 逆向之图片伪装 | 手把手处理 JS 逆向字体文章将聊聊另外一种常见的方案,即:「 CSS 偏移 」CSS 偏移是利用「CSS 样式 」对网页元素进行一次自定义的排序,最后让网页以正确的数据展示出来下面我们通过一个简单的实例,...

AirPython的博客 501

从算法逆向到环境博弈:chameleonJS破解全复盘

技术正从传统签名加密向环境博弈演进,前端JavaScript逆向的核心不再是还原某个加密算法,而是补全浏览器环境指纹。这类方案通过读取navigator、canvas、WebGL、时区等特征生成动态cookie,导致本地模拟器难以稳定复现。以chameleonJS为例,复盘从抓包定位到Node.js补环境的完整过程,梳理环境检测、调试、动态参数等关键环节,并总结最小验证闭环与稳定复用策略,为前端安全和逆向提供工程实践参考。

weixin_29008055的博客 530

斗鱼关注人数取 ── 字体的攻与防

之前因为业务原因需要取一批斗鱼主播的相关数据,在这过程中我发现斗鱼使用了一种很有意思的技术,字体。 打开任何一个斗鱼主播的直播间,例如 这个主播,他的关注人数数据显示在右上角: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T2blrSR7-1629684857631)(/image/Fp11DQiiqvE_vQddpXH1tgazywrA.png)] 斗鱼在关注数据这里使用了字体。什么是字体?也就是通过自定义字体来自定义字符与渲染图形的映射。比如,字符 1

cj_1128的博客 793

字体之实习seng

本文讲解字体的实战案例,需要具备一定的虫基础,欢迎各位小伙伴的订阅!!!

qq_65898266的博客 1410
上一篇: 最全总结 | 聊聊 Python 命令行参数化的几种方式
下一篇: 关于 pip 的 15 个使用小技巧
程序员小六
博客等级 码龄5年 111粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值