field

field定义一个从内容页中抽取数据的抽取项.

如果根据抽取规则没有从内容页中抽取到数据, field的值是null.

一个抽取项包含下面这些信息:

name

1). 给抽取项起个名字

2). 名字中不能包含.

String类型

在神箭手应用的代码中均可使用

通用栗子:

给抽取项起个名字叫question

var configs = {
// configs的其他成员
...
fields: [
{
name: "question",
selector: "XXX"
}
]
};

注意:

1. 如果代码中设置name: ""或代码中不包含name, 那么神箭手应用将无法正常运行.

alias

1). 给抽取项起个别名(建议用汉字)

2). 在神箭手控制台的爬取结果页面预览某条数据时, 可以看到每个抽取项的别名

3). 在发布导出爬取结果时, 不包含别名

String类型

在神箭手应用的代码中均可使用

通用栗子:

给抽取项起个别名叫问题

var configs = {
// configs的其他成员
...
fields: [
{
name: "question",
alias: "问题",
selector: "XXX"
}
]
};

selector

1). 定义抽取规则

2). 默认使用XPath, 如果使用其他抽取规则, 需指定selectorType

String类型

在神箭手应用的代码中均可使用

通用栗子:

使用XPath来抽取某问答网页的问题

var configs = {
// configs的其他成员
...
fields: [
{
name: "question",
selector: "//div[@id='content']/h1"
}
]
};

selectorType

1). 设置抽取规则的类型

2). 默认值是SelectorType.XPath, 还可选择SelectorType.JsonPathSelectorType.Regex

枚举类型

在神箭手应用的代码中均可使用

通用栗子1:

selector默认使用XPath

var configs = {
// configs的其他成员
...
fields: [
{
name: "question",
// 使用XPath抽取规则
selector: "//*[@id='zh-question-title']/h2"
}
]
};

通用栗子2:

selector使用JSONPath, 如果内容是JSON数据格式, 则使用JSONPath抽取数据比较方便

var configs = {
// configs的其他成员
...
fields: [
{
name: "content",
// 设置抽取规则的类型为JSONPath
selectorType: SelectorType.JsonPath,
// 使用JsonPath抽取规则
selector: "$.comment.content",
required: true
}
]
};

通用栗子3:

除了XPath和JsonPath之外, 神箭手还支持使用正则表达式来抽取数据, 如下所示:

支持JavaScript正则表达式的写法

var configs = {
// configs的其他成员
...
fields: [
{
name: "title",
// 设置抽取规则的类型为正则表达式
selectorType: SelectorType.Regex,
// 使用正则表达式抽取规则
// 写法一
selector: '<div\\sid=\\"page\\"><h1>[^\\/]+<\\/h1>'
// 写法二
selector: /<div\sid=\"page\"><h1>[^\/]+<\/h1>/
}
]
};

如果正则表达式中有捕获组, 则抽取第一个捕获组的数据, 否则, 抽取匹配到的整条数据, 如下所示:

var configs = {
// configs的其他成员
...
fields: [
{
name: "content",
// 设置抽取规则的类型为正则表达式
selectorType: SelectorType.Regex,
// 抽取出匹配该正则表达式中第一个捕获组的数据
// 写法一
selector: 'var\\s*ct\\s*=\\s*\\"(\\d+)\\";'
// 写法二
selector: /var\s*ct\s*=\s*\"(\d+)\";/
}
]
};

required

1). 设置抽取项的值是否不可为空

2). 默认值是false

3). 值设为true, 表示如果抽取项的值为空, 则该条爬取结果会被过滤掉, 不会存入数据库中

布尔类型

在神箭手应用的代码中均可使用

通用栗子:

var configs = {
// configs的其他成员
...
fields: [
{
name: "article_title",
selector: "XXX",
// 设置抽取项的值不可为空
required: true
}
]
};

repeated

1). 设置抽取项是否同时抽取多条数据

2). 默认值是false

3). 值设为true, 表示抽取项同时抽取多条数据, 抽取项的值是数组类型

布尔类型

如果抽取规则匹配到多条数据, 请将repeated值设为true, 否则, 只会抽取多条数据中的第一条

在神箭手应用的代码中均可使用

通用栗子:

var configs = {
// configs的其他成员
...
fields: [
{
name: "images",
alias: "图片集"
selector: "//img/@src",
// 设置"images"同时抽取多张图片
repeated: true
}
]
};

children

1). 设置抽取项的子抽取项

2). 子抽取项的定义仍然是一个fields结构, 即一个field对象的数组

3). 没错, 这是一个树形结构

数组类型

在神箭手应用的代码中均可使用

通用栗子:

爬取问答网页所有回答的内容作者

var configs = {
// configs的其他成员
...
fields: [
{
name: "title",
alias: "问题",
selector: "//title"
},
{
name: "answers",
alias: "回答",
selector: "//div[@id='answers']",
repeated: true,
// 设置两个子抽取项
children: [
{
name: "content",
alias: "内容",
selector: "//a[@id='detail']"
},
{
name: "author",
alias: "作者",
selector: "//span[@id='name']"
}
]
}
]
};

注意:

1. 如果代码中设置children: [""]children: [{}], 那么神箭手应用将无法正常运行;
2. 如果children使用XPath, 抽取规则必须以//开头.

sourceType

抽取项的数据来源并不仅限于当前内容页的网页内容, 通过设置sourceType, 不仅可以使抽取项从当前内容页的网页内容中抽取数据, 还可以从”异步请求返回的数据”或”内容页附加数据”中抽取数据

枚举类型

默认值是SourceType.Page, 还可选择两个值: SourceType.AttachedUrlSourceType.UrlContext

在神箭手应用的代码中均可使用

SourceType.Page

sourceType设置为SourceType.Page时, 表示从当前内容页的网页内容中抽取数据

在神箭手应用的代码中均可使用

通用栗子:

var configs = {
// configs的其他成员
...
fields: [
{
name: "date",
// 设置数据源类型为"Page"
sourceType: SourceType.Page,
selector: "//td[contains(@class,'time')]"
}
]
};

SourceType.AttachedUrl

选择SourceType.AttachedUrl后可以发起一个新的HTTP请求, 然后从HTTP请求返回的数据中抽取数据

attachedUrl

sourceType设置为SourceType.AttachedUrl时, 定义新请求的url

String类型

在神箭手应用的代码中均可使用

通用栗子:

使用attachedUrl爬取网页中使用异步请求返回的数据

var configs = {
// configs的其他成员
...
fields: [
{
name: "id",
// 设置数据源类型为"AttachedUrl"
sourceType: SourceType.AttachedUrl,
// "id"是从发送"attachedUrl"这个异步请求返回的数据中抽取的
attachedUrl: "https://www.demo.com/",
selector: "XXX"
}
]
};

attachedMethod

1). 设置attachedUrl的HTTP请求类型

2). 默认值是”GET”请求, 也支持”POST”等请求

String类型

attachedUrl搭配使用

在神箭手应用的代码中均可使用

通用栗子:

var configs = {
// configs的其他成员
...
fields: [
{
name: "replys",
sourceType: SourceType.AttachedUrl,
attachedUrl: "http://www.demo.com/",
// 设置HTTP请求类型为"GET"
attachedMethod: "GET",
selector: "XXX"
}
]
};

attachedParams

设置attachedUrl发送HTTP请求时需添加的参数

String类型

attachedUrl搭配使用

在神箭手应用的代码中均可使用

通用栗子:

attachedUrl添加参数, 并发送POST请求

var configs = {
// configs的其他成员
...
fields: [
{
name: "replys",
sourceType: SourceType.AttachedUrl,
attachedUrl: "http://www.demo.com/",
attachedMethod: "POST",
// 设置HTTP请求参数
attachedParams: "size=7&do=slfn",
selector: "XXX"
}
]
};

attachedHeaders

设置attachedUrl发送HTTP请求时需添加的Headers

JS对象

attachedUrl搭配使用

在神箭手应用的代码中均可使用

通用栗子:

attachedUrl添加RefererCookie

var configs = {
// configs的其他成员
...
fields: [
{
name: "replys",
sourceType: SourceType.AttachedUrl,
attachedUrl: "http://www.demo.com/",
attachedHeaders: {
"Referer": "http://www.shenjianshou.cn/",
"Cookie": "GF=1"
},
selector: "XXX"
}
]
};

SourceType.UrlContext

1). 当sourceType设置为SourceType.UrlContext时, 表示从内容页附加数据中抽取数据

2). 内容页附加数据, 可以是任意一段字符串, 例如, HTML代码. 一般用法是, 将列表页中的数据附加到内容页中, 以便在抽取内容页数据时, 可以从中抽取列表页中的数据. 点此查看”url附加数据”实例解析

在神箭手应用的代码中均可使用

采集爬虫栗子:

从列表页获取数据后附加到内容页中, 再通过抽取项来抽取数据

var configs = {
// configs中的其他成员
...
fields: [
{
name: "extra_data",
// 这里是从内容页附加数据中抽取数据
sourceType: SourceType.UrlContext,
// 可抽取到内容页附加数据的XPath
selector: "//span[contains(@class,'extra-data')]",
}
]
};
configs.onProcessHelperPage = function(page, content, site) {
// 从列表页获取数据赋值给"extraData"
var extraData = extract(page.raw, "//div[@id='extra-data']");
var options = {
method: "GET",
// 定义内容页附加数据
contextData: extraData
};
// 将带"options"的内容页添加到待爬队列中
site.addUrl("http://www.demo.com", options);
return true;
};

点此查看“options”详解

transient

1). 设置抽取项是否是临时的(临时的抽取项不会保存到爬取结果中)

2). 默认值是false

3). 值设为true, 表示该抽取项是临时变量, 且不会保存到数据库中, 通常与attachedUrl搭配使用, 抽取项的值可以作为attachedUrl的值或值的一部分

4). 值设为true, 在afterExtractPage回调函数中仍然可以使用此抽取项的值, 回调结束之后, 该抽取项会从爬取结果中剔除

布尔类型

在神箭手应用的代码中均可使用

采集爬虫栗子:

var configs = {
// configs的其他成员
...
fields: [
{
name: "bid",
selector: "XXX",
// 设置"bid"抽取项为临时变量, 不会保存到数据库中
transient: true
},
{
name: "answer",
sourceType: SourceType.AttachedUrl,
// "bid"抽取项的值作为"attachedUrl"值的一部分
attachedUrl: "http://www.demo.com/get?bid={bid}"
selector: "XXX"
}
]
};

primaryKey

1). 设置是否将抽取项作为去重字段

2). 默认值是false

3). 神箭手系统会将primaryKey值为true的所有抽取项的值处理成一个key

4). key相同的爬取结果神箭手会自动去重

5). children设置primaryKey无效, 但对于只爬取列表页并将其每条数据都作为一个爬取结果的神箭手应用, children设置primaryKey有效, 点此查看详情

6). primaryKeytransient的值都设为true时, primaryKey无效

布尔类型

在采集爬虫代码中可使用

采集爬虫栗子:

var configs = {
// configs中的其他成员
...
fields: [
{
name: "title",
selector: "XXX",
// 设置将该抽取项作为去重字段之一
primaryKey: true
},
{
name: "content",
selector: "XXX",
// 设置将该抽取项作为去重字段之一
primaryKey: true
},
{
name: "date",
selector: "XXX"
}
]
};

type

1). 设置抽取项中每条抽取结果的数据类型

2). 默认值是string类型

3). 在神箭手控制台预览爬取结果时, 会优先根据设置的数据类型优化显示样式

4). 目前支持9种数据类型: int, float, image, timestamp, url, string, html, jsonbool

枚举类型

如果数据类型转换失败, 则仍然使用string类型

在采集爬虫代码中可使用

采集爬虫栗子:

var configs = {
// configs中的其他成员
...
fields: [
{
name: "image_url",
selector: "XXX",
// 该抽取项的抽取结果是"image"类型
type: "image"
}
]
};