基于 JavaScript 的爬虫工具:功能概览
JavaScript 爬虫工具 - 能够使用 JavaScript 语言创建具有任意复杂逻辑的自定义爬虫工具。同时,在 JS 爬虫工具中也可以使用标准爬虫工具的所有功能。

功能特性
利用 A-Parser 的强大功能,现在可以编写具有任意复杂逻辑的自定义爬虫工具/注册机/发布机。代码编写使用支持 ES6 特性的 JavaScript(v8 引擎)。
爬虫工具代码极其简洁,让您可以专注于逻辑编写;多线程、网络、代理、结果处理、日志记录等工作由 A-Parser 自动处理。您可以直接在爬虫工具界面中编写代码,通过在“爬虫工具编辑器”中添加新爬虫工具即可。此外,也可以使用第三方编辑器(如 VSCode)来编写爬虫工具。
通过内置编辑器保存爬虫工具代码时,会自动进行版本管理。
使用 JavaScript 爬虫工具功能需持有 Pro 或 Enterprise 许可证。
访问 JS 爬虫工具编辑器
如果远程使用 A-Parser,出于安全考虑,默认不开放 JS 爬虫工具编辑器。要开启访问权限,需要:
- 在 Settings -> Global Settings 选项卡中设置密码
- 在 config/config.txt 中添加以下行:
allow_javascript_editor: 1 - 重启 A-Parser
操作指南
在爬虫工具编辑器中创建一个新爬虫工具并命名。默认会加载一个简单的示例,您可以基于此快速开始创建自己的爬虫工具。
如果使用第三方编辑器编写代码,则需要打开 /parsers/ 文件夹中对应的爬虫工具文件。已安装程序的文件结构。
代码准备就绪后,保存并像普通爬虫工具一样使用:在任务编辑器中选择创建的爬虫工具,根据需要设置参数、线程配置、文件名等。
创建的爬虫工具可以随时编辑。所有涉及界面的更改将在重新在列表中选择该爬虫工具或重启 A-Parser 后生效;逻辑上的更改将在重新启动包含该爬虫工具的任务时应用。
默认情况下,每个创建的爬虫工具都会显示标准图标,您可以将 png 或 ico 格式的自定义图标放入 /parsers/ 下的爬虫工具文件夹中来更换图标:
通用工作原理
默认会创建一个简单的爬虫工具示例,供进一步编辑。
- TypeScript
- JavaScript
import { BaseParser } from 'a-parser-types';
export class JS_v2_example extends BaseParser {
static defaultConf: typeof BaseParser.defaultConf = {
version: '0.0.1',
results: {
flat: [
['title', 'HTML title'],
]
},
max_size: 2 * 1024 * 1024,
parsecodes: {
200: 1,
},
results_format: '$query: $title\\n',
};
static editableConf: typeof BaseParser.editableConf = [];
async parse(set, results) {
this.logger.put("Start scraping query: " + set.query);
let response = await this.request('GET', set.query, {}, {
check_content: ['<\/html>'],
decode: 'auto-html',
});
if (response.success) {
let matches = response.data.match(/<title>(.*?)<\/title>/i);
if (matches)
results.title = matches[1];
}
results.success = response.success;
return results;
}
}
const { BaseParser } = require("a-parser-types");
class JS_v2_example_js extends BaseParser {
static defaultConf = {
version: '0.0.1',
results: {
flat: [
['title', 'HTML title'],
]
},
max_size: 2 * 1024 * 1024,
parsecodes: {
200: 1,
},
results_format: '$query: $title\\n',
};
static editableConf = [];
async parse(set, results) {
this.logger.put("Start scraping query: " + set.query);
let response = await this.request('GET', set.query, {}, {
check_content: ['<\/html>'],
decode: 'auto-html',
});
if (response.success) {
let matches = response.data.match(/<title>(.*?)<\/title>/i);
if (matches)
results.title = matches[1];
}
results.success = response.success;
return results;
}
}
构造函数为每个任务调用一次。必须设置 this.defaultConf.results 和 this.defaultConf.results_format,其他字段为可选,将采用默认值。
this.editableConf 数组定义了用户可以从 A-Parser 界面修改哪些设置。可以使用以下字段类型:
combobox- 下拉选择菜单。也可以创建标准爬虫工具的预设选择菜单,例如:
['Util_AntiGate_preset', ['combobox', 'AntiGate preset']]
- 支持多选的
combobox。需要额外设置参数{'multiSelect': 1}:
['proxyCheckers', ['combobox', 'Proxy Checkers', {'multiSelect': 1}, ['*', 'All']]]
checkbox- 复选框,用于只有两个值(true/false)的参数textfield- 文本框textarea- 多行输入文本框
parse 方法是一个异步函数,对于任何阻塞操作必须返回 await(这是与普通函数的主要且唯一的区别)。该方法针对处理中的每个请求进行调用。必须传递 set(包含查询及其参数的哈希)和 results(结果的空模板)。同时必须返回填充好的 results,并预先设置 success 标志。
自动版本管理
版本格式为 Major.Minor.Revision
- TypeScript
- JavaScript
this.defaultConf: typeof BaseParser.defaultConf = {
version: '0.1.1',
...
}
this.defaultConf = {
version: '0.1.1',
...
}
每次保存时,Revision(最后一位数字)会自动递增。其他值(Major、Minor)可以手动更改,也可以将 Revision 重置为 0。
如果由于某种原因需要仅手动更改 Revision,则版本号必须用双引号 "" 括起来。
批量处理查询
在某些情况下,可能需要一次从队列中提取多个查询并进行处理。内置爬虫工具在需要一次性请求多个键(批量)的数据时会使用这种模式。
要在 JS 爬虫工具中实现相同功能,需要在 this.defaultConf 中设置 bulkQueries: N,其中 N 是每批所需的查询数量。在这种情况下,爬虫工具将按每批 N 个提取查询,当前迭代的所有查询都将包含在 set.bulkQueries 数组中(包括所有标准变量:query.first、query.orig、query.prev 等)。以下是此类数组的示例:
[
{
"first": "test",
"prev": "",
"lvl": 0,
"num": 0,
"query": "test",
"queryUid": "6eb301",
"orig": "test"
},
{
"first": "测试",
"prev": "",
"lvl": 0,
"num": 1,
"query": "测试",
"queryUid": "774563",
"orig": "测试"
},
{
"first": "third query",
"prev": "",
"lvl": 0,
"num": 2,
"query": "third query",
"queryUid": "2bc8ed",
"orig": "third query"
}
]
批量处理时的结果必须填充在 results.bulkResults 数组中,其中每个元素都是一个 results 对象。results.bulkResults 中的元素顺序应与 set.bulkQueries 中的顺序一致。
相关链接
📄️ bulkQueries 示例
使用 bulkQueries 调用内置爬虫工具的示例
🔗 示例与讨论
论坛上关于 JS 爬虫工具功能的示例与讨论主题
🔗 JS 爬虫工具目录
资源目录中关于 JS 爬虫工具的章节
🔗 ES6 基础功能概览
habrahabr 上关于 ES6 基础功能概览的文章