跳转到主要内容

方法说明 (v1)

警告

此 JavaScript API 已过时,建议使用 API 版本 2

请注意,部分方法需要使用 yield 关键字

yield this.request()

yield this.request(method, url, queryParams, opts)

通过请求获取 HTTP 响应,参数说明如下:

  • method - 请求方法 (GET, POST...)
  • url - 请求链接
  • queryParams - 包含 GET 参数的哈希表或包含 POST 请求体的哈希表
  • opts - 包含请求选项的哈希表

如果使用 POST 方法,可以通过两种方式传递请求体:

  • 直接在 queryParams 中列出变量名及其值。例如:
{
key: set.query,
id: 1234,
type: 'text'
}
  • 通过 opts 中的 body 变量。例如:
body: 'key=' + set.query + '&id=1234&type=text'

opts.check_content

check_content: [ 条件1, 条件2, ...] - 用于检查所获取内容的条件数组,如果检查未通过,则会使用其他代理重试请求。

功能:

  • 使用字符串作为条件(按字符串包含关系搜索)
  • 使用正则表达式作为条件
  • 使用自定义检查函数,函数会接收响应数据和响应头
  • 可以同时设定多种不同类型的条件
  • 对于逻辑非,请将条件放入数组中,即 check_content: ['xxxx', [/yyyy/]] 表示如果获取的数据中包含子串 xxxx 且正则表达式 /yyyy/ 在页面上没有匹配项,则请求被视为成功。

为了使请求成功,必须通过数组中指定的所有检查。

示例(注释中说明了请求成功所需的条件):

let response = yield this.request('GET', set.query, {}, {
check_content: [
/<\/html>|<\/body>/, //在获取的页面上必须匹配此正则表达式
['XXXX'], //在获取 the 页面上不得包含此子串
'</html>', //在获取的页面上必须包含此子串
(data, hdr) => {
return hdr.Status == 200 && data.length > 100;
} //此函数必须返回 true
]
});

opts.decode

decode: 'auto-html' - 自动检测编码并转换为 utf8

可能的值:

  • auto-html - 基于响应头、meta 标签和页面内容(最佳推荐选项)
  • utf8 - 指定文档编码为 utf8
  • <encoding> - 任何其他编码

opts.headers

headers: { ... } - 包含请求头的哈希表,请求头名称需使用小写,可以指定包括 cookie 在内的内容 示例:

headers: {
accept: 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
'accept-encoding': 'gzip, deflate, br',
cookie: 'a=321; b=test',
'user-agent' 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
}

opts.headers_order

headers_order: ['cookie', 'user-agent', ...] - 允许重新定义请求头的排序顺序

opts.recurse

recurse: N - 最大重定向跳转次数,默认为 7,使用 0 可禁用重定向跳转

opts.proxyretries

proxyretries: N - 请求执行的尝试次数,默认从爬虫工具设置中获取

opts.parsecodes

parsecodes: { ... } - 爬虫工具视为成功的 HTTP 响应代码列表,默认从爬虫工具设置中获取。如果指定 '*': 1,则所有响应都将被视为成功。 示例:

parsecodes: {
200: 1,
403: 1,
500: 1
}

opts.timeout

timeout: N - 响应超时时间(秒),默认从爬虫工具设置中获取

opts.do_gzip

do_gzip: 1 - 确定是否使用压缩 (gzip/deflate/br),默认开启 (1),若要关闭需设为 0

opts.max_size

max_size: N - 最大响应大小(字节),默认从爬虫工具设置中获取

opts.cookie_jar

cookie_jar: { ... } - 包含 Cookie 的哈希表。

opts.attempt

attempt: N - 指定当前尝试次数,使用此参数时,该请求的内置尝试处理器将被忽略

opts.browser

browser: 1 - 自动模拟浏览器请求头(1 - 开启, 0 - 关闭)

opts.use_proxy

use_proxy: 1 - 在 JS 爬虫工具内部为单个请求覆盖全局 Use proxy 参数(1 - 开启, 0 - 关闭)

opts.noextraquery

noextraquery: 0 - 禁用向请求 URL 添加 Extra query string(1 - 开启, 0 - 禁用)

opts.save_to_file

save_to_file: file - 允许将文件直接下载到磁盘,跳过内存写入。使用 file 指定保存文件的名称和路径。使用此选项时,所有与 data 相关的操作都将被忽略(如 check_content 中的内容检查、response.data 将为空等)。

opts.data_as_buffer

data_as_buffer: 0 - 确定将 data 作为字符串 String (0) 还是作为 Buffer 对象 (1) 返回,默认返回字符串 String

opts.bypass_cloudflare

bypass_cloudflare: 0 - 使用 Chrome 浏览器自动绕过 CloudFlare 的 JavaScript 防护(1 - 开启, 0 - 关闭)

opts.follow_meta_refresh

follow_meta_refresh: 0 - 允许跟随通过 HTML meta 标签声明的重定向:

<meta http-equiv="refresh" content="time; url=..." />

opts.tlsOpts

tlsOpts: { ... } – 允许为 https 连接传递 设置

yield this.parser.request()

yield this.parser.request(parser, preset, overrideParams, query)

从另一个爬虫工具(内置或另一个 JS 爬虫工具)获取结果,参数说明如下:

  • parser - 爬虫工具名称 (SE::Google, JS::Custom::Example)
  • preset - 被调用爬虫工具的设置预设
  • overrideParams - 包含被调用爬虫工具设置覆盖项的哈希表
  • query - 查询

overrideParams 中可以覆盖被调用爬虫工具的参数,还提供以下标志:

overrideParams.resultArraysWithObjects

resultArraysWithObjects: 0 - 确定以何种形式返回被调用爬虫工具的结果数组:

  • 如果开启 (1) - 将返回对象数组
    [{link: 'link1', anchor: 'anchor1'}, {link: 'link2', anchor: 'anchor2'}, ...]
  • 如果关闭 (0) - 将返回标准值数组
    ['link1', 'anchor1', 'link2', 'anchor2', ...]

overrideParams.needData

needData: 1 - 确定是否在响应中传递 (1) 或不传递 (0) data/pages[],可用于优化性能

tools.*

全局对象 tools,允许访问 A-Parser 的内置函数(类似于 模板引擎工具 $tools.*)。

备注

tools.query 不可用,必须使用 this.query

this.doLog()

显示是否开启了任务日志记录,可用作优化标志,适用于不记录日志且 this.logger.put 的参数为复杂表达式的情况

this.logger.*

.put()

this.logger.put(message) - 将字符串 message 添加到任务日志中

.putHTML()

this.logger.putHTML(code) - 向任务日志输出 HTML 代码,该代码将在文本区域中显示

yield this.sleep()

yield this.sleep(sec)

在线程中设置 sec 秒的延迟,可以是小数。

yield this.mutex.*

用于线程间同步的互斥锁(Mutex),允许为一个线程锁定代码段

.lock()

等待锁,第一个获取锁的线程将继续执行,其他线程将等待锁释放

.unlock()

释放锁,如果下一个线程正在等待锁 (.lock()),它将继续执行

this.cookies.*

处理当前请求的 Cookie

.getAll()

获取 Cookie 数组

.setAll()

设置 Cookie,必须传递一个包含 Cookie 的数组作为参数

.set()

this.cookies.set(host, path, name, value) - 设置单个 Cookie

this.query.add()

this.query.add(query, maxLvl)

添加新查询 (query),并可选择指定最大级别 (maxLvl),类似于 tools.query.add() 可以将包含参数的哈希表作为查询 (query) 传递,其工作方式类似于 查询构造器

示例:

this.query.add({
query: "http://site.com",
param1: "..",
...
});

this.proxy.*

处理代理

.next()

更换为下一个代理,旧代理将不再用于当前请求

.ban()

更换并封禁代理(当服务按 IP 封锁操作时需使用),代理将被封禁,时长由爬虫工具设置中的 (proxybannedcleanup) 指定

.get()

获取当前代理(最后一次发出请求时使用的代理)

.set()

this.proxy.set('http://127.0.0.1:8080', noChange = false) - 为下一个请求设置代理,noChange 参数是可选的,如果设为 true,则在尝试之间不会更换代理

yield this.captcha.*

处理验证码

.recognize()

yield this.captcha.recognize(preset, image, type, overrides) - 上传验证码进行识别

  • image - 用于识别的图片二进制数据
  • preset - 指向 Util::AntiGateUtil::AntiGate 的预设
  • type 指定为以下之一:'jpeg', 'gif', 'png'

结果将是包含以下字段的哈希表:

  • answer - 图片中的文本
  • id - 验证码 ID,以便后续通过 reportBad 报告错误
  • error - 如果未设置 answer,则为文本错误信息

.recognizeFromUrl()

yield this.captcha.recognizeFromUrl(preset, url, overrides) - 与前一个方法类似,但验证码将通过链接 (url) 自动下载,不使用代理

.reportBad()

yield this.captcha.reportBad(preset, id, overrides) - 向服务报告验证码识别错误

this.utils.*

.updateResultsData()

this.utils.updateResultsData(results, data) - 用于自动填充 $pages.$i.data$data 的方法,添加结果页面的内容时必须调用

.urlFromHTML()

this.utils.urlFromHTML(url, base) - 处理从 HTML 代码中获取的链接 - 解码实体(&amp; 等),可选传递 base(基础 URL,例如原始页面的 URL),从而可以获取完整的链接

.url.extractDomain()

this.utils.url.extractDomain(url, removeDefaultSubdomain) - 该方法接受一个链接作为第一个参数,并返回该链接中的域名。第二个可选参数决定是否从域名中裁剪 www 子域名。默认值为 0 - 即不裁剪。

.url.extractTopDomain()

this.utils.url.extractTopDomain(url) - 该方法接受一个链接作为第一个参数,并返回该链接中的域名,不含子域名。

.url.extractTopDomainByZone()

this.utils.url.extractTopDomainByZone(url) - 该方法接受一个链接作为第一个参数,并返回该链接中的域名,同样不含子域名。适用于所有地区后缀

.url.extractMaxPath()

this.utils.url.extractMaxPath(url) - 该方法接受一个字符串并从中提取 URL

.url.extractWOParams()

this.utils.url.extractWOParams(url) - 该方法接受一个链接并返回裁剪掉参数字符串后的链接。即返回 ? 之前的 URL

.removeHtml()

this.utils.removeHtml(string) - 该方法接受一个字符串并返回清除 HTML 标签后的结果

.removeNoDigit()

this.utils.removeNoDigit(string) - 该方法接受一个字符串,删除其中除数字以外的所有内容并返回结果

.removeComma()

this.utils.removeComma(string) - 该方法接受一个字符串,删除其中的 .,\r\n 等字符并返回结果

this.sessionManager.*

要在 JS 爬虫工具中使用会话,首先需要初始化会话管理器。这可以通过 init() 函数完成

init() {
this.sessionManager.init({
//在此处可以设置其他参数
});
}

this.sessionManager.init() 中可以使用以下参数:

  • name - 可选参数,允许重定义会话所属的爬虫工具名称,默认为进行初始化的爬虫工具名称
  • canChangeProxy - 可选参数,是否允许更换代理,默认为 1
  • domain - 可选参数,指定是在此爬虫工具的所有已保存会话中查找(如果未指定值),还是仅针对特定域名查找(需要在域名前加点,例如 .site.com

有几个用于处理会话的函数:

.get()

this.sessionManager.get() - 获取新会话,必须在执行请求前调用

.reset()

this.sessionManager.reset() - 清除 Cookie 并获取新会话。如果当前会话的请求不成功,则需要调用此函数。

.save()

this.sessionManager.save() - 保存成功的会话或在会话中保存自定义数据

results.<array>.addElement()

results.<array>.addElement() 方法可以更方便地填充 results 中的数组。使用它时,无需记住数组中变量的顺序,也无需手动列出它们。

results.serp.addElement({
link: 'https://google.com',
anchor: 'Google',
snippet: 'Loreps ipsum...',
});

init()destroy() 方法

方法 init() 在任务开始时调用,destroy() 在结束时调用。

使用示例:

const puppeteer = require("puppeteer");
let globalBrowser;

class Parser {
constructor() {
...
}

async init() {
globalBrowser = await puppeteer.launch();
};

async destroy() {
if(globalBrowser)
await globalBrowser.close();
}
}

常用链接