关于字体反爬

简介: 反爬有很多手段,字体反爬就是其中之一。之前一直都是听过,但是却没怎么在实际爬虫中遇到过,最近在一个爬虫题目网站上看到了,试了试,发现还挺麻烦,当然自己从头研究字体肯定麻烦,简单的是模块多的是,选几个就过了。

反爬有很多手段,字体反爬就是其中之一。之前一直都是听过,但是却没怎么在实际爬虫中遇到过,最近在一个爬虫题目网站上看到了,试了试,发现还挺麻烦,当然自己从头研究字体肯定麻烦,简单的是模块多的是,选几个就过了。

字体反爬

爬虫与反爬一直在不停的斗争,手段层次不穷。字体反爬算是常见的一种手段,大抵的思路是通过字体文件将浏览器渲染结合起来,让浏览器看到的内容与肉眼看到的内容不一致,达成一定的反爬目的。

比如,我们定义一个字体<1> 但是对应的svg显示为<5> ,那么肉眼看到的是5 ,通过源码或抓取得到的确是1。 之前的时候是通过一个字体文件,现在慢慢演变为动态字体,每次看到的都不同,所以现在我们需要对字体进行解析,得到最终的数据。

反爬

这里有个题目http://glidedsky.com/level/crawler-font-puzzle-1 ,不是打广告哈,关于字体反爬的一个题目。

我按照这个题目进行整理实现思路,可能不具有通用性。

目标地址

http://glidedsky.com/level/web/crawler-font-puzzle-1 ,根据给定的地址,我们可以看到源码与数字是不同的,那么我们可以通过控制台很容易找到这个字体,而且可以找到该字体是通过页面中的base64来指定的字体文件。

image.png

先将base64 转为 ttf 文件

代码或工具都可以:
https://www.motobit.com/util/base64-decoder-encoder.asp 工具转换。

代码转换(nodejs):

const base64str = `xxxx由于太长,此处不写了`;//data:font;charset=utf-8;base64, 之后的内容,不要逗号
const fs = require('fs');
fs.writeFileSync('./demo.ttf',Buffer.from(base64str,'base64'));

通过fontcreator软件打开后可以看到,字体展示与unicode标注的都是不同的。

image.png

但是...

目前,还没找到除了ocr识别外的更好的办法,之前看文档有说可以从ttf中拿到映射关系的,不过我没处理出来..能力有限。而且,这个我也没有使用ocr,直接使用了一个下标判断。

将ttf解析为xml ,并转为对象,然后获取下标,得到映射

const font = require('font-carrier');
const xml2json = require('xml2json');

//加载字体
let transFont = font.transfer('./demo.ttf');
let str = transFont.toString();
let json = xml2json.toJson(str);
let obj = JSON.parse(json);
let fonts = obj.svg.defs.font.glyph;
let map = {};
//就目前来看,还没找到对应的映射关系,比较理想的是,根据下标,除去第一个,从0开始。
fonts.forEach((t, i) => {
  if (i>0) {
    let code = t.unicode;//4
    let index = i - 1;//0
    //对应的意思就是:给浏览器一个字符串4 ,显示出来是 0 。
    map[code] = index;
  }
})
console.log(map);

image.png

剩下的就是一页一页的抓取,然后获取ttf并解析,最终进行匹配了..


关于ocr 一直不太懂,而且python也不会,最近也一直想了解下这部分的内容,正在努力学习中..
其实一直想实现的就是给定一张图,从图中找到某个字,并返回对应字体在图中的位置..感觉好多地方都会用到,可惜实力不允许,太菜了。

相关文章
|
2月前
|
数据采集 Web App开发 JavaScript
Selenium爬虫技术:如何模拟鼠标悬停抓取动态内容
本文介绍了如何使用Selenium爬虫技术抓取抖音评论,通过模拟鼠标悬停操作和结合代理IP、Cookie及User-Agent设置,有效应对动态内容加载和反爬机制。代码示例展示了具体实现步骤,帮助读者掌握这一实用技能。
114 0
Selenium爬虫技术:如何模拟鼠标悬停抓取动态内容
|
3月前
|
前端开发
【前端web入门第三天】02 CSS字体和文本
本文详细介绍了CSS中字体和文本的相关属性。字体部分涵盖字体大小、粗细、样式、行高、字体族及`font`复合属性,通过具体示例展示了如何设置和使用这些属性。文本部分则讲解了文本缩进、对齐方式、修饰线及文字颜色等属性,并提供了实用的代码示例。此外,还简要介绍了调试工具中的一些细节,如错误属性标识和属性生效状态的控制。
73 28
|
2月前
|
前端开发 索引
字体反爬案例分析与爬取实战
字体反爬案例分析与爬取实战
15 0
|
7月前
|
前端开发
css样式字体、文本、背景属性,盒子模型详解,轻松调教出优美的字体和网页背景色
css样式字体、文本、背景属性,盒子模型详解,轻松调教出优美的字体和网页背景色
如何快速修改网页上的文字?
如何快速修改网页上的文字?
488 0
|
Web App开发 前端开发
网页|如何实现网页变灰效果
网页|如何实现网页变灰效果
126 0
|
Web App开发 JavaScript 前端开发
教你如何去除网页文字防复制粘贴的方法
教你如何去除网页文字防复制粘贴的方法
274 0
|
Web App开发 前端开发 Windows
[前端]网页中使用自定义字体
1.浏览器对字体格式的支持 浏览器类型 支持格式 IE6 仅支持.eot格式 IE7 仅支持.eot格式 IE8 仅支持.
690 0