发明内容
本发明实施例提供一种分布式互联网数据采集方法及装置,用以提高针对特定站点数据的爬取效率,减少用户劳动强度,节省系统资源。
本发明实施例提供一种分布式互联网数据采集方法,包括:
获取采集任务;
基于所述采集任务,利用预设下载器下载采集任务对应的目标页面;
在所述目标页面,利用配置的爬取规则进行分层解析;以及
利用指定的线性通信模型获取采集任务中的数据源类型,并调用对应的数据库;
根据数据库的调用结果对分层解析的结果进行映射。
在一些实施例中,基于所述采集任务,利用预设下载器下载采集任务对应的目标页面包括:
根据采集平台传递的采集规则属性中的属性信息,利用预设下载器下载目标页面。
在一些实施例中,利用预设下载器下载采集任务对应的目标页面的过程中,所述分布式数据采集方法还包括采用如下方式对目标页面进行功能增强:
从目标页面获取多个列表,并搜索指定标签;
将具有同类data-tagpath的指定标签作为同一列表;
基于获取到的多个列表进行胀缩,并保留胀缩后具有规则的列表。
在一些实施例中,基于获取到的多个列表进行胀缩包括:
以目标标签为列表元素,将路径相近的标签并入同一列表下,以执行膨胀;
对膨胀后的列表,按照设定的数据量执行过滤,以执行紧缩。
在一些实施例中,在所述目标页面,利用配置的爬取规则进行分层解析包括:
为目标页面中的主页面,根据获取的采集任务规则json文件,从Json文件最外层开始解析;
执行字段采集步骤,通过page.getHtml().xpath获取字段值text()并执行page.putField(rule.getName(),node);
执行列表采集规则,通过List<Selectable> itemSelectableList=page.getHtml().xpath(ruleMatchConfig.getItemxpath()).nodes();获取列表下选择对象并进行遍历;
执行详情规则,通过page.getRequst获取当前页面的规则,并解析。
在一些实施例中,利用配置的爬取规则进行分层解析之后,所述所述分布式互联网数据采集方法还包括采用如下方式对目标页面进行去重:
根据taskid作为key,将目标页面的url插入到预设Redis有序集合,已通过预设Redis有序集合进行去重。
本发明还提出一种分布式互联网数据采集装置,包括处理器,其配置为:
获取采集任务;
基于所述采集任务,利用预设下载器下载采集任务对应的目标页面;
在所述目标页面,利用配置的爬取规则进行分层解析;以及
利用指定的线性通信模型获取采集任务中的数据源类型,并调用对应的数据库;
根据数据库的调用结果对分层解析的结果进行映射。
本发明还提出一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如前述的分布式数据采集方法的步骤。
本发明实施例提高了针对特定站点数据的爬取效率,有效减少了用户劳动强度,节省了系统资源。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
本发明实施例提供一种分布式互联网数据采集方法,如图1所示,包括如下步骤:
在步骤S101中,获取采集任务。具体的,本示例中的采集任务可以是客户端发起或者调度任务发起的一个采集任务。
在步骤S102中,基于所述采集任务,利用预设下载器下载采集任务对应的目标页面。在一些实施例中,基于所述采集任务,利用预设下载器下载采集任务对应的目标页面包括:根据采集平台传递的采集规则属性中的属性信息,利用预设下载器下载目标页面。具体的,可以根据采集平台传递的采集规则属性中User-agent,cookie,使用代理IP池,主网页等信息组装下载器下载任务主页面到内存page。
在步骤S103中,在所述目标页面,利用配置的爬取规则进行分层解析。
在步骤S104中,利用指定的线性通信模型获取采集任务中的数据源类型,并调用对应的数据库。
在步骤S105中,根据数据库的调用结果对分层解析的结果进行映射。任务监听当监听到当前采集任务完毕后,自动回调采集平台当前任务结束。
利用本申请的方法有效提高了针对特定站点数据的爬取效率,有效减少了用户劳动强度,节省了系统资源。
在一些实施例中,利用预设下载器下载采集任务对应的目标页面的过程中,所述分布式数据采集方法还包括采用如下方式对目标页面进行功能增强:
从目标页面获取多个列表,并搜索指定标签;
将具有同类data-tagpath的指定标签作为同一列表;
基于获取到的多个列表进行胀缩,并保留胀缩后具有规则的列表。
在一些实施例中,基于获取到的多个列表进行胀缩包括:
以目标标签为列表元素,将路径相近的标签并入同一列表下,以执行膨胀;
对膨胀后的列表,按照设定的数据量执行过滤,以执行紧缩。
在具体实施过程中,可以在程序界面设置相应的功能按键,本示例中点击【自动识别】,从而自动识别页面所有TABLE表单,并自动识别TABLE下面的TR以及TD并生成行记录和采集规则。并默认识别第一行为表头。
自动识别多场景逻辑:
1:在网页中列表是很常见的标签,主要分为有序标签、无序标签、列表嵌套、定义标签 有序标签:<ol><li></li><ol>
无序标签:<ul><li></li></ul>
列表嵌套:<ul><li><ul><li></li></ul></li></ul>、
<ul><li><ol><li></li></ol></li></ul>、
<ol><li><ul><li></li></ul></li></ol>、
<ol><li><ol><li></li></ol></li></ol>、
定义标签:<dl><dt></dt><dd></dd></dl>
2:获取 table 表格的列表集合:
获取table > thead >tr > td | table > tbody >tr > td | table > tr > td| table > tr > td|th tfoot
本示例中的自动识别算法列表页逻辑:
直接搜索指定标签li不论Ul,只要具有同类data-tagpath的li就是同一列表元素。
本示例中进一步判断目标页面的列表个数,满足:
a>当整个页面UL列表个数小于等于8,本示例中只识别辨别度高的,有规则的列表。
b>当整个页面UL列表个数大于8,执行过滤,则识别的列表行数不能少于3条,且不能大于50条记录,设置最大最小范围。
本示例中设计了先膨胀,再紧缩裁减,然后识别,并选择仍然规则的列表,具体的:
膨胀:以最终li标签为列表元素,找出标签路径类似的Li为同一个列表下。具体根据data-tagpath (忽略li标签 前后三层的标签序号)一致的。
紧缩:由于第一步膨胀可能会导致很多本不该属于 同一列表的被分组到一起,导致数据会被膨胀,因此需要进行数量删除,过滤掉数据量小于3且超过50行的列表,膨胀后数量都达不到3个,或者数量超过50行的数据没有抓取意义。
识别:经过上面2步处理后,剩下的列表就是期望的UL。
在一些实施例中,在所述目标页面,利用配置的爬取规则进行分层解析包括:
为目标页面中的主页面,根据获取的采集任务规则json文件,从Json文件最外层开始解析;
其中解析的场景包括:
1、执行字段采集步骤,通过page.getHtml().xpath获取字段值text()并执行page.putField(rule.getName(),node);
2、执行列表采集规则,通过List<Selectable> itemSelectableList=page.getHtml().xpath(ruleMatchConfig.getItemxpath()).nodes();获取列表下选择对象并进行遍历;
3、执行详情规则,通过page.getRequst获取当前页面的规则,并解析。
具体的,本示例中利用业务处理器,根据可视化配置存储的爬取规则JSON分层解析:
A、当前步骤为任务主页面时,根据传入的rule中的规则从Json文件最外层开始分析。
B、当前步骤为字段采集时,则通过page.getHtml().xpath 获取字段值text()并执行page.putField(rule.getName(), node)。
C、当前步骤为列表采集规则,则通过List<Selectable> itemSelectableList=page.getHtml().xpath(ruleMatchConfig.getItemxpath()).nodes();获取列表下选择对象并进行遍历:
1、当列表规则下嵌套了字段,则继续上一步操作。
2、当列表规则下嵌套了详情,则表示需要点击当前href采集详情页,则通过调用page.addTargetRequest(url);把详情页面url通过RedisQuenUniqPriorityScheduler放到redis队列等待采集。并调用page.addTargetRequest(request);讲详情页的子规则childrule传入到详情页page。
3、当列表规则下嵌套了列表,则重复当前步骤。
D、当前步骤为详情规则时,首先通过page.getRequst(“pagerule”)获取当前页面的规则,并按照规则进行解析。
在一些实施例中,利用配置的爬取规则进行分层解析之后,所述所述分布式互联网数据采集方法还包括采用如下方式对目标页面进行去重:
根据taskid作为key,将目标页面的url插入到预设Redis有序集合,已通过预设Redis有序集合进行去重。
具体的,本示例中,利用Scheduler来管理待抓取的URL,并执行去重。
Redis有序集合和集合一样,属于string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。Redis有序集合的成员是唯一的,而分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是0(1)。集合中最大的成员数为232-1(4294967295,每个集合可存储40多亿个成员)。本示例中具体的根据采集任务唯一taskid作为索引Key将爬取网页地址url插入到有序集合进行去重。
本申请实施例,由控制器、解析器、资源库组成。控制器是网络爬虫的中央控制器,主要是负责根据传过来的URL链接,分配一线程,然后启动线程调用爬虫爬取网页的过程。解析器是负责网络爬虫(从web中发现,下载以及存储内容)的主要部分,主要是下载网页,进行页面文本的处理,如过滤功能,抽取特殊HTML标签的功能,分析数据功能,将一些JS脚本标签、CSS代码内容、空格字符、HTML标签等内容处理掉,爬虫的基本工作是由解析器完成。资源库是用来存放网页中下载到的网页资源数据,根据数据源配置,可以存储到mysql\es或者其他数据库,并对其建立索引。利用本申请的方法能够大幅提高针对特定站点数据的爬取效率,减少用户劳动强度,节省系统资源,并拥有良好的可扩展性和伸缩性,适用于所有类型的互联网站点。
本发明还提出一种分布式互联网数据采集装置,包括处理器,其配置为:
获取采集任务;
基于所述采集任务,利用预设下载器下载采集任务对应的目标页面;
在所述目标页面,利用配置的爬取规则进行分层解析;以及
利用指定的线性通信模型获取采集任务中的数据源类型,并调用对应的数据库;
根据数据库的调用结果对分层解析的结果进行映射。
本发明还提出一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如前述的分布式数据采集方法的步骤。
本发明实施例提高了针对特定站点数据的爬取效率,有效减少了用户劳动强度,节省了系统资源。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端(可以是手机,计算机,服务器或者网络设备等)执行本发明各个实施例所述的方法。
上面结合附图对本发明的实施例进行了描述,但是本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式,这些均属于本发明的保护之内。