# 内容解析器
风铃虫会根据 内容解析规则 和 内容提取规则 自动构建出内容解析器,由内容解析器判断哪些页面是内容页,需要进行数据提取操作。
内容解析器由一个链接匹配器、一个内容匹配器以及一个或多个内容提取器组成,链接匹配器和内容匹配器共同决定哪些页面是内容页,需要从中提取出数据, 内容提取器主要是负责根据内容解析规则从下载的网页内容中提取出所有符合要求的数据,内容解析器由一系列的内容提取器排列组合而成。
# 内容页判断
在规则中,内容页url的规则和内容匹配规则共同决定了哪些页面是内容页,需要从哪些页面中提取出信息。
规则配置示例如下:
"content": {//内容解析规则
"contentPageRule": {//内容页地址规则
"expression": "匹配表达式",
"pattern": "链接匹配模式"
},
"pageRule": {//内容匹配规则
"caseSensitive": true,//是否大小写敏感
"fuzzy": true,//是否为模糊匹配
"mode": true,//匹配模式
"pattern": "内容匹配参数",
"target": "期待匹配值",
"type": "内容匹配类型"
}
}
在判断当前页面地址是否内容页地址规则时,使用到了路径匹配器。
关于匹配器请参见 匹配器
风铃虫主要是根据此规则定义判断内容页。
在进行内容页判断时,首先根据 内容页地址规则
初步判断该页面是否为内容页,如果不符合则不从该页面里提取数据。
当该页面的地址符合内容页地址规则
时,接下来根据 内容匹配规则
进一步判断该页面是否为内容页。若 内容匹配规则
为空,就说明该页面为内容页,需要从中提取数据,否则就需要根据 内容匹配规则
分情况进行讨论。
# 基础使用
下面是一段提取规则示例
"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 {
/**
* 从网页内容里解析出所有符合要求的数据
*
* @param contentRule 内容解析规则
* @param rules 内容提取规则
* @param page 网页对象
* @throws ServiceException 解析时遇到的异常
*/
@Override
public void extract(final ContentRule contentRule, final List<ExtractRule> rules, final Page page) throws ServiceException {
//执行数据解析操作
Map<String,Object> data= 解析出来的数据
//存储解析出来的数据
page.setData(data);
}
}
2 将自定义内容解析器配置到风铃虫
Crawler crawler = .....
//此步骤一定要在启动之前进行
crawler.setContentExtract(new CustomContentExtract());
crawler.start();
注意:在配置自定义内容解析器后,除了内容页url的规则依然有效外,风铃虫内置内容解析器也不会失效。