爬虫技术(04)神箭手爬虫field的属性

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

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

(1) name

1). 给抽取项起个名字
2). 名字中不能包含.
**String类型
在神箭手应用的代码中均可使用**

通用栗子:

给抽取项起个名字叫question

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

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

(2)alias

1). 给抽取项起个别名(建议用汉字).
2). 在神箭手控制台的爬取结果页面预览某条数据时, 可以看到每个抽取项的别名。
3). 在发布和导出爬取结果时, 不包含别名。
**String类型
在神箭手应用的代码中均可使用**

通用栗子:

给抽取项起个别名叫问题

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

(3)selector

1). 定义抽取规则.
2). 默认使用XPath, 如果使用其他抽取规则, 需指定selectorType。
**String类型
在神箭手应用的代码中均可使用**

通用栗子:

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

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

(4)selectorType

1). 设置抽取规则的类型.
2). 默认值是SelectorType.XPath, 还可选择SelectorType.JsonPath或SelectorType.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+)\";/
        }
    ]
};

(5)required

1). 设置抽取项的值是否不可为空.
2). 默认值是false。
3). 值设为true, 表示如果抽取项的值为空, 则该条爬取结果会被过滤掉, 不会存入数据库中。
**布尔类型
在神箭手应用的代码中均可使用**

通用栗子:

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

(6)repeated

1). 设置抽取项是否同时抽取多条数据
2). 默认值是false
3). 值设为true, 表示抽取项同时抽取多条数据, 抽取项的值是数组类型
**布尔类型
如果抽取规则匹配到多条数据, 请将repeated值设为true, 否则, 只会抽取多条数据中的第一条.
在神箭手应用的代码中均可使用。**

通用栗子:

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

(7) 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, 抽取规则必须以//开头.**

(8)sourceType

抽取项的数据来源并不仅限于当前内容页的网页内容, 通过设置sourceType, 不仅可以使抽取项从当前内容页的网页内容中抽取数据, 还可以从”异步请求返回的数据”或”内容页附加数据”中抽取数据.
**枚举类型
默认值是SourceType.Page, 还可选择两个值: SourceType.AttachedUrl和SourceType.UrlContext。
在神箭手应用的代码中均可使用。**

(9)SourceType.Page

当sourceType设置为SourceType.Page时, 表示从当前内容页的网页内容中抽取数据
在神箭手应用的代码中均可使用.

通用栗子:

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

(10)SourceType.AttachedUrl

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

(11)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"
        }
    ]
};

(12)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"
        }
    ]
};

(13)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"
        }
    ]
};

(14)attachedHeaders

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

与attachedUrl搭配使用

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

通用栗子:

给attachedUrl添加Referer和Cookie

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"
        }
    ]
};

(15)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;
};

(15)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"
        }
    ]
};

(16)primaryKey

1). 设置是否将抽取项作为去重字段
2). 默认值是false
3). 神箭手系统会将primaryKey值为true的所有抽取项的值处理成一个key
4). key相同的爬取结果神箭手会自动去重
5). children设置primaryKey无效, 但对于只爬取列表页并将其每条数据都作为一个爬取结果的神箭手应用, children设置primaryKey有效, 点此查看详情
6). primaryKey与transient的值都设为true时, primaryKey无效
**布尔类型
在采集爬虫代码中可使用**

采集爬虫栗子:

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

(17)type

1). 设置抽取项中每条抽取结果的数据类型
2). 默认值是string类型
3). 在神箭手控制台预览爬取结果时, 会优先根据设置的数据类型优化显示样式
4). 目前支持9种数据类型: int, float, image, date, url, string, html, json和bool
**枚举类型
如果数据类型转换失败, 则仍然使用string类型
在采集爬虫代码中可使用**

采集爬虫栗子:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术闲聊DD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值