# 内容解析器

# 基础使用

风铃虫会根据 内容解析规则自动构建出内容解析器,由内容解析器自动完成数据解析任务。

内容解析器由一个或多个内容提取器组成,内容提取器主要是负责根据内容解析规则从下载的网页内容中提取出所有符合要求的数据,内容解析器由一系列的内容提取器排列组合而成。

下面是一段内容解析规则的说明

 "content" : {
        //内容页url的规则,即只有完全匹配该规则的网页的内容才会被解析,多个规则用半角逗号隔开
        "extractUrl" : "https://www\\.xxxx\\.com\\.cn/.+\\.asp", 
        "contents" : [  // 爬虫内容提取项
            {
                "name" : "介绍",//内容提取项名字
                "filedName" : "intro",//内容提取项代码,必须为数字或字母,同一组内不能重复
                "descp" : "资源的简单介绍信息",//内容提取项描述
                "rules" : [ //提取项提取规则
                    {
                        "rule" : "XPATH", //提取器的类型,这里表示使用XPATH提取器
                        "param1" : "//p/text()",//XPATH提取表达式
                        "param2" : "",
                        "sort" : 1 //提取器的作用顺序,在同一组提取项提取规则里序号必须唯一
                    }, 
                    {
                        "rule" : "REPLACE",//提取器的类型,这里表示使用替换提取器
                        "param1" : "[@<yishui>@]", //替换提取器的第一个参数
                        "param2" : ".",  //替换提取器的第二个参数
                        "sort" : 2 //提取器的作用顺序,在同一组提取项提取规则里序号必须唯一
                    }
                ]
            }, 
            {
                "name" : "名字",//内容提取项名字
                "filedName" : "name",//内容提取项代码,必须为数字或字母,同一组内不能重复
                "descp" : "资源的名字",//内容提取项描述
                "rules" : [ //提取项提取规则
                    {
                        "rule" : "CSS",//提取器的类型,这里表示使用CSS提取器
                        "param1" : "div.title",//CSS提取器表达式
                        "param2" : "",
                        "sort" : 1 //提取器的作用顺序,在同一组提取项提取规则里序号必须唯一
                    }
                ]
            }, 
            {
                "name" : "资源类型",//内容提取项名字
                "filedName" : "scope",//内容提取项代码,必须为数字或字母,同一组内不能重复
                "descp" : "资源的类型,K12, HE, VE",//内容提取项描述
                "rules" : [ //提取项提取规则
                    {
                        "rule" : "CONSTANT",//提取器的类型,这里表示使用常量提取器
                        "param1" : "VE", //常量提取器参数,表示经过该提取器的输出数据始终 为VE
                        "param2" : "",
                        "sort" : 1 //提取器的作用顺序,在同一组提取项提取规则里序号必须唯一
                    }
                ]
            }, 
            {
                "name" : "学科",//内容提取项名字
                "filedName" : "subject",//内容提取项代码,必须为数字或字母,同一组内不能重复
                "descp" : "xxxx网站的学科,默认手动设置为 电子信息",//内容提取项描述
                "rules" : [ //提取项提取规则
                    {
                        "rule" : "TEXT",//提取器的类型,这里表示使用CSS文本提取器
                        "param1" : "p#type",//css选择器表达式
                        "param2" : "",
                        "sort" : 1 //提取器的作用顺序,在同一组提取项提取规则里序号必须唯一
                    }
                ]
            }, 
            {
                "name" : "来源",//内容提取项名字
                "filedName" : "origin",//内容提取项代码,必须为数字或字母,同一组内不能重复
                "descp" : "数据信息的来源,默认设置为 xxxx 在线教程",//内容提取项描述
                "rules" : [ //提取项提取规则
                    {
                        "rule" : "REGEX", //提取器的类型,这里表示使用正则提取器
                        "param1" : "[a-z]+", //正则表达式
                        "param2" : "",
                        "sort" : 1 //提取器的作用顺序,在同一组提取项提取规则里序号必须唯一
                    }
                ]
            }
        ]
    }

如上述示例所示,内容解析规则由一个或多个内容提取规则组成,风铃虫会自动根据内容提取规则生成内容提取器,由内容提取器完成具体的数据提取任务

内容提取器主要是根据配置参数从输入数据里提取出相对应的信息,然后将提取出来的信息作为输出参数输出。

风铃虫目前内置多款内容提取器,基本上已经能满足大多数场景的数据提取要求,后期可能会增加更多类型的内容提取器。

风铃虫内容解析器由一系列内容提取器组成,多个内容提取器间可以任意排列组合。

多个提取器组合时,前一个内容提取器的输出数据即为后一个内容提取器的输入数据,因此在多个内容提取器组合需要十分注意顺序。在多个内容提取器组合时,同一组内的内容提取器按照序号的大小从小到大依次执行。

注意

在使用内容解析器时,输出数据里有时候可能会出现 [@<yishui>@] 字符,这不是乱码,而是系统占位符,表示网页内容经过 内容提取器提取后提取到多组结果,此时用户可再次调用 内容提取器 继续对数据进行处理即可


# 高级使用

在某些情况下,使用系统提供的内容解析器无法提取出符合用户需求的数据,此时用户可以自定义 内容解析器 按照自己的规则提取出所对应的数据。

1 先创建一个自定义内容解析器

import com.yishuifengxiao.common.crawler.content.ContentExtract;
import com.yishuifengxiao.common.crawler.domain.entity.Page;
import com.yishuifengxiao.common.tool.exception.ServiceException;

import java.util.Map;

public class CustomContentExtract implements ContentExtract {
    @Override
    public void extract(Page page) throws ServiceException {
        //执行数据解析操作

        Map<String,Object> data= 解析出来的数据
         //存储解析出来的数据
        page.setResultItem(data);
    }
}

2 将自定义内容解析器配置到风铃虫

 Crawler crawler = .....
  
 //此步骤一定要在启动之前进行
 crawler.setContentExtract(new CustomContentExtract());

 crawler.start();

注意:在配置自定义内容解析器后,除了内容页url的规则依然有效外,风铃虫内置内容解析器也不会失效。




Last Updated: 1/7/2020, 10:34:40 PM