字体反爬,一种来自字体设计师的跨行反爬案例 | 案例 28

news2024/11/13 19:57:40

本篇博客涉及的内容非常有价值,尤其是在反爬领域。
核心内容为自定义字体文件反爬。

文章目录

    • 准备工作
    • 在 Web 页面中使用字体文件
      • 整理文字编码
    • Flask 中随机一串数字,渲染到前台
    • 总结

准备工作

在正式编写代码前,需要先安装 FontCreator ,它是一个字体编辑器,支持多种字体格式,可以用于创建、编辑和转换字体文件。

字体反爬,一种来自字体设计师的跨行反爬案例 | 案例 28

关于工具的使用,可以查看 《爬虫 120》 专栏中字体反爬的相关文章。

除此之外,还需要准备一个字体文件,用于设置反爬内容。

字体文件包含 0-9 这几个数字,点击进行下载。

由于我们不是专业的字体设计师,所以这里直接采用已有的字体文件即可。

在 Web 页面中使用字体文件

拿到字体文件后,就可以在网页中使用自定义字体了。

还有一点需要注意,字体与编码要一一对应,稍后代码中会有体现。

将字体文件存放在项目的静态文件目录中,例如 static/font

在项目的 CSS 文件中使用 @font-face 来引用字体文件。

@font-face {
  font-family: "ca-font";
  src: url('{{url_for("static",filename="font/ca_font.woff")}}');
}
.stonefont {
  font-family: ca-font;
  font-size: 16px;
}

在项目的 HTML 文件中使用 font-family 来使用自定义字体。

<div class="container">
  <span class="stonefont">&#xf161;&#xf63a;.&#xef29;&#xf1e0;</span>
</div>

这里出现了文字编码,&#xf161 对应数字 9,&#xf63a; 对应数字 1,依次类推。

文字编码可以通过刚刚的 FontCreator 工具查看,下图红框区域的 uniF161 时文字的 unicode 编码,转换到网页中对应如下。

字体反爬,一种来自字体设计师的跨行反爬案例 | 案例 28

整理文字编码

在编写 Flask 反爬代码前,先整理出该字体文件编码与字形的对应关系。

  • uniF161:&#xf161; 对应数字 9;
  • uniF63A:&#xf63a; 对应数字 1;
  • uniEF29:&#xef29; 对应数字 2;
  • uniE7D6:&#xe7d6; 对应数字 4;
  • uniF1E0:&#xf1e0; 对应数字 7;
  • uniE092:&#xe092; 对应数字 3;
  • uniF280:&#xf280; 对应数字 6;
  • uniEEF0:&#xeef0; 对应数字 0;
  • uniE60F:&#xe60f; 对应数字 8;
  • uniEF9D:&#xef9d; 对应数字 5;

Flask 中随机一串数字,渲染到前台

在 Flask 中随机定义一个数字,例如 984367,然后再前台实现渲染。

先看一下完整代码:

# 字体反爬
@antispider.route('/font')
def font():

    fonts = ['&#xeef0;','&#xf63a;','&#xef29;','&#xe092;','&#xe7d6;','&#xef9d;','&#xf280;','&#xf1e0;','&#xe60f;','&#xf161;']
    mynum = 9843670
    ret = list(map(int, str(mynum)))

    new_num_str = "".join([fonts[_] for _ in ret])

    html_string = '<span class="stonefont">'+new_num_str+'</span>'
    # Markup()
    safe_html = Markup(html_string)
    return render_template("antispider/font.html",new_num_str=safe_html)

字体反爬,一种来自字体设计师的跨行反爬案例 | 案例 28

这里将 span 标签作为一个整体进行了输出,并且用到了 Markup 类,该类可以将一个字符串标记为安全的 HTML 代码。可以使用 Markup.escape() 方法将普通字符串转换为安全的 HTML 代码,也可以使用 Markup() 构造函数将一个字符串标记为安全的 HTML 代码。

如果不这样使用,仅传递编码之后的数字到前台,会得到下述异常效果,即数字编码被当成了普通字符串进行输出。

字体反爬,一种来自字体设计师的跨行反爬案例 | 案例 28

当然,这里仅对数字编码字符串进行操作,效果也是一样的。

html_string = new_num_str
# Markup()
safe_html = Markup(html_string)
return render_template("antispider/font.html", new_num_str=safe_html)

总结

本篇博客实现的是最简单的字体反爬,实战中我们还可以动态生成字体文件编码,动态生成字体文件内容增强反爬。

本案例完善后,将会上传到爬虫训练场中供大家学习:pachong

📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 851 篇原创博客

全网 6000+人正在学习的 爬虫专栏 👇👇👇👇

  • ⭐️ Python 爬虫 120,点击订购 ⭐️
  • ⭐️ 爬虫 100 例教程,点击订购 ⭐️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/182223.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GeoServer学习笔记-01GeoSever运行编译

一、运行1. 下载GeoServerGitHub仓库地址&#xff1a;https://github.com/geoserver/geoserver2.本地代码工具打开项目在idea里&#xff0c;文件->新建->来自现有的源代码项目&#xff0c;选择项目的pom文件加载项目。3.idea编译环境设置&#xff08;1&#xff09;设置jd…

图论(5)最小生成树简单应用

活动 - AcWing 参考&#xff1a;《算法竞赛进阶指南》-lyd 目录 一、基础算法 二、 1.最短网络&#xff08;prim板子&#xff09; 2.局域网&#xff08;kruskal板子&#xff09; 3.繁忙的都市 4.1143. 联络员 5.连接格点&#xff08;预处理&#xff09; 一、基础算法…

影响电商发展的重要因素及电商未来的发展可能

易观分析&#xff1a;自从互联网传入中国以后&#xff0c;特别是2000年以后&#xff0c;一直保持着非常快的演变速度&#xff0c;而以互联网为基础的电商则更是发展成了中国互联网的代表性行业。中国电商的发展不仅在初期有着非常高的增速&#xff0c;有着多样化的演进路线&…

Numpy(3)—切片和索引、高级索引、Broadcast、迭代数组、广播迭代

1.切片和索引 eg1&#xff1a;我们首先通过 arange() 函数创建 ndarray对象。 然后&#xff0c;分别设置起始&#xff0c;终止和步长的参数为 2&#xff0c;7 和 2。 import numpy as npa np.arange(10) s slice(2, 7, 2) # 从索引 2 开始到索引 7 停止&#xff0c;间隔为…

【笔记】行人属性识别

【论文】https://arxiv.org/pdf/1901.07474.pdf &#xff08;以下序号与论文序列不对应&#xff09; 属性可以看作是高层语义信息&#xff0c;对视点变化和观察条件多样性具有更强的鲁棒性 本文试图解决以下几个重要问题: (1)传统和基于深度学习的行人属性识别算法之间的联系…

Java_Git:4. 分支管理

目录 1 创建合并分支 2 使用TortoiseGit实现分支管理 2.1 创建分支 2.2 合并分支 3 解决冲突 1 创建合并分支 Git会把每次的提交&#xff0c;串成一条时间线&#xff0c;即一个分支。 初始状态&#xff0c;Git只有一条时间线&#xff08;分支&#xff09;&#xff0c;这个分…

高级Spring之BeanFactory 后处理器

老样子&#xff0c;直接上代码演示&#xff0c;准备一个干净的容器&#xff1a; // ⬇️GenericApplicationContext 是一个【干净】的容器GenericApplicationContext context new GenericApplicationContext();//注册configBeancontext.registerBean("config", Conf…

【C语言学习笔记】39. 错误处理、递归

前言 C 语言不提供对错误处理的直接支持&#xff0c;但是作为一种系统编程语言&#xff0c;它以返回值的形式允许您访问底层数据。 错误处理 C 语言不提供对错误处理的直接支持&#xff0c;但是作为一种系统编程语言&#xff0c;它以返回值的形式允许您访问底层数据。在发生…

振弦采集模块配置工具VMTool的MODBUS 工具模块

振弦采集模块配置工具VMTool的MODBUS 工具模块 &#xff08; 1&#xff09; 寄存器查看 此功能模块提供标准的 MODBUS 协议寄存器显示及单个寄存器修改功能&#xff0c;通过点击扩展功能区的【 MODBUS】 标签切换到此模块&#xff0c;如下图所示。 此模块将 VMXXX 所有寄存器以…

Codeforces Round #847 (Div. 3) A~E

比赛链接&#xff1a;Dashboard - Codeforces Round #847 (Div. 3) - Codeforces 目录 A. Polycarp and the Day of Pi B. Taisia and Dice C. Premutation D. Matryoshkas E. Vlad and a Pair of Numbers A. Polycarp and the Day of Pi 题意&#xff1a;求出一个数字…

一步创建 AI 图像网站,即刻生成 AI 图像解决方案 #Graydient

过去一年当中&#xff0c;AI 画图工具非常火爆&#xff0c;一条简单的指令&#xff0c;就能快速得出超高品质的图形&#xff0c;这对于游戏开发者来说无疑是令人振奋的消息&#xff0c;尤其是没有预算和人手打造美术资源的中小团队。从网络上看到的结果来看&#xff0c;AI 的绘…

JDBC(powernode 文档)(内含源代码)

源代码下载地址链接&#xff1a;https://download.csdn.net/download/weixin_46411355/87400304 目录 JDBC概述 1.1 前言 1.2 什么是JDBC 1.3 JDBC的原理 1.4 程序员&#xff0c;JDBC&#xff0c;JDBC驱动的关系及说明 1.4.1 JDBC API 1.4.2 JDBC 驱动 1.4.3 Java程序员…

并发编程-多线程并发设计原理

并发编程-多线程&并发设计原理并发编程简介多线程&并发设计原理1 多线程回顾1.1 Thread和Runnable1.1.1 Java中的线程1.1.2 Java中的线程&#xff1a;特征和状态1.1.3 Thread和Runnable接口1.1.4 Callable1.2 synchronized关键字1.2.1 锁的对象1.2.2 锁的本质1.2.3 实现…

k8s实现controller如何远程调式?

背景&#xff1a; 使用kubebuilder和code-generate生成自定义资源代码后&#xff0c;实现管理自定义资源的controller逻辑。此时&#xff0c;需要调试controller代码逻辑&#xff0c;有2种思路。方法1&#xff1a;对该代码打包成镜像文件&#xff0c;直接部署进入k8s集群中&…

Springboot+vue中小企业合同管理系统

编写企业合同管理系统&#xff0c;让其能创建合同、修改合同、删除合同、合同变更标识、合同收款提醒、合同时间管理、合同废止标识、结束合同、合同统计、合同查询等几大功能。 (1) 创建合同 管理人员将签订后的合同的各项信息存入数据库中&#xff0c;使合同进入开始执行的…

网络编程(2)

封装和分用 1)封装:就是在数据中添加一些辅助传输的信息&#xff1b; 2)分用:就是解析这些信息 3)发送数据的时候&#xff0c;上层协议要把数据交给下层协议&#xff0c;由下层协议来添加一些信息 4)接收数据的时候&#xff0c;下层协议要把数据交给上层协议&#xff0c;有上层…

分割pdf的办法?看这里就明白了!

对于大多数办公党来说&#xff0c;困难的或许不是制作一些办公文件、文档&#xff0c;重要的是如何将这些文档以合适的形式发送给需要的人。不管是客户还是同事、上级&#xff0c;他们对文档格式、内容的要求都是有不一样的标准的。这时候我们就面临一个重要的问题了&#xff0…

Linux驱动开发:块设备驱动

这里写自定义目录标题一、块设备的简介二、块设备驱动框架1、block_device 结构体2、gendisk 结构体3、block_device_operations 结构体4、块设备 I/O 请求过程5、bio 结构体三、使用请求队列方式的块设备驱动程序1、经过第“二”部分的讲解总结&#xff0c;可以得出驱动程序的…

Java基础10:常用API(上)

Java基础10&#xff1a;常用API&#xff08;上&#xff09;一、Math二、System1. currentTimeMillis2. arraycopy三、Runtime四、Object1. toString2. equals3. clone五、Objects六、BigInteger1. 构造方法&#xff08;获取BigInteger&#xff09;2. 常用方法七、BigDecimal1. …

2023年房地产地段研究报告

房地产的投资业务中&#xff0c;选择一个好的地段&#xff0c;或者说区位&#xff0c;是十分重要的。在房地产行业&#xff0c;房价中包含地价&#xff0c;而房价上升的主要原因则是地价的上升。当房屋所处的地段深受消费者青睐、该地段的房屋供不应求时&#xff0c;房屋的价格…