方法说明 (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::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 代码中获取的链接 - 解码实体(& 等),可选传递 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- 可选参数,是否允许更换代理,默认为 1domain- 可选参数,指定是在此爬虫工具的所有已保存会话中查找(如果未指定值),还是仅针对特定域名查找(需要在域名前加点,例如.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();
}
}
常用链接
🔗 将文件保存到磁盘的示例
演示如何直接将文件保存到磁盘的示例
🔗 会话操作示例
在 JavaScript 爬虫工具中使用会话功能
🔗 在会话中保存数据的示例
演示在会话中存储自定义数据的可能性
🔗 使用 results.addElement()
使用 results.addElement() 填充数据数组的示例,并演示与普通 .push() 的区别