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

举报
梦想橡皮擦 发表于 2023/05/26 17:53:30 2023/05/26
【摘要】 本篇博客涉及的内容非常有价值,尤其是在反爬领域。核心内容为自定义字体文件反爬。 准备工作在正式编写代码前,需要先安装 FontCreator ,它是一个字体编辑器,支持多种字体格式,可以用于创建、编辑和转换字体文件。关于工具的使用,可以查看 《爬虫 120》 专栏中字体反爬的相关文章。除此之外,还需要准备一个字体文件,用于设置反爬内容。字体文件包含 0-9 这几个数字,点击进行下载。由于我们...

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

准备工作

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

关于工具的使用,可以查看 《爬虫 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 编码,转换到网页中对应如下。

整理文字编码

在编写 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)

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

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

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

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

总结

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

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。