一种爬虫实现方法及装置与流程

文档序号:13590445阅读:157来源:国知局

本发明涉及计算机技术领域,特别涉及一种爬虫实现方法及装置。



背景技术:

爬虫系统是一种按照一定规则,抓取网络信息的程序或脚本,其一般包括多个组成部分,例如页面下载、链接提取和内容抽取等,随着爬取要求的提高,爬虫系统的规模以及复杂度也在不断上升。

目前,爬虫系统在工作时,主要通过统一的控制节点对各个组成部分进行调度:将各个组成部分以分布式组件方式进行部署,然后设置控制节点,并使其与各个组件建立连接,在连接状态下采集各个组件的工作参数,并根据采集的工作参数完成各个组件的任务调度。

由于控制节点需与各个组件建立长连接关系,才能对组件进行调度,当组件规模较大时,长连接占用的资源也不断增加,这降低了爬虫系统的爬取速度,从而导致爬虫系统的工作效率较低。



技术实现要素:

本发明实施例提供了一种爬虫实现方法及装置,能提高爬虫系统的工作效率。

第一方面,本发明实施例提供了一种爬虫实现方法,包括:获取至少一个组件分别对应的状态参数;

还包括:获取爬取指令,并根据所述爬取指令,生成至少一个爬取事件;

根据获取的所述状态参数,确定与所述至少一个爬取事件对应的至少一个目标组件;

将所述至少一个爬取事件发送给预先设置的事件通道,利用所述事件通道将各个所述爬取事件分别发送给对应的所述目标组件,以使所述目标组件执行所述爬取事件。

优选地,

所述将所述至少一个爬取事件发送给预先设置的事件通道,利用所述事件通道将各个所述爬取事件分别发送给对应的所述目标组件,以使所述目标组件执行所述爬取事件,包括:

针对所述事件通道中的每一个所述爬取事件,均执行:

a1:将所述爬取事件发送给对应的所述目标组件;

a2:接收所述目标组件发送的执行结果,根据所述执行结果,确定所述目标组件是否成功执行所述爬取事件,如果是,执行a3,否则执行a4;

a3:从所述事件通道中移除所述爬取事件;

a4:确定所述爬取事件的执行次数,并确定所述执行次数是否小于预设的次数阈值,如果是,则执行a1,否则执行a3。

优选地,

所述根据获取的所述状态参数,确定与所述至少一个爬取事件对应的至少一个目标组件,包括:

根据每个所述组件的状态参数,确定每个所述组件的工作状态;

确定所述工作状态是否与所述组件对应的预设标准工作状态相符,如果是,将所述组件对应的工作状态进行传播;

从传播的所述工作状态对应的至少一个组件中,确定与所述至少一个爬取事件对应的至少一个目标组件。

优选地,

所述获取至少一个组件分别对应的状态参数,包括:

接收所述至少一个组件分别对应的注册信息;

根据所述注册信息,对所述至少一个组件进行注册;

根据预设的心跳周期,获取注册后的所述至少一个组件的状态参数。

优选地,

在所述根据所述注册信息,对所述至少一个组件进行注册之后,进一步包括:

构建注册后的每一个所述的组件对应的镜像组件;

所述获取注册后的所述至少一个组件的状态参数,包括:

获取至少一个所述镜像组件的状态参数。

优选地,

在所述以使所述目标组件执行所述爬取事件之后,进一步包括:

获取所述目标组件根据所述爬取事件采集的爬取信息;

将所述爬取信息存储至预先设置的统一存储结构;其中,所述统一存储结构根据hbase存储系统和redis存储系统组合生成。

第二方面,本发明实施例提供了一种爬虫实现装置,包括:参数获取单元、事件生成单元、确定单元和执行单元;其中,

所述参数获取单元,用于获取至少一个组件分别对应的状态参数;

所述事件生成单元,用于获取爬取指令,并根据所述爬取指令,生成至少一个爬取事件;

所述确定单元,用于根据获取的所述状态参数,确定与所述至少一个爬取事件对应的至少一个目标组件;

所述执行单元,用于将所述至少一个爬取事件发送给预先设置的事件通道,利用所述事件通道将各个所述爬取事件分别发送给对应的所述目标组件,以使所述目标组件执行所述爬取事件。

优选地,

所述执行单元包括发送子单元、结果确定子单元、移除子单元和次数确定子单元;其中,

所述发送子单元,用于针对所述事件通道中的每一个所述爬取事件,均执行:将所述爬取事件发送给对应的所述目标组件;

所述结果确定子单元,用于接收所述目标组件发送的执行结果,根据所述执行结果,确定所述目标组件是否成功执行所述爬取事件,如果是,触发所述移除子单元,否则触发所述次数确定子单元;

所述移除子单元,用于从所述事件通道中移除所述爬取事件;

所述次数确定子单元,用于确定所述爬取事件的执行次数,并确定所述执行次数是否小于预设的次数阈值,如果是,则触发所述发送子单元,否则触发所述移除子单元。

优选地,

所述确定单元,用于根据每个所述组件的状态参数,确定每个所述组件的工作状态;确定所述工作状态是否与所述组件对应的预设标准工作状态相符,如果是,将所述组件对应的工作状态进行传播;从传播的所述工作状态对应的至少一个组件中,确定与所述至少一个爬取事件对应的至少一个目标组件。

优选地,

所述参数获取单元,用于接收所述至少一个组件分别对应的注册信息,并根据所述注册信息,对所述至少一个组件进行注册;根据预设的心跳周期,获取注册后的所述至少一个组件的状态参数。

优选地,

进一步包括:存储单元;其中,

所述存储单元,用于获取所述目标组件根据所述爬取事件采集的爬取信息,并将所述爬取信息存储至预先设置的统一存储结构;其中,所述统一存储结构根据hbase存储系统和redis存储系统组合生成。

本发明实施例提供了一种爬虫实现方法及装置,在获取到爬取指令之后,生成爬取指令对应的爬取事件,然后通过预先设置的事件通道,将生成的爬取事件发送给对应的目标组件,以使目标组件执行爬取事件。在此过程中,通过事件通道将爬取事件发送给对应的目标组件,无需通过控制节点与各个组件的长连接关系,完成控制节点与各个组件之间的交互,从而减少了爬虫系统占用的资源,由此提高了爬虫系统的工作效率。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是本发明一个实施例提供的一种爬虫实现方法的流程图;

图2是本发明另一个实施例提供的一种爬虫实现方法的流程图;

图3是本发明一个实施例提供的一种爬虫实现装置的结构示意图;

图4是本发明另一个实施例提供的一种爬虫实现装置的结构示意图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例,基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。

如图1所示,本发明实施例提供了一种爬虫实现方法,该方法可以包括以下步骤:

步骤101:获取至少一个组件分别对应的状态参数;

步骤102:获取爬取指令,并根据所述爬取指令,生成至少一个爬取事件;

步骤103:根据获取的所述状态参数,确定与所述至少一个爬取事件对应的至少一个目标组件;

步骤104:将所述至少一个爬取事件发送给预先设置的事件通道,利用所述事件通道将各个所述爬取事件分别发送给对应的所述目标组件,以使所述目标组件执行所述爬取事件。

上述实施例中,在获取到爬取指令之后,生成爬取指令对应的爬取事件,然后通过预先设置的事件通道,将生成的爬取事件发送给对应的目标组件,以使目标组件执行爬取事件。在此过程中,通过事件通道将爬取事件发送给对应的目标组件,无需通过控制节点与各个组件的长连接关系,完成控制节点与各个组件之间的交互,从而减少了爬虫系统占用的资源,由此提高了爬虫系统的工作效率。并且,控制节点与各个组件之间可通过事件通道进行调度和命令的交互,从而可解除控制节点与各个组件的通信复杂度与通信瓶颈。

本发明一个实施例中,步骤104的具体实施方式,可以包括:

针对所述事件通道中的每一个所述爬取事件,均执行:

a1:将所述爬取事件发送给对应的所述目标组件;

a2:接收所述目标组件发送的执行结果,根据所述执行结果,确定所述目标组件是否成功执行所述爬取事件,如果是,执行a3,否则执行a4;

a3:从所述事件通道中移除所述爬取事件;

a4:确定所述爬取事件的执行次数,并确定所述执行次数是否小于预设的次数阈值,如果是,则执行a1,否则执行a3。

在这里,事件通道可以包括多个队列,例如等待队列、执行队列和失败队列等,将爬取事件发送给事件通道时,即将爬取事件发送到等待队列。将各个爬取事件发送到事件通道之后,可利用eventqueue封装事件通道对外提供事件访问的接口,目标组件可通过eventqueue的next()方法从等待队列中获取爬取事件,同时,被获取的爬取事件被放至执行队列中。当目标组件执行爬取事件之后,可通过eventqueue的success()或fail()方法通知爬取事件执行结果,通过success()方法通知时,即说明执行成功,反之,通过fail()方法通知时,即说明执行失败。当爬取事件执行成功时,即可从执行队列中移除该爬取事件,反之,将该爬取事件放回等待队列中,等待目标组件的下次提取,并记录该爬取事件的执行失败次数,当失败次数超过预设的次数阈值时,将其放入失败队列。可以理解的是,由于爬取事件在执行后才能确定是否失败,并且执行成功后即被移除,因此爬取事件的失败次数与爬取事件的执行次数相等。

另外,还可在事件通道中设置备份队列,利用备份队列存储一定时长内生成的爬取事件,例如,存储24h内生成的爬取事件,每小时分别对应一个事件队列,用于事件回放和故障恢复等容错及排障措施。

本发明一个实施例中,步骤103的具体实施方式,可以包括:

根据每个所述组件的状态参数,确定每个所述组件的工作状态;

确定所述工作状态是否与所述组件对应的预设标准工作状态相符,如果是,将所述组件对应的工作状态进行传播;

从传播的所述工作状态对应的至少一个组件中,确定与所述至少一个爬取事件对应的至少一个目标组件。

在这里,在获取到组件的状态参数后,根据状态参数可确定组件的工作状态,当组件的工作状态符合预设的标准工作状态时,说明组件工作状态正常,可以进行调用,此时将该组件对应的工作状态进行传播,便于组件的调用。而控制节点在调用组件时,也会从工作状态正常的组件中,即从工作状态被传播的组件中,确定目标组件,由此有利于爬虫系统进行数据的爬取,从而进一步提高爬虫系统的工作效率。

另外,为了方便组件的调用,各个组件可通过服务机制进行调用,提供服务的组件配置有componentservice接口,并通过组件注册机制将组件注册为服务。其中,服务的调用协议可以采用http协议、二进制协议(avro和protobuf等),同时,服务机制还可提供服务负载均衡、服务鉴权、服务流控(限流、熔断和服务降级)等通用的服务治理能力。

本发明一个实施例中,步骤101的具体实施方式,可以包括:

接收所述至少一个组件分别对应的注册信息;

根据所述注册信息,对所述至少一个组件进行注册;

根据预设的心跳周期,获取注册后的所述至少一个组件的状态参数。

在这里,各个组件遵循统一的接口规范,例如,将component作为组件的最顶层接口,componentdo可提供组件的基本注册信息。在组件启动过程中,componentdo可采集各个组件的注册信息,并将其进行存储,这些注册信息可包括:组件id、组件类型、组件编码、组件所在ip、组件端口号、组件标签和组件版本号等。然后,component接口可根据componentdo采集到的注册信息,到注册中心对各个组件进行注册。当需要停止组件时,component接口需到注册中心注销组件的注册信息,以实现组件的停止。

在组件注册后,通过周期性的心跳将组件状态参数同步到注册中心,例如组件标识信息和组件状态信息等,以使注册中心获取到各个组件的状态参数。综上,通过统一的注册中心对各个组件进行注册,并统一采集各个组件的工作参数,对外提供一致性的访问接口,实现了组件的无状态化,无需控制节点在调取各个组件时,临时采集各个组件的工作状态,从而为各个组件的故障处理和负载均衡等各种状态驱动行为奠定了基础,并有利于为控制节点的主备用切换以及负载均衡提供支持。

本发明一个实施例中,在所述根据所述注册信息,对所述至少一个组件进行注册之后,进一步包括:

构建注册后的每一个所述的组件对应的镜像组件;

所述获取注册后的所述至少一个组件的状态参数,包括:

获取至少一个所述镜像组件的状态参数。

在这里,注册后的组件均为符合组件开发规范的组件,使用docker容器为注册后的组件构建镜像组件,并获取镜像组件的状态参数,因此确定出的目标组件也为对应的镜像组件。由此,通过组件容器化屏蔽了组件复杂的运行环境,极大地减轻了组件开发、测试、环境部署和同步的工作量,同时,通过容器框架的编排,提升了组件的健壮性。

本发明一个实施例中,在步骤104之后,可以进一步包括:

获取所述目标组件根据所述爬取事件采集的爬取信息;

将所述爬取信息存储至预先设置的统一存储结构;其中,所述统一存储结构根据hbase存储系统和redis存储系统组合生成。

现有技术中,出于下载、链接提取和结构化存储等不同处理过程的需要,底层的存储引擎通常会选择不同实现,比如url存储库使用redis存储系统,页面存储库使用文件系统,结构化存储库使用关系型数据库等,使得存储结构复杂,从而增加爬虫系统的整体复杂度。

在这里,通过hbase存储系统和redis存储系统构建统一的存储结构,其中,hbase存储系统负责存储url和网页等结构化数据,redis存储系统作为网页下载、链接提取和网页结构化的调度队列,以及配置信息和规则信息等的存储系统,由此实现统一的持久化存储,在降低爬虫系统的整体复杂度的同时,简化了组件的处理传输流程。

如图2所示,本发明一个实施例提供了一种爬虫实现方法,该方法可以包括以下步骤:

步骤201:接收所述至少一个组件分别对应的注册信息,并根据所述注册信息,对所述至少一个组件进行注册。

在这里,各个组件遵循统一的接口规范,例如,将component作为组件的最顶层接口,componentdo可提供组件的基本注册信息。在组件启动过程中,componentdo可采集各个组件的注册信息,并将其进行存储,这些注册信息可包括:组件id、组件类型、组件编码、组件所在ip、组件端口号、组件标签和组件版本号等,然后,component接口可根据componentdo采集到的注册信息,到注册中心对各个组件进行注册。

步骤202:根据预设的心跳周期,获取注册后的所述至少一个组件的状态参数。

在组件注册后,通过周期性的心跳将组件状态参数同步到注册中心,例如组件标识信息和组件状态信息等,以使注册中心获取到各个组件的状态参数。

步骤203:根据每个所述组件的状态参数,确定每个所述组件的工作状态,当所述工作状态与所述组件对应的预设标准工作状态相符时,将所述组件对应的工作状态进行传播。

在获取到组件的状态参数后,根据状态参数可确定组件的工作状态,当组件的工作状态符合预设的标准工作状态时,说明组件工作状态正常,可以进行调用,此时将该组件对应的工作状态进行传播,便于组件的调用。

步骤204:获取爬取指令,并根据所述爬取指令,生成至少一个爬取事件。

例如,获取的爬取指令为浏览器采集,并且爬取指令中说明是针对3个浏览器进行采集,则可根据爬取指令,针对每个浏览器生成一个爬取事件。

步骤205:从传播的所述工作状态对应的至少一个组件中,确定与所述至少一个爬取事件对应的至少一个目标组件。

在调用组件时,从工作状态正常的组件中,从工作状态被传播的组件中,确定目标组件,由此有利于爬虫系统进行数据的爬取。

步骤206:将所述至少一个爬取事件发送给预先设置的事件通道,利用所述事件通道将各个所述爬取事件分别发送给对应的所述目标组件,并接收所述目标组件发送的执行结果。

在这里,调度组件会通过组件注册中心查找所有具备“浏览器采集”特性的下载组件,并为之产生“启动下载任务”的事件,通过事件通道传递给这些浏览器下载组件去处理,浏览器下载组件收到事件后向url管理服务索取该任务的待下载url进行下载。

步骤207:根据所述执行结果,判断所述目标组件是否成功执行所述爬取事件,如果是,执行步骤208,否则执行步骤209;

步骤208:从所述事件通道中移除所述爬取事件,并结束当前流程。

步骤209:确定所述爬取事件的执行次数;

步骤210:判断所述执行次数是否小于预设的次数阈值,如果是,则执行步骤206,否则执行步骤208。

在这里,事件通道可以包括多个队列,例如等待队列、执行队列和失败队列等,将爬取事件发送给事件通道时,即将爬取事件发送到等待队列。将各个爬取事件发送到事件通道之后,可利用eventqueue封装事件通道对外提供事件访问的接口,目标组件可通过eventqueue的next()方法从等待队列中获取爬取事件,同时,被获取的爬取事件被放至执行队列中。当目标组件执行爬取事件之后,可通过eventqueue的success()或fail()方法通知爬取事件执行结果,通过success()方法通知时,即说明执行成功,反之,通过fail()方法通知时,即说明执行失败。当爬取事件执行成功时,即可从执行队列中移除该爬取事件,反之,将该爬取事件放回等待队列中,等待目标组件的下次提取,并记录该爬取事件的执行失败次数,当失败次数超过预设的次数阈值时,将其放入失败队列。

如图3所示,本发明实施例提供了一种爬虫实现装置,包括:参数获取单元301、事件生成单元302、确定单元303和执行单元304;其中,

所述参数获取单元301,用于获取至少一个组件分别对应的状态参数;

所述事件生成单元302,用于获取爬取指令,并根据所述爬取指令,生成至少一个爬取事件;

所述确定单元303,用于根据获取的所述状态参数,确定与所述至少一个爬取事件对应的至少一个目标组件;

所述执行单元304,用于将所述至少一个爬取事件发送给预先设置的事件通道,利用所述事件通道将各个所述爬取事件分别发送给对应的所述目标组件,以使所述目标组件执行所述爬取事件。

如图4所示,本发明一个实施例中,所述执行单元304包括:发送子单元3041、结果确定子单元3042、移除子单元3043和次数确定子单元3043;其中,

所述发送子单元3041,用于针对所述事件通道中的每一个所述爬取事件,均执行:将所述爬取事件发送给对应的所述目标组件;

所述结果确定子单元3042,用于接收所述目标组件发送的执行结果,根据所述执行结果,确定所述目标组件是否成功执行所述爬取事件,如果是,触发所述移除子单元3043,否则触发所述次数确定子单元3044;

所述移除子单元3043,用于从所述事件通道中移除所述爬取事件;

所述次数确定子单元3044,用于确定所述爬取事件的执行次数,并确定所述执行次数是否小于预设的次数阈值,如果是,则触发所述发送子单元3041,否则触发所述移除子单元3043。

本发明一个实施例中,所述确定单元303,用于根据每个所述组件的状态参数,确定每个所述组件的工作状态;确定所述工作状态是否与所述组件对应的预设标准工作状态相符,如果是,将所述组件对应的工作状态进行传播;从传播的所述工作状态对应的至少一个组件中,确定与所述至少一个爬取事件对应的至少一个目标组件。

本发明一个实施例中,所述参数获取单元301,用于接收所述至少一个组件分别对应的注册信息,并根据所述注册信息,对所述至少一个组件进行注册;根据预设的心跳周期,获取注册后的所述至少一个组件的状态参数。

本发明一个实施例中,该装置可以进一步包括:存储单元;其中,所述存储单元,用于获取所述目标组件根据所述爬取事件采集的爬取信息,并将所述爬取信息存储至预先设置的统一存储结构;其中,所述统一存储结构根据hbase存储系统和redis存储系统组合生成。

上述装置内的各单元之间的信息交互、执行过程等内容,由于与本发明方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。

本发明实施例还提供了一种可读介质,包括执行指令,当存储控制器的处理器执行所述执行指令时,所述存储控制器执行本发明上述任一实施例提供的方法。

本发明实施例还提供了一种存储控制器,包括:处理器、存储器和总线;所述存储器用于存储执行指令,所述处理器与所述存储器通过所述总线连接,当所述存储控制器运行时,所述处理器执行所述存储器存储的所述执行指令,以使所述存储控制器执行本发明上述任一实施例提供的方法。

综上所述,本发明以上各个实施例至少具有如下有益效果:

1、在本发明实施例中,在获取到爬取指令之后,生成爬取指令对应的爬取事件,然后通过预先设置的事件通道,将生成的爬取事件发送给对应的目标组件,以使目标组件执行爬取事件。在此过程中,通过事件通道将爬取事件发送给对应的目标组件,无需通过控制节点与各个组件的长连接关系,完成控制节点与各个组件之间的交互,从而减少了爬虫系统占用的资源,由此提高了爬虫系统的工作效率。并且,控制节点与各个组件之间可通过事件通道进行调度和命令的交互,从而可解除控制节点与各个组件的通信复杂度与通信瓶颈。

2、在本发明实施例中,在获取到组件的状态参数后,根据状态参数可确定组件的工作状态,当组件的工作状态符合预设的标准工作状态时,将该组件对应的工作状态进行传播,便于组件的调用,由此有利于爬虫系统进行数据的爬取,从而进一步提高爬虫系统的工作效率。

3、在本发明实施例中,接收组件的注册信息,并根据接收的注册信息,对组件进行注册,然后通过周期性的心跳,采集注册组件的状态参数,由此实现对各个组件进行统一注册,并统一采集状态参数,实现了组件的无状态化,无需控制节点在调取各个组件时,临时采集各个组件的工作状态,从而为各个组件的故障处理和负载均衡等各种状态驱动行为奠定了基础,并有利于为控制节点的主备用切换以及负载均衡提供支持。

4、在本实施例中,构建各个组件的镜像组件,通过组件容器化屏蔽了组件复杂的运行环境,极大地减轻了组件开发、测试、环境部署和同步的工作量,同时,通过容器框架的编排,提升了组件的健壮性。

5、通过hbase存储系统和redis存储系统构建统一的存储结构,并将爬取事件采集到的爬取新鲜存储至统一的存储结构中,由此实现统一的持久化存储,在降低爬虫系统的整体复杂度的同时,简化了组件的处理传输流程。

6、在本发明实施例中,组件配置有统一的服务接口,各个组件可通过服务机制进行调用,从而有利于服务负载均衡、服务鉴权和服务流控等通用的服务治理能力。

需要说明的是,在本文中,诸如第一和第二之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个······”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同因素。

本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储在计算机可读取的存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:rom、ram、磁碟或者光盘等各种可以存储程序代码的介质中。

最后需要说明的是:以上所述仅为本发明的较佳实施例,仅用于说明本发明的技术方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所做的任何修改、等同替换、改进等,均包含在本发明的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1