技术领域
[0001] 本发明涉及网络爬虫技术领域,具体涉及一种分布式爬虫系统。
相关背景技术
[0002] 互联网时代的到来,带来的是信息量的迅速膨胀,大数据和云计算也应运而生,互联网企业、大型通信公司和销售公司等每天产生巨量的日志、用户行为信息等。大数据的数据量巨大、数据类型复杂、价值密度低、处理速度快等特点,使得传统的集中式网络爬虫受到Web页面覆盖率和抓取时间性能瓶颈的限制,系统调度的能力不足,导致系统爬行性能较差。
具体实施方式
[0034] 为使本发明的目的、技术方案和优点更加清楚,下面将对本发明的技术方案进行详细的描述。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所得到的所有其它实施方式,都属于本发明所保护的范围。
[0035] 图1是本发明分布式爬虫系统实施例一提供的结构图。如图1所示,本实施例的分布式爬虫系统可以包括:统一资源定位符URL(Uniform Resource Location)读写模块11、URL抓取模块12、文档解析模块13和持久化模块14。
[0036] 具体地,本实施例的分布式爬虫系统可以基于Hadoop分布式文件系统实现,Hadoop分布式文件系统可以作为数据存储中心,基于文件系统提供了统一的资源调度系统,并且可以在该系统上运行MapReduce等诸多的计算框架。Hadoop系统支持MapReduce编程模型,MapReduce编程模型易于理解,可以处理大数据领域的很多问题,这种简单的抽象模型简化了数据的分析和处理。进一步地,MapReduce的Map端可以读取数据和转换,将输入的数据转换为需要的键值对;Reduce端可以对上一步产生的数据进行整合加以分析处理。MapReduce的执行逻辑如下:
[0037] InputFormat:指定输入数据路径,可以是Hadoop文件系统甚至网络流,并指定数据处理格式,将数据处理为指定的键值对,用于map端输入;
[0038] Map:Map数量取决于数据大小和分片大小,每个Map处理不同的分片,输出的结果持久化到本地磁盘供稍后的Reduce读取,合理的分片大小可以确保各个Map任务完成时间同步,避免计算倾斜导致Map端处理时间延长;
[0039] Shuffle/Sort:Map端输出的结果经过散列或者指定的划分方式被传输到指定的Reduce端,保证每个Reduce的键有序,合理地分配Reduce数据量可以避免计算负载不均衡;
[0040] Reduce:Reduce将相同的键对应的值聚合,进行同一操作,输出计算后的新键值对;
[0041] OutputFormat:检查输出路径的合法性,将Reduce的输出键值对持久化到指定目录。
[0042] Hadoop的MapReduce编程模型功能更加丰富,可以处理很多复杂的问题,如Map端,可以通过定义新的输入文件格式化程序来轻松处理各种输入文件类型,在Map端和Reduce端间,通过增加Combiner阶段和Partitioner阶段大大降低了各节点之间的网络传输负载。本实施例的分布式爬虫系统即是基于MapReduce编程模型,使用Map端或Reduce端实现各部分的核心功能,使得整个系统抽象简单,易于使用和扩展。
[0043] 具体地,本实施例中,URL读写模块11可以用于基于MapReduce的Map端从输入流中读取URL,将URL写入到输出流中。并且根据爬虫抓取策略和抓取时间间隔周期性地提供URL给URL抓取模块12,检查URL的正确性和合法性,修复不正确URL,刷新URL库。
[0044] URL抓取模块12,用于将写入到输出流中的URL作为访问地址,根据预设的网络访问模式,基于Map端下载访问地址对应的目标文档。具体地,本实施例中,URL抓取模块12可以使用获取处理器FetchProcessor接口,可以默认Jsoup Fetch Processor,内部可以使用Jsoup,抓取到的不同目标文档可以被包装为统一的Document实体,由文档解析模块13负责处理。具体地,Jsoup是一款优秀的页面解析工具,并且提供基础的超文本传输协议HTTP(HyperText Transfer Protocol)下载功能,应用程序接口API(Application Program Interface)简单易用,可以解析在线或者本地文档,因此本实施例使用Jsoup作为超文本标记语言HTML(Hyper Text Markup Language)文档解析器。
[0045] 文档解析模块13,用于基于Map端,按照预设方式提取目标文档中的目标数据,检测目标数据的类型,若类型为目标类型,基于MapReduce的Reduce端将目标数据发送至对应的持久化模块14。具体地,在本实施例中,可以使用解析处理器Resolve Processor接口,默认使用Jsoup Resolve Processor进行处理,提取目标文档中的目标数据方式可以由用户来定义。
[0046] 持久化模块14,用于基于Map端,按照预设路径和持久化规则将目标数据存储到Hadoop分布式文件系统中,还可以检查输出路径的有效性和合法性。具体地,在本实施例中,可以使用存储处理器Store Processor接口,并且可以根据用户选择的路径和持久化规则,将数据写入文件系统。可选地,持久化模块14可以集成到URL抓取模块12。
[0047] 本方案将分布式爬虫系统模块化,不同的模块实现特定的功能,通过在模块之间传输数据来进行信息交互,降低系统耦合性的同时提高了系统的可扩展性、可用性和可维护性,提高了系统的调度能力,使系统的爬行性能能够发挥出来。
[0048] 图2是本发明分布式爬虫系统实施例二提供的结构图。本实施例在以上实施例的基础上对本发明的技术方案进行描述。具体地,本实施例的文档解析模块13还可以用于,基于Map端,按照预设方式提取目标文档中的目标数据,检测目标数据的类型之后,若不为目标类型,可以基于MapReduce的Reduce端将目标数据发送至对应的读写模块,该目标数据为新的URL。
[0049] 本实施例的分布式爬虫系统还可以包括中央调度模块15。中央调度模块15是本实施例分布式爬虫系统的调度和协调中心,可以用于在分布式爬虫系统初始化时,配置数据,将各项配置数据转发到各个子模块,并发送启动指令,通知各模块开始工作;
[0050] 在分布式爬虫系统工作结束后,删除临时数据,检查数据结果并发送停止指令;
[0051] 接收分布式爬虫系统的节点汇报信息,根据信息协调节点的工作,将坏掉的节点进行替换,协调各个模块的工作速率,维护整个分布式系统的数据一致性,避免各个模块之间的行为不统一;
[0052] 维护分布式爬虫系统与客户端的连接,与客户端进行数据交互,实时汇报系统工作进度和接收客户端操作指令。
[0053] 可选地,对于URL读写模块11和文档解析模块13,往往需要处理计算密集的任务,因此应该将其分配到CPU资源充足的节点,而持久化模块14和URL抓取模块12需要大量的数据IO和网络IO,因此需要有稳定和高性能的磁盘和网络支持。
[0054] 本实施例的分布式爬虫系统还可以包括副调度模块16,可以用于中央调度模块15出现故障时,替换中央调度模块15,避免中央调度模块15故障时系统瘫痪无法运行。
[0055] 本实施例的分布式爬虫系统还可以包括配置类模块17,爬虫涉及到爬取深度、爬取规则和文档解析方式等诸多配置项,尤其在分布式环境中,不同节点要保证配置项的对应值同步,这往往需要高效的、线程安全的配置类,本实施例提供了CrawlerConfig类。本实施例的配置类模块17可以用于基于爬行配置CrawlerConfig类,自动注入和解析不同属性的键值对,避免了配置逻辑侵入到业务逻辑中,能够保证多线程环境中的数据共享安全,并通过实现复制函数,将配置类拷贝到不同节点中;
[0056] CrawlerConfig类同时实现了序列化机制,保证在节点之间网络中高效传输,本实施例的分布式爬虫系统主要用于远程过程调用协议RPC(Remote Procedure Call Protocol)调用,在配置系统中,同时有Configurable类,爬虫系统中凡需要用到配置项的组件,可以通过实现该接口便捷地获取CrawlerConfig类中对应的功能;
[0057] 对于多节点之间的通信,本实施例的分布式爬虫系统可以使用Hadoop的远程过程调用协议RPC类库,RPC是建立在传输控制协议TCP(Transmission Control Protocol)之上、为运用层提供服务的通信系统,Java中自带的Socket类库过于底层,难以满足系统要求,而其提供的系列化机制会占用较多的网络带宽,不适用于分布式系统中的数据通信,Hadoop RPC使用新的异步输入输出流,可以实现高效的远程调用。
[0058] 本实施例的分布式爬虫系统,还可以包括驱动模块18,向客户端屏蔽配置类模块17的操作程序。具体地,本实施例的分布式爬虫系统配置项繁多,启动复杂,各个模块之间依赖规则较多,尤其在分布式环境中,如果直接将爬虫配置类模块17程序接口暴露于客户端,往往会导致系统的易用性较差,且难以屏蔽掉运行细节,因此本实施例的分布式爬虫系统在模块化基础上,提供了基于启动类CrawlerBooter的驱动模块18,作为爬虫运行驱动。
在驱动模块18中,首先建立爬虫运行环境,检查配置内容和配置类模块17,随后建立数据流,在数据流中插入默认的和用户提供的处理器,配置系统被集成到驱动中,以向用户屏蔽掉配置类的具体实现,在驱动中提供具有确切含义的配置函数,可以在客户端初始化驱动类并简单配置实现爬虫系统的使用。
[0059] 本实施例的URL抓取模块12,还可以用于基于Reduce端,按照预设分类方式对目标文档分类,预设分类方式包括初始链接地址、文档类型、爬取深度、文档主题中的至少一种。
[0060] 本实施例的URL读写模块11,还可以用于基于布隆过滤器判断URL是否已经被访问;若是,可以删除已经被访问的URL。去除重复的URL能够大大降低提高本实施例分布式爬虫系统的工作量,进而提高工作效率。
[0061] 具体地,布隆过滤器是一种二进制的向量数据结构,可以用于判断某个URL是否已经被访问过。布隆过滤器使用一定长度的位数组存储集合信息,使用一定数量的哈希函数将数据映射到位数组空间中,其基本原理为:将位数组元素全部置为0,将集合中的所有成员分别使用指定的哈希函数进行计算,将计算结果对应的位数组下标置为1,这样,如果有h个哈希函数,则位数组中可能会有小于等于h的位置置为1。查询某个元素是否存在于集合中时,只需要用这h个函数对该元素依次求值,只要值对应的索引中有任何一位为0,则确定元素不在集合中。
[0062] 本实施例的URL读写模块11,还可以基于URL排队处理器QueueURLProcessor类对URL组成的队列进行维护。QueueURLProcessor类通过在内部维护队列对URL进行管理,线程启动后,URL读写模块11不断从输入流中读入URL,可以先使用布隆过滤器过滤重复的URL,再对URL合法性进行校验,最后形成URL队列,QueueURLProcessor类对URL队列进行维护与管理,按照一定的顺序将URL写入到输出流中。
[0063] 具体地,本实施例的分布式爬虫系统还可以包括通信模块19,通信模块19可以调整各个模块之间的工作速率,使各个模块之间的工作速率相匹配。
[0064] 具体地,本实施例的分布式爬虫系统可以使用磁盘数据结构的URL维护池,以适应目前的庞大数据量,避免由于数据量过大而导致成堆溢出。可以为数据流中的数据管道提供标识符,用于鉴别数据类型,方便在不同模块之间传输更多信息。本实施例的分布式爬虫系统可以基于spring容器池进行处理器配置,将配置细节抽离代码,实现爬虫系统的灵活配置。
[0065] 进一步地,本实施例对分布式爬虫系统进行了运行测试。本实施例的运行环境为基于4台Centos虚拟机的Hadoop集群,针对爬虫系统的可用性可扩展性进行分析,测试数据为可访问的URL,本系统会随机从URL库中选择一定数量的URL初始化,测试结果如表1。
[0066]爬取深度 并行线程数 测试结果
4 5 抓取10万条数据,速度稳定
5 5 抓取100万条数据,速度不变
6 5 抓取4000万条数据,速度下降
5 5 抓取速度稳定
5 10 抓取速度加快
5 15 抓取速度有所降低
[0067] 表1
[0068] 在抓取线程数量一定的情况下,抓取深度对数据量会产生巨大的影响,二者之间呈指数关系,而在抓取深度一定的前提下,适当增加线程数会加快抓取速度,但抓取线程数量过多时,速度反而下降,因为大量的线程会增加系统线程切换和资源竞争的负担,测试结果和预期一致。本方案将分布式爬虫系统模块化,不同的模块实现特定的功能,通过在模块之间传输数据来进行信息交互,降低系统耦合性的同时提高了系统的可扩展性、可用性和可维护性,提高了系统的调度能力,使系统的爬行性能能够发挥出来。
[0069] 可以理解的是,上述各实施例中相同或相似部分可以相互参考,在一些实施例中未详细说明的内容可以参见其他实施例中相同或相似的内容。
[0070] 需要说明的是,在本发明的描述中,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性。此外,在本发明的描述中,除非另有说明,“多个”的含义是指至少两个。
[0071] 此外,在本发明各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。
[0072] 上述提到的存储介质可以是只读存储器,磁盘或光盘等。
[0073] 在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
[0074] 尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。