基于P2P分布式的网络爬虫设计摘要:未解决传统网络爬虫的在扩展性、容错性和低效性,提出一种基于P2P的分布式网络爬虫。分布式网络爬虫通过爬虫协调节点提高网络爬虫的爬取数据的效率和扩展性。本文首先介绍了传统的网络爬虫的原理,在此原理的基础上对其进行了改进,分析了分布式网络爬虫的结构设计,均衡负载策略和通信策略,从而提高网络爬虫的容错性。关键字网络爬虫P2P分布式负载策略通信策略1.引言Web资源是当今社会中获取资源重要途径之一,随着信息爆炸性增长,人们对信息资源的需求也越来越大,如何使用网络爬虫技术高效的爬取Web中的数据成为了一个严峻的问题?由于传统的网络爬虫的扩展性和容错性比较差,因此在很多方面已经无法胜任高效爬取的任务。由于Web信息具有分布式的特性,因此将网络爬虫采取分布式的方式进行设计可以大大提高爬取数据的效率。分布式的网络爬虫可以借助普通PC用户提供的空闲资源来获取网络,可以降低爬取数据的成本,减少对网络造成的负担。设计一个分布式的网络爬虫首要了解传统的网络爬虫爬取数据的原理,在其基础上进行改进和优化。本文详细介绍了分布式系统中常见的几种结构,并以P2P结构为例,说明了如何对资源的分配策略已达到每个节点的公平性,同时介绍了节点间的通信协议如何保证分布式网络爬虫的良好容错性和扩展性。2.传统网络爬虫2.1工作原理网络爬虫是一个Web程序,按照某种规则自动爬取万维网中的Web页面,将爬取到的网页中的关键字存入关键字数据库中,用户通过搜索引擎或许相关信息的页面。传统的网络爬虫由带爬取的URL库、未爬取的URL库、爬虫主题线程模块和内容提取模块组成。其工作原理]1[如图1,网络爬虫从一个或若干个初始网页的URl开始,通过爬虫主题线程模块从万维网中获得初始网页上的URL和网页信息,将新获取的URL存放在待爬取的URL队列中,将获取到的网页信息传给内容提取模块,内容提取模块将访问过的URL存入已爬行URL库中,将网页信息存入页面信息库中,直到满足一定停止条件。通过一定的网页过滤算法过滤掉与主题无关URL,遵循一定的调度策略从带爬取队列中选择下一次要抓取的URL。图1:传统网络爬虫原理2.2网页抓取策略网页抓取策略可以分为三类抓取策略,分别是深度优先,广度优先和最佳优先,深度优先策略容易使网络爬虫陷入问题,因此较为常用的是广度优先和最佳优先策略]2[。1.深度优先深度优先从初始的URL页面开始,通过一定的规则从初始URL库中选择一个URL,分析这个网页中的其他URL,选择一个再进入。如此一个链接一个链接地抓取下去,直到处理完一条线路为止然后再处理下一个URL。深度优先策略设计比较简单,但是一个门户网站中提供的连接的重要性随着层次的深入逐级降低,从而使过度深入抓取的网页的价值过低,因此深度优先策略直接影响了抓取效率与抓取命中率。2.广度优先广度优先是先对初始的所有URL网页进行抓取,然后通过网页过滤策略选取其中一个链接的网页,继续抓取这个网页中的所有URL链接网页,这样逐层进行抓取。由于初始URL在一定链接距离内的网页是具有主题相关性的概率很大,但是随着抓取网页的增多,大量的无关网页将被下载并过滤,算法的效率将变低。3.最佳优先策略根据机器学习的一些算法提供一种网页分析算法,对初始的URL进行与要获取主题的相关性评估,选取评估最好的一个或几个URL进行抓取。它只访问进过网页分析算法预测为“有用”的网页。这种算法的优点在于可以提高网页的爬取效率,但是却容易忽略被过滤到的URL网页路径中与主题相关的页面,因此最佳优先策略是一种局部的抓取算法,在使用的过程要通内容提取模块Internet页面信息库已访问URL网页信息页面中连接URLURLURL未爬行URL种子库爬虫主题线程模块已爬行URL种子库过一定的优化使其能跳出局部最优点。3.分布式网络爬虫由于传统的网络爬虫是使用集中方式来实现的,由于其扩展性和容错性较差,在这个以大数据为背景的时代已经不能满足用户对数据的需求,分布式技术能够最快的搜索大量网页,因此分布式的网络爬虫已经逐渐成为了网络爬虫的一个发展方向。3.1现状分析分布式网络爬虫在当今社会已经有了比较广泛的应用]3[,例如Google和百度所使用的网络爬虫就采用了分布式系统,但是由于涉及商业机密,因此很少的想关信息进行交流,目前国外使用较多的分布式爬虫有Mercator、GoogleCrawler、UbiCrwaler、InternetArchiveCrawler等,国内比较著名的是WebGather。Google的分布式网络爬虫系统是一台中央主机和三台负责爬虫的机器,并且这三台机器只与中央主机通信。中央主机从一个文件系统中读取URL,并把它们分给其它机器的爬虫进程中。爬虫采用异步I/O同时从三百个网站上获取数据。所有爬虫将下载下来的页面压缩并存储在磁盘上。然后索引进程从这些HTML页面中将URL提取出来存放在另外一个磁盘文件中。URLResolver进程读取这个存放链接的文件,将其中的相对链接转换(通过浏览文件夹按钮进行链接的方式即本地链接)为绝对链接(一个指向摸个文件的精确位置的超级链接,该文件可以存储在某个文件服务器、万维网或某家公司的内联网上),继而提供给主机。不足之处在于,一旦中央主机崩溃失效,则整个系统都会停止工作,而且中央主机的URL分配模块常常成为整个系统的性能瓶颈。Mercator是AltaVista搜索引擎的网络爬虫,它完全由JAVA编写。Mercator的扩展性非常好,可以通过增减或替换模块来实现不同的功能。Mercator采用的数据结构可以使无论爬行的规模有多大,只占用有限的内存,数据结构的大部分都在硬盘中存取。Mercator为最近访问的URL建立了缓存,该缓存的命中率达到了85%。Mercator证明了使用JAVA语言也可以达到较高的性能。InternetAchieve(也叫“网络时光倒流机器”)采用多个机器共同搜集页面。每个Crawler进程负责收集64个Web网站的网页。Crawler从初始的URL库中读取,采用异步I/O并行爬行网页。网页下载后,提取出超链接。如果超链接属于本Crawler负责收集的Web站点,则加入未访问URl集合,否则存储到交叉的URL文件中。批处理模块定期分配这些交叉URL文件到相应的搜集模块,再次过程中要过滤到重复的URL。3.2分布式网络爬虫特点分布式网络爬虫是在传统网络爬虫的基础上实现的,分布式网络爬虫的每个节点可以看成一个传统的网络爬虫,通过一个中心管理节点对所有节点进行管理。因此分布式网络爬虫相比较传统网络爬虫具有以下优点:1.可靠性:当某个节点崩溃后,通过中心管理节点进行广播使其他节点仍能正常工作。2.可扩展性:因为分布式的网络爬虫是由多个节点组成,由一个中心管理节点进行管理,因此当有新的节点加入后,可以不影响整个系统的工作,从而增强系统的工作效率3.高效率:相比较集中式的系统,分布式系统由于多节点协调工作,使其工作效率要远远高于集中式的系统。同时,作为分布式系统有其固有的缺陷,其中最重要的是其通信问题,由于分布式系统的每个节点都处于网络当中,网络中可能出现数据丢失的可能,需要特出的软件处理,其次,分布式系统的网络数据共享会导致安全性问题。3.3工作原理分布式网络爬虫单个节点的工作原理与传统的网络爬虫的工作原理相似,多个节点之间通过协作完成对网页的爬取,从而使得分布式网络爬虫的效率远远高于传统的网络爬虫。对于典型的分布式网络爬虫,每个节点不仅要从自身的未访问URL库和Web页面中获取URL还要从其他节点接受URL。在分布式网络爬虫系统中]4[节点从未访问URL库中获取URL从万维网中下载对应的网页,从网页中获取出新的URL,通过Hash函数计算出Hash值,将属于本节点的URL插入未访问URL库队列中,将不属于本节点的URL发送到其属于的节点中。分布式网络爬虫系统节点间协作的工作原理如图二。图2:节点间协作的工作原理4.分布式网络爬虫设计4.1体系结构该网络采用全分布式非结构化的拓扑结构也就是P2P结构,节点间是对等关系,每个节点既是客户端又是服务器,这种结构]5[的优点在于整体稳定性较好,系统中某个节点发生故障不会对系统性能产生大的影响,因此容错性较好。但是一旦网络规模变大,节点间的通信的效率较低。基于P2P的分布式网络爬虫结构如图3,分布式系统由多个节点组成,每个节点都自己唯一的ID号,所有节点当中有一个控制节点,用于为每个节点分配ID号,对网络爬虫节点1网络爬虫节点2InternetURLURL系统进行动态监控管理等,剩余的节点都为爬虫节点,爬虫节点中有一个特殊的中心协调节点,负责协调节点间的通信,一旦中心节点退出或者崩溃,其他节点就会选取剩余节点中ID号最大的为中心节点。4.2爬行节点结构设计分布式爬行节点可以划分为]73[,如图4的四个部分:网络爬虫模块、节点信息维护模块、任务分配模块、节点通信模块,其中节点信息维护模块、任务分配模块、节点通信模块实现了网络爬虫的分布式处理,因此统称为分布式模块。InternetURLURLURL爬虫1中心节点爬虫2爬虫3控制节点下载线程2节点信息模块任务分配模块图3:P2P分布式爬虫结构图分布式模块图4:爬行节点结构1.网络爬虫模块网络爬虫模块有DNS解析器模块、下载模块和进程控制模块组成,是网络爬虫节点的核心部分,它直接与Web服务器进行通信。通过向线程控制模块发送URL进行Web页面的下载,由于本文中的重点在于分布式模块,该模块不是讨论的重点。2.节点通信模块节点通信模块由系统节点表,节点参数和日志记录组成,其中系统节点表中记录了所有爬虫节点的信息,包含了所有节点的ID号,IP地址,端口号,是否为中心节点,为保证分布式环境中的视图一致性,每个节点的系统节点表信息必须相同,当系统中有节点进入、退出或者崩溃时需要更新每个节点中的系统节点表,当中心节点崩溃或者退出时,所有节点可以通过系统节点表达成共识按照一定的选举规则选举新的中心节点表节点参数负责维护和改变节点运行的参数,当控制节点发出控制命令,由通信模块将控制命令发到该部分对节点当前的运行参数进行修改。日志记录,负责维护日志,使管理中心节点可以监控爬虫节点的运行速度、爬行深度等参数。3.任务分配模块分布式网络爬虫在工作时由于是所有节点协同工作,因此很容易出现访问到重复的URL页面]5[,同时将庞大的爬行任务分配给爬虫系统需要保证每个节点的负载平衡。任务分配模块的作用就是保证这些问题的解决而设计的,具体的分配算法在后面的内容中具体说明。4.节点通信模块节点间的通信包括URL的传输和接受以及消息的传递,因此节点通信模DNS解析器模块下载线程1块包括消息通信子模块和URL传输子模块。4.3控制节点的设计控制节点在爬行系统中不参与爬行过程,负责对整个系统管理监控作用,该节点主要实现以下功能1.添加删除节点:动态的添加删除节点使得系统具有良好的可扩展性2.监控运行节点:可以监控分布式系统中任何几点的运行状态,包括运行时间、下载网页数量等。3.动态调整爬虫节点的运行参数:通过动态调整爬虫节点的运行参数使得爬虫节点具有更好的可管理性和可配置性,运行参数包括爬行速度、爬行深度、爬虫线程数等。4.4分配策略由于广域网的网络爬虫设计以及实现比较复杂,因此本文设计的网络爬虫建立在局域网上的爬虫系统。局域网的网络爬虫是指所有的爬虫节点都分布在同一个局域网中,节点间的通讯是依靠高速内连接进行。为避免在搜索网页出现重复爬虫并且使每个节点的负载平衡,必须要选择合理的分配策略,常见的分配策略有以下三种]3[:1.集中方式:将初始URL对应的Web页面按照一定规则划分任务子集,将特定的任务子集通过中心节点划分给其对应的节点。在采集过程中如果有节点发现采集信息不属于自己的范围,将信息反馈给中心节点,有中心节点重新分配给其对应的节点。集中方式是通过中心节点完成合理分配的任务。这种方式往往需要向中心节点转发较多的URL,容易造成性能瓶颈。2.独立方式:每个节点都从自己初始的URL开始采集信息