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

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逆向搞定字体反爬并获取某招聘网站信息的方法,希望读者能够对字体反爬和爬虫技能有更深入的了解。需要注意的是,本文所介绍的方法仅供学习参考,切勿用于非法用途。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。