configs详解——之field

field定义一个抽取项, 一个field可以定义下面这些东西

name

给此项数据起个变量名变量名中不能包含.如果抓取到的数据想要以文章或者问答的形式发布到网站(WeCenter,WordPress, Discuz!等), field的命名请参考两个完整demo中的命名, 否则无法发布成功

String类型 不能为空

举个栗子:

field起了个名字叫content

  1. array(
  2. 'name' => "content",
  3. 'selector' => "//*[@id='single-next-link']"
  4. )

selector

定义抽取规则, 默认使用xpath如果使用其他类型的, 需要指定selector_type

String类型 不能为空

举个栗子:使用xpath来抽取糗事百科的笑话内容,selector的值就是内容的xpath

  1. array(
  2. 'name' => "content",
  3. 'selector' => "//*[@id='single-next-link']"
  4. )

selector_type

抽取规则的类型

目前可用xpath, jsonpath, regex默认xpath

枚举类型

栗子1:selector默认使用xpath

  1. array(
  2. 'name' => "content",
  3. 'selector' => "//*[@id='single-next-link']" // xpath抽取规则
  4. )

栗子2:使用正则表达式来抽取数据

  1. array(
  2. 'name' => "content",
  3. 'selector_type' => 'regex',
  4. 'selector' => '#<div\sclass="content">([^/]+)</div>#i' // regex抽取规则
  5. )

required

定义该field的值是否必须, 默认false赋值为true的话, 如果该field没有抽取到内容, 该field对应的整条数据都将被丢弃

布尔类型

举个栗子:

  1. array(
  2. 'name' => "content",
  3. 'selector' => "//*[@id='single-next-link']",
  4. 'required' => true
  5. )

repeated

定义该field抽取到的内容是否是有多项, 默认false赋值为true的话, 无论该field是否真的是有多项, 抽取到的结果都是数组结构

布尔类型

举个栗子:爬取的网页中包含多条评论,所以抽取评论的时候要将repeated赋值为true

  1. array(
  2. 'name' => "comments",
  3. 'selector' => "//*[@id='zh-single-question-page']//a[contains(@class,'zm-item-tag')]",
  4. 'repeated' => true
  5. )

children

为此field定义子项子项的定义仍然是一个fields数组没错, 这是一个树形结构

数组类型

举个栗子:抓取糗事百科的评论,每个评论爬取了内容,点赞数

  1. array(
  2. 'name' => "article_comments",
  3. 'selector' => "//div[contains(@class,'comments-wrap')]",
  4. 'children' => array(
  5. array(
  6. 'name' => "replay",
  7. 'selector' => "//div[contains(@class,'replay')]",
  8. 'repeated' => true,
  9. ),
  10. array(
  11. 'name' => "report",
  12. 'selector' => "//div[contains(@class,'report')]",
  13. 'repeated' => true,
  14. )
  15. )
  16. )

source_type

该field的数据源, 默认从当前的网页中抽取数据选择attached_url可以发起一个新的请求, 然后从请求返回的数据中抽取选择url_context可以从当前网页的url附加数据(点此查看“url附加数据”实例解析)中抽取

枚举类型

attached_url

当source_type设置为attached_url时, 定义新请求的url

String类型

举个栗子:当爬取的网页中某些内容需要异步加载请求时,就需要使用attached_url,比如,抓取知乎回答中的评论部分,就是通过AJAX异步请求的数据

  1. array(
  2. 'name' => "comment_id",
  3. 'selector' => "//div/@data-aid",
  4. ),
  5. array(
  6. 'name' => "comments",
  7. 'source_type' => 'attached_url',
  8. // "comments"是从发送"attached_url"这个异步请求返回的数据中抽取的
  9. // "attachedUrl"支持引用上下文中的抓取到的"field", 这里就引用了上面抓取的"comment_id"
  10. 'attached_url' => "https://www.zhihu.com/r/answers/{comment_id}/comments",
  11. 'selector_type' => 'jsonpath'
  12. 'selector' => "$.data",
  13. 'repeated => true,
  14. 'children' => array(
  15. ...
  16. )
  17. }