爬虫技术(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",// 設置抽取規則的類型為JSONPathselectorType: 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,// 可抽取到內容頁附加數據的XPathselector: "//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"}] };總結
以上是生活随笔為你收集整理的爬虫技术(04)神箭手爬虫field的属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: body加背景图片没反应_css设置背景
- 下一篇: 【C语言蓝桥杯每日一题】—— 单词分析