本节我将向大家介绍一下YayCrawler的核心-页面的抽取规则定义,这也是YayCrawler能够做到通用的主要原因之一。如果我要爬去不同的网站的数据,尽管他们的网站采用的开发技术不同、页面的结构不同,但是我只要针对不同的网站定义不同的抽取规则即可,不用再对每个网站专门开发一个爬虫。

首先让我来解释几个概念:

一、页面(Page)

这里说的页面不是指在浏览器上能直接看到的页面,而是指一个http请求发送后服务端返回的response中的内容。它大多数情况是一个html文档,也可能是一个Json字符串,甚至是自定义的字符串和二进制等。

二、区域(Region)

页面上的一个或多个感兴趣的代码片段,比如某些div,某个表格,包含某个class的dom元素,Json数据中的某个节点,甚至某一段字符串。区域是规则解析的单元,一个Page可以有多个Region,每个Region在执行规则解析后会产生两类数据:字段数据和子链接。字段数据会被持久化到数据库,子链接会发送给Master加入待执行队列。

上图中,我如果用css选择器选取class为list-con的元素会选择到多个div,我们认为这就是一个类型的区域,叫做区域1;如果我用css选择器选择id为page的元素会选择到分页控件所在的div,我们认为这是区域2。

对于区域1,我可以通过xpath或者正则表达式来抽取楼盘地址、申报公示价格区间等字段数据,我也可以抽取“户栋详情”这个链接加入到任务队列中。

对于区域2,我并不关心它的字段数据,我只关心下一页的链接是什么,因此我只要配置一个子链接规则把下一页的链接抽取出来即可。

三、解析规则

我们的解析是以区域(Region)为单位的(您可以把整个Page当成一个Region),前面说过一个Region解析完成后会产生两类数据:字段数据和子链接。因此我们框架中存在两种规则:字段规则和链接规则。字段规则描述的是如何从Region片段中抽取所需的字段数据;链接规则则描述的是如何从Region片段中抽取子链接。举例说明:

上图中我们针对基本信息这个区域设定了几个字段抽取规则,我们来看看测试结果:

规则的解析依赖于WebMagic的语法与实现,可以参考:http://webmagic.io/docs/zh/posts/ch4-basic-page-processor/selectable.html。关于上图中的自定义表达式的解析我们会在后续详细讲解,在页面上也有部分介绍:
我们来看看框架中与规则相关的实体模型图:
框架中我们使用Spring JPA来实现规则数据库的读写逻辑。

开源通用爬虫框架YayCrawler-页面的抽取规则定义的更多相关文章

  1. 开源通用爬虫框架YayCrawler-开篇

    各位好!从今天起,我将用几个篇幅的文字向大家介绍一下我的一个开源作品--YayCrawler,其在GitHub上的网址是:https://github.com/liushuishang/YayCraw ...

  2. 开源通用爬虫框架YayCrawler-运行与调试

    本节我将向大家介绍如何运行与调试YayCrawler.该框架是采用SpringBoot开发的,所以可以通过java –jar  xxxx.jar的方式运行,也可以部署在tomcat等容器中运行. 首先 ...

  3. 开源通用爬虫框架YayCrawler-框架的运行机制

    这一节我将向大家介绍一下YayCrawler的运行机制,首先允许我上一张图: 首先各个组件的启动顺序建议是Master.Worker.Admin,其实不按这个顺序也没关系,我们为了讲解方便假定是这个启 ...

  4. 爬虫框架YayCrawler

    爬虫框架YayCrawler 各位好!从今天起,我将用几个篇幅的文字向大家介绍一下我的一个开源作品——YayCrawler,其在GitHub上的网址是:https://github.com/liush ...

  5. 一个简单的开源PHP爬虫框架『Phpfetcher』

    这篇文章首发在吹水小镇:http://blog.reetsee.com/archives/366 要在手机或者电脑看到更好的图片或代码欢迎到博文原地址.也欢迎到博文原地址批评指正. 转载请注明: 吹水 ...

  6. 基于 Java 的开源网络爬虫框架 WebCollector

    原文:https://www.oschina.net/p/webcollector

  7. [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 为什么要造轮子 同学们可以去各大招聘网站查看一下爬虫工程师的要求,大多是招JA ...

  8. [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计

    [DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 五.如何做全站采集 为什么要造轮子 同学们可以去各大招聘网站查看一下爬虫工程师 ...

  9. Scrapy爬虫框架第一讲(Linux环境)

    1.What is Scrapy? 答:Scrapy是一个使用python语言(基于Twistec框架)编写的开源网络爬虫框架,其结构清晰.模块之间的耦合程度低,具有较强的扩张性,能满足各种需求.(前 ...

随机推荐

  1. 关于栈和队列的一点点小知识-----C++自带函数

    栈和队列我们可以用C++里自带的函数使用,就不必手写了 1.栈,需要开头文件 #include<stack>  定义一个栈s:stack<int> s; 具体操作: s.emp ...

  2. Android Canvas saveLayerAlpha使用

    Canvas.saveLayerAlpha(float left, float top, float right, float bottom, int alpha, int saveFlags): 本 ...

  3. linux 修改内核参数 如何生效?

    Linux 操作系统修改内核参数有3种方式: 修改 /etc/sysctl.conf 文件,加入配置选项,格式为 key = value ,修改保存后调用 sysctl -p 加载新配置使用 sysc ...

  4. SkylineGlobe MFC C++ 开发示例代码

    SkylineGlobe的SDK底层是跨平台的C++内核,面向不同平台封装原生的API,具有很高的执行效率, 下面是C++二次开发时的示例代码: #import "D:\Program Fi ...

  5. ESP8266开发综合篇(SDK开发-视频教程总揽)

    为了解决基础教程简单入门但不实用,项目方案非常实用但比较难的问题,开始推出8266开发综合篇 综合篇涉及到AT,LUA,SDK,LUA(sdk)开发,LUA和SDK开发会同步进行,后期再整理AT指令的 ...

  6. 九,ESP8266 判断是断电上电(强制硬件复位)之后运行的内部程序还是内部软件复位之后运行的程序(基于Lua脚本语言)

    现在我有一个需求,WIFI模块控制一个继电器,我要做的是如果内部程序跑乱了,造成了内部程序复位重启,那么控制继电器的状态不能改变 如果是设备断电了,然后又来电了,我需要的是继电器一定要是断开才好.不能 ...

  7. 9-51单片机ESP8266学习-AT指令(单片机采集温湿度数据通过8266发送给AndroidTCP客户端显示)

    http://www.cnblogs.com/yangfengwu/p/8798512.html 补充:今天答应了一个朋友写一下如果单片机发过的是字符串应该怎么解析,答应了今天写,哦哦哦是明天了,闲话 ...

  8. day89

    跨域问题 同源策略(Same origin policy) 是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上 ...

  9. Identity(五)

    本文摘自 ASP.NET MVC 随想录—— 使用ASP.NET Identity实现基于声明的授权,高级篇 在这篇文章中,我将继续ASP.NET Identity 之旅,这也是ASP.NET Ide ...

  10. Jquery UI 中的datepicker() ,获取日期后的回调函数onClose()

    <head> //引入相关的css/js <link rel="stylesheet" href="//code.jquery.com/ui/1.10. ...