1. 搭建环境
在进行JS逆向字体反爬之前,需要先搭建逆向环境。这里我们使用Chrome浏览器的调试工具和Fiddler。具体操作如下:
1.1 下载安装Chrome浏览器
首先需要在官网下载并安装Chrome浏览器,推荐使用最新版本。
1.2 下载安装Fiddler
Fiddler是一款免费的Web抓包工具,可以帮助我们截获网络通信数据。下载地址为:https://www.telerik.com/download/fiddler。在安装时选择“所有用户”。
1.3 启动Fiddler
安装完成后,启动Fiddler,配置代理为127.0.0.1:8888。
1.4 启动Chrome浏览器
启动Chrome浏览器,打开调试工具,快捷键F12。在调试工具中选择Network选项卡,在左下角开启Preserve log选项。
2. 获取字体文件
当我们访问某些招聘网站时,会发现字体被反爬虫加密了。此时我们需要通过逆向获取字体文件,以还原出真正的字符。下面以猎聘网为例,演示如何获取字体文件。
2.1 访问猎聘网
在Chrome浏览器中输入猎聘网网址,并按下回车键,等待网页加载完成。
2.2 查看字体反爬代码
在调试工具中,点击Network选项卡,刷新网页,然后在Name列中找到带woff或ttf后缀的文件。点击该文件,在右边的框中选择Preview选项卡。我们可以发现代码中有一段类似下面的代码:
//
@font-face {
font-family:"lpicon";
src:url("data:application/font-woff;charset=utf-8;base64,d09GRk9U...AAAD");
font-weight:400;
font-style:normal
}
//]]>
该部分代码即是字体反爬代码,其中src部分就是加密后的字体文件。我们需要将其下载到本地,以便后续还原字符使用。
2.3 下载字体文件
在该文件预览页面中,点击Save Response按钮,将字体文件保存到本地。
3. 还原字符
当我们已经获取了字体文件后,我们需要对字体文件进行解析,以还原出真正的字符。
3.1 安装fontmin模块
fontmin是一款用于从字体文件中提取文字的模块。我们可以使用npm在命令行中安装fontmin:
npm install fontmin
3.2 编写解析字体代码
下面是解析字体文件的代码:
// 导入依赖
var Fontmin = require('fontmin');
var fs = require('fs');
var path = require('path');
// 读取字体文件
var buffer = fs.readFileSync(path.join(__dirname, 'lpicon.woff'));
// 字体转换
var fontmin = new Fontmin()
.src(buffer)
.use(Fontmin.glyph({
text: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+-={}|[];:"\',./<>? ',
hinting: false // keep ttf hint info (fpgm, prep, cvt). default = true
}))
.use(Fontmin.ttf2woff({
deflate: true // 压缩字体数据. default = false
}));
// 保存字体文件
fontmin.run(function(err, files, stream) {
if (err) {
throw err;
}
// 写入字体文件
fs.writeFileSync(path.join(__dirname, 'lpicon_new.woff'), files[0].contents);
});
上述代码会将原有的字体文件lpicon.woff转换成lpicon_new.woff字体文件,并保存到本地。
3.3 解析字体文件
在已经获取字体文件并还原出真正字符的前提下,我们可以通过JavaScript代码解析字体文件。下面是解析字体文件的代码:
// 导入依赖
var ttfjs = require('ttf.js');
var fs = require('fs');
// 读取字体文件
var buffer = fs.readFileSync('./lpicon_new.woff');
// 将字体文件转换为JSON格式
var json = ttfjs(buffer).toJSON();
// 输出字形信息
json.glyf.forEach(function(glyf, index) {
console.log('index: ' + index);
console.log('unicode: ' + String.fromCharCode(glyf.unicode));
console.log('contours: ' + glyf.contours);
});
通过以上代码,我们可以输出字形信息,找出真正的字符和它们对应的Unicode编码。
4. 获取招聘网站信息
在还原了字体文件中的字符后,我们就可以对招聘网站进行爬取了。下面以猎聘网为例,演示如何获取职位信息。
4.1 获取Cookie
在Chrome浏览器中打开猎聘网,使用F12打开调试窗口,进入Network选项卡,看到有一条名为auth_sid的请求,点击它,在右侧Request Headers中即可找到Cookie值。
4.2 构造请求
我们需要通过请求构造将Cookie值带上,并在请求头中加上accept、accept-encoding、accept-language、cache-control、referer等参数。下面是构造请求的代码:
// 导入依赖
var request = require('request');
// 构造请求头
var headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Cookie': 'auth_sid=xxxxxxxxxxxxxxxxxxxxxxxxx',
'Host': 'www.liepin.com',
'Pragma': 'no-cache',
'Referer': 'https://www.liepin.com/zhaopin/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
};
// 构造查询条件
var qs = {
'pageSize': 15,
'key': 'Java',
'curPage': 1,
'dqs': '',
'pubTime': '',
'salary': '',
'jobKind': '',
'sortFlag': 15,
'flushckid': 1,
'searchType': 1,
'headckid': '4c9868181ff4cef5',
'fromSearchBtn': 2,
'ckid': '4c9868181ff4cef5',
'industries': '',
'clean_condition': '',
'siTag': '-W_YFff7yXjuov8U2gxAsw~lZeVLFFkKeYcAMfyjv0cQ',
'd_sfrom': 'search_fp_nvbar',
'd_ckId': 'f4aa213d6c1542eaf5a9e37a679e76ed',
'd_curPage': 0,
'd_pageSize': 40,
'd_headId': 'f4aa213d6c1542eaf5a9e37a679e76ed',
'curPage': 1
};
// 发送请求
request.get({
url: 'https://www.liepin.com/zhaopin/',
headers: headers,
qs: qs
}, function(error, response, body) {
if (error) {
console.log(error);
} else {
console.log(response.statusCode, body);
}
});
通过以上代码,我们可以获取到职位信息。
总结
本文通过介绍手把手教你JS逆向搞定字体反爬并获取某招聘网站信息的方法,希望读者能够对字体反爬和爬虫技能有更深入的了解。需要注意的是,本文所介绍的方法仅供学习参考,切勿用于非法用途。