内置函数

平台提供了一系列内置函数,方便开发者开发。下面逐一介绍。

extract

function extract(html, xpath, keepTag)

@param String html 网页文本,可以是整个网页,也可以是一个html片段

@param String xpath xpath表达式

@param Boolean keepTag 是否保留最外层的tag,默认值false,即不保留

@return String 返回html中符合xpath的第一个dom元素的字符串形式。当keepTag为false时,默认去除外层的标签,为true时保留。

代码示例在exclude函数之后。

extractList

function extractList(html, xpath, keepTag)

@param String html 网页文本,可以是整个网页,也可以是一个html片段

@param String xpath xpath表达式

@param Boolean keepTag 是否保留最外层的tag,默认值false,即不保留

@return String数组 返回html中符合xpath的所有dom元素的字符串形式组成的数组。当keepTag为false时,默认去除外层的标签,为true时保留。

代码示例在exclude函数之后。

exclude

function exclude(html, xpath)

@param String html 网页文本,可以是整个网页,也可以是一个html片段

@param String xpath xpath表达式

@return String 返回html中去除符合xpath的所有dom元素后剩余的内容。

从html中去除符合xpath的所有元素。
extract extractList exclude代码示例:

var html = '\
<div>\
<span>abc</span>\
<span class="c1">def</span>\
<a href="https://www.shenjian.io">神箭手</a>\
</div>';

extract(html, "//span");//返回"abc"
extract(html, "//span", true);//返回"<span>abc</span>"
extract(html, "//a");//返回"神箭手"
extract(html, "//a", true);//返回"<a href="https://www.shenjian.io">神箭手</a>"
extract(html, "//a/@href");//返回"https://www.shenjian.io"

extractList(html, "//span");//返回["abc","def"]
extractList(html, "//span", true);//返回["<span>abc</span>","<span class=\"c1\">def</span>"]
extractList(html, "//span[contains(@class,'c1')]");//返回["def"]

exclude(html, "//span");//返回"<div><a href="https://www.shenjian.io">神箭手</a></div>"

hostFile

function hostFile(url, type, options)

@param String url 待托管的文件链接地址

@param 枚举 type 托管文件的类型。可选值为FileType.IMAGEFileType.TEXTFileType.AUDIOFileType.VIDEOFileType.APPLICATION,分别对应图片、文本、音频、视频、应用,爬虫设置中可以选择是否托管对应的类型。可以不设置,建议指定一个类型。

@param JS对象 options 其他选项,可选择设置下载文件时使用的headers,以及在下载之前提供文件大小fileSize。

@return String 托管后的标识字符串,此串需要出现在爬取结果里面,否则不会进行托管。

非常重要:此函数的返回值一定不能忽略,一定得作为某个抽取项值或者值的一部分,否则不会进行托管。

爬虫在开启托管之后,首先会自动识别文件链接进行托管,识别规则如下:

  • 对于抽取的html文本,会自动识别其中的img标签,并对其链接进行托管,托管类型为图片。
  • 对于单独抽取的链接地址或链接地址数组,会自动根据后缀名进行识别,如果识别成功,则托管为对应的类型。

对于不能自动识别的链接,如果还需要托管,则需要主动调用此函数来进行托管。
调用此函数时,如果未指定type,会自动根据后缀名进行识别,对于不能识别的类型,都会归为FileType.APPLICATION

options对象

options对象用来指定下载时的参数,支持属性如下:

  • fileSize Integer 文件大小
    指定额外的文件大小信息可以加速下载时的处理。
  • headers JS对象 下载该文件时使用的headers
    可以设置User-AgentCookie等,文件链接所在的网页链接会作为默认的Referer,一般不需要特殊指定,当然也可以在headers里面指定来覆盖默认值。

可自动识别文件类型的后缀:

文件类型 可自动识别文件类型的后缀
图片 .jpg, .jpeg, .png, .gif, .svg, .bmp
文本 .txt, .text
音频 .mp3, .wav, .wma, .amv, .m4a
视频 .mp4, .avi, .mpg, .mov, .3gp, .wmv, .3gpp
应用 .doc, .docx, .ppt, .pptx, .xls, .xlsx, .pdf, .csv, .zip, .rar, .gzip, .gz, .apk, .exe, .iso, .dmg

示例代码:

var configs = {
fields: [
{
name: "cover",
selector: "//div[@id='cover']/img/@src"
},
{
name: "attaches",
selector: "//div[@id='attaches']/a/@href",
repeated: true
}
]
};
configs.afterExtractField = function(fieldName, data, page, site) {
if (fieldName == "cover") {
return hostFile(data, FileType.IMAGE);//使用hostFile的返回值作为抽取项cover的值
}
else if (fieldName == "attaches") {
var attaches = [];
//对于抽取项attaches的每个链接进行hostFile调用
//并将返回值组成新的数据,作为抽取项attaches的值
for(var i = 0; i < data.length; i++) {
var hostedUrl = hostFile(data[i], FileType.AUDIO);
attaches.push(hostedUrl);
}
return attaches;
}
}

solveCaptcha

function solveCaptcha(url, type)

@param String url 验证码图片的地址

@param 整型 type 验证码类型,查看详情

@return json对象 返回识别后的结果

此函数用来识别图片验证码,开发者需要传入图片地址,以及该验证码图片对应的类型,识别成功后,开发者需要利用返回的结果,拼接请求并发送,来完成整个验证过程。

返回的json对象结构如下:

{
"ret": 5,
"desc": "",
"result": ""
}

ret是返回码,大于0表示成功,小于0表示失败。desc是失败时的描述。result是识别的结果。

返回成功的示例:

{"ret":5,"result":"UMEI"}

返回失败的示例:

{"ret":-1,"desc":"识别失败"}

solveCaptchaFromBase64

function solveCaptchaFromBase64(base64, type)

@param String base64 验证码图片的base64编码数据

@param 整型 type 验证码类型,查看详情

@return json对象 返回识别后的结果

此函数的返回值与solveCaptcha相同。

solveGeetest

function solveGeetest(gt, challenge, referer)

@param String gt 极验验证码的gt参数

@param String challenge 极验验证码的challenge参数

@param String referer 当前极验验证码所在的网站

@return json对象 返回极验验证码识别后的结果。

此函数用来识别极验验证码,需要开发者分析出极验验证码的gtchallenge参数,然后调用此函数进行识别,识别成功后,开发者需要利用返回的结果,拼接出请求并发送,以完成整个验证过程。

返回的json对象结构如下:

{
"ret": 1,
"desc": "",
"challenge": "",
"validate": ""
}

ret是返回码,1表示成功;-1表示失败,需要重试;-2表示未知错误,一般也是需要重试。desc是返回结果的描述,一般在调用失败时查看失败原因。challengevalidate是调用成功时的结果,拼接请求完成验证需要这两个参数。

调用成功的返回示例:

{"ret":1,"gt":"a5b4aae119f37eb1e7ecab904943fd71","challenge":
"b4a3b41a69e87de93bf5a5bab6352383"}

调用失败的返回示例:

{"ret":-1,"desc":"Please Try Again As Forbidden 请重试行为异常"}

login

function login(url, username, password, enableProxy)

@param String url 网站登录页面的地址

@param String username 登录该网站用的用户名

@param String password 登录该网站用的密码

@param Boolean enableProxy 登录时是否需要使用代理IP,默认false,即不使用。

此函数尝试登录指定网站,登录之后cookie会自动保留下来。此函数可能会成功,可能会失败,建议调用之后,请求一个登录之后才能看到的信息,来检测是否登录成功。

configs.beforeCrawl = function(site) {
// 下面的代码尝试登录虎扑网
var url = "https://passport.hupu.com/pc/login";
var username = "shenjianshou";
var password = "123456789";
login(url, username, password, false);
// 登录后请求个人主页,
// 根据页面中是否包含特定内容来判断是否登录成功
var content = site.requestUrl("http://my.hupu.com/");
var matches = /rsid=(\d+)/.exec(content);
if (!matches) {
console.log("登录失败!");
return;
}
console.log("登录成功!");
};

msleep

function msleep(millisecond)

@param 整数 millisecond sleep的毫秒数

使当前节点/线程sleep指定时间。一般在使用site.requestUrl发请求的时候,为了避免两次请求太快导致反爬,需要在两次请求之间sleep一定时间。

parseDateTime

function parseDateTime(str)

@param String str 时间字符串,例如”5分钟前”、”刚刚”、”2017-11-11”等。

@return 整数 返回毫秒时间戳

此函数将时间字符串转换成毫秒时间戳,转换成秒时需要除以1000。

encodeURI

function encodeURI(str, charset)

@param String str 需要进行url编码的字符串

@param String charset 编码时使用的字符编码,常用的有UTF-8 GBK

@return String 返回编码后的字符串

因为JavaScript的这个内置函数在处理中文时有一些问题,所以平台直接覆盖了此函数。

encodeURIComponent

function encodeURIComponent(str, charset)

此函数完全等同于encodeURI

decodeURI

function decodeURI(str, charset)

@param String str 需要进行url解码的字符串

@param String charset 解码时使用的字符编码,常用的有UTF-8 GBK

@return String 返回url解码后的字符串

平台覆盖了原生JavaScript的对应函数。

decodeURIComponent

function decodeURIComponent(str, charset)

此函数完全等同于decodeURI

htmlEntityDecode

function htmlEntityDecode(str)

@param String str 需要进行html解码的字符串

@return String 返回html解码后的字符串

此函数进行html entity解码,如&amp;解码为&&lt解码为<&quot;解码为"

md5

function md5(str)

@param String str 需要进行md5加密的字符串

@return String 加密后的md5的hex字符串形式,32位小写。

此函数进行md5加密,返回加密后的结果,hex的字符串形式,32位小写。

base64Encode

function base64Encode(str)

@param String str 需要进行base64编码的字符串

@return String 编码后的base64字符串

此函数进行base64编码,是标准的base64编码实现。

base64Decode

function base64Decode(str, charset)

@param String str 待解码的base64字符串

@param String charset 解码时使用的字符编码,常用的有UTF-8 GBK

@return String 解码后的内容

此函数进行base64解码。

atob

function atob(str, charset)

此函数完全等同于base64Decode

btoa

function btoa(str)

此函数完全等同于base64Encode

RSAEncode

function RSAEncode(str, publicKey, charset)

@param String str 待加密的字符串

@param String publicKey 公钥

@param String charset 字符串编码,常用的有UTF-8 GBK

@return String 返回加密后的字符串

此函数进行RSA加密。

RSADecode

function RSADecode(str, privateKey, charset)

@param String str 待解密的字符串

@param String privateKey 私钥

@param String charset 字符串编码,常用的有UTF-8 GBK

@return String 返回解密后的字符串

此函数进行RSA解密。

deflate

function deflate(content, type)

@param String content 待解压的内容

@param String type 返回数据的类型,可选值为"string""base64"

@return String 解压后的内容,当type为”string”时,直接返回字符串形式,当type为”base64”时,返回base64编码后的结果。

此函数使用deflate算法对压缩的内容进行解压。

inflate

function inflate(content, type)

@param String content 待压缩的内容

@param String type 待压缩内容的格式,可选值为"string""base64",值为"string"时,直接进行压缩,值为"base64"时,会先进行base64解码,再进行压缩。

@return String 返回压缩后的内容

此函数使用deflate算法对内容进行压缩。