应用于单台多核处理器主机的多线程网络爬虫执行方法

文档序号:6522929阅读:246来源:国知局
应用于单台多核处理器主机的多线程网络爬虫执行方法
【专利摘要】本发明提出的应用于单台多核处理器主机的多线程网络爬虫执行方法包括步骤:S10、创建网页爬取线程、网页分析线程以及URL种子线程;S20、将URL种子载入URL种子缓冲队列;S30、从URL种子缓冲队列中取出URL种子块,遍历URL条目进行网页爬取;S40、将网页内容及其URL封装载入网页缓冲队列;S50、通过查询哈希表进行URL分析,将URL载入待爬取URL列表;S60、待爬取URL列表中元素达到最大值时写入URL缓冲队列;S70、从URL缓冲队列中取出URL列表并重排,封装成URL种子块插入URL种子缓冲队列。本发明可避免额外的线程切换或等待、误判率极低,一定程度上解决了“礼貌”爬取问题。
【专利说明】应用于单台多核处理器主机的多线程网络爬虫执行方法
【【技术领域】】
[0001]本发明涉及一种应用于单台多核处理器主机的多线程网络爬虫执行方法。
【【背景技术】】
[0002]网络爬虫(Web Crawler),又称为网络蜘蛛(Web Spider)或网络机器人(WebRobot),是一个自动下载网页的计算机程序或自动化脚本,是搜索引擎的重要组成部分。网络爬虫通常从一个称为种子集的URL集合开始运行,它首先将这些URL全部放入到一个有序的待爬行队列里,按照一定的顺序从中取出URL并下载所指向的页面,分析页面内容,提取新的URL并存入待爬行URL队列中,如此重复上面的过程,直到URL队列为空或满足某个爬行终止条件,从而遍历Web。
[0003]网络爬虫作为搜索引擎的基础构件之一,在各大互联网公司的大力发展之下,技术已比较完善。如谷歌、百度等公司部署于各自集群上``的大规模分布式网络爬虫支持着其搜索引擎的日常工作。而出于商业机密的考虑,目前各个搜索引擎使用的网络爬虫系统的技术内幕一般都不公开,现有的文献也仅限于概要性介绍。目前的网络爬虫大都采用分布式架构,性能优越,而针对运行于单机的爬虫的研究工作较少,实现复杂且细节不公开。
[0004]近年来,机器学习、数据挖掘等学科成为各研究单位研究的热点。而这些领域内很多研究需要基于对以网页数据为代表的海量互联网数据的分析。网络爬虫作为获取Web数据的基本技术,决定着所获取数据的内容是否丰富、信息能否得到及时更新,它的性能及有效性直接影响到后续研究工作的成功与否。目前,现有技术主要存在以下几点缺陷:(1)各个学科领域内网络爬虫程序通用性低、性能差异较大,移植到不同配置机器时会发生由于处理器内核利用不充分或线程过多而增加系统线程切换以引起程序效率降低。(2)存在于网络的网页数量多,现有分布式爬虫所采用的去重方法实现复杂且内存消耗量在单机难以承受;(3)广度优先爬虫容易产生“礼貌”爬行问题,即短时间内大量访问同一主机,影响普通用户访问;(4)传统竞争型网页缓冲对线程并行度影响较大,无法充分发挥多核CPU的性倉泛。

【发明内容】

[0005]本发明旨在解决上述现有技术中存在的问题,提出一种应用于单台多核处理器主机的多线程网络爬虫执行方法。
[0006]本发明提出的应用于单台多核处理器主机的多线程网络爬虫执行方法包括以下步骤:S10、基于主机处理器核数以及线程数量创建网页爬取线程、网页分析线程以及URL种子线程,申请哈希表空间;S20、获取包含URL列表的初始URL种子文件,将所述初始URL种子文件中的URL种子载入URL种子缓冲队列;S30、网页爬取线程从URL种子缓冲队列中取出URL种子块,采用仅遍历URL种子块中URL条目的策略进行网页爬取;S40、当爬取的网页数量达到网页爬取线程设定的最大阈值时,将网页内容和其对应的URL封装并载入网页缓冲队列;S50、网页分析线程每次从网页缓冲队列中取出一个队列元素,并对所述队列元素中每一个网页通过查询哈希表进行URL分析,排除重复出现的URL,将新出现的URL载入待爬取URL列表;S60、当待爬取URL列表中元素达到最大值时写入URL缓冲队列,当一个网页缓冲队列元素中所有网页被分析后,将元素对象插入网页磁盘缓存,由清空网页缓存线程写入磁盘;S70、URL种子生成线程每次从URL缓冲队列中取出URL列表并重排,封装成URL种子块并插入URL种子缓冲队列。
[0007]本发明具有如下优点:(1)分解基于广度优先搜索,按照主机配置达到工作负载最均衡的状态,避免额外的线程切换或等待,将程序在当前多核处理器上的性能最大化;
(2)低误判的两次哈希URL去重模型使得本框架系统在进行10亿量级的URL的去重操作时仅需要256MB的内存空间,误判率大大降低;(3)采用简单有效的随即乱序种子生成代替分布式爬虫方案中广泛采用的Web划分方式,在一定程度上解决了 “礼貌”爬取问题,执行效率更高;(4)为框架内的缓冲队列设定生产阈值与消费阈值,增加了各线程如网页爬取线程、网页分析线程、URL种子生成线程、清空URL缓存区线程之间的并行度,提高了多核CPU的利用率。
【【专利附图】

【附图说明】】
[0008] 图1为本发明一实施例的应用于单台多核处理器主机的多线程网络爬虫执行方法流程图。
[0009]图2为本发明一实施例的应用于单台多核处理器主机的多线程网络爬虫框架结构图。
[0010]图3为本发明一实施例的URL种子缓冲队列结构示意图。
[0011]图4为本发明一实施例的网页爬取线程及网页分析线程数据示意图。
[0012]图5为本发明一实施例的网页缓冲队列数据示意图。
[0013]图6为本发明一实施例的基于验证位的两次哈希去重算法模型图。
[0014]图7为本发明一实施例的生产线程、缓冲队列、消费者线程工作原理图。
【【具体实施方式】】
[0015]下面结合具体实施例及附图对本发明作进一步详细说明。下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明的技术方案,而不应当理解为对本发明的限制。
[0016]在本发明的描述中,术语“内”、“外”、“纵向”、“横向”、“上”、“下”、“顶”、“底”等指
示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明而不是要求本发明必须以特定的方位构造和操作,因此不应当理解为对本发明的限制。
[0017]本发明提供一种应用于单台多核处理器主机的多线程网络爬虫执行方法。如图1所示,本发明提出的应用于单台多核处理器主机的多线程网络爬虫执行方法,包括以下步骤:S10、基于主机处理器核数以及线程数量创建网页爬取线程、网页分析线程以及URL种子线程,申请哈希表空间;S20、获取包含URL列表的初始URL种子文件,将所述初始URL种子文件中的URL种子载入URL种子缓冲队列;S30、网页爬取线程从URL种子缓冲队列中取出URL种子块,采用仅遍历URL种子块中URL条目的策略进行网页爬取;S40、当爬取的网页数量达到网页爬取线程设定的最大阈值时,将网页内容和其对应的URL封装并载入网页缓冲队列;S50、网页分析线程每次从网页缓冲队列中取出一个队列元素,并对所述队列元素中每一个网页通过查询哈希表进行URL分析,排除重复出现的URL,将新出现的URL载入待爬取URL列表;S60、当待爬取URL列表中元素达到最大值时写入URL缓冲队列,当一个网页缓冲队列元素中所有网页被分析后,将元素对象插入网页磁盘缓存,由清空网页缓存线程写入磁盘;S70、URL种子生成线程每次从URL缓冲队列中取出URL列表并重排,封装成URL种子块并插入URL种子缓冲队列。
[0018]如图2所示,本发明提出的应用于单台多核处理器主机的多线程网络爬虫框架执行过程主要有URL种子生成、网页爬取、网页分析(包括URL去重)、将网页数据写入磁盘等。其间使用了 URL种子缓冲队列、网页缓冲队列及URL缓冲队列减少线程通信和磁盘访问次数来提高系统的效率。未在图中标出的过程有初始化过程及结束清理过程。用户在该框架之上编写自己的网络爬虫时只需重写“清空网页缓存区”方法来自定义文件的输出格式,其它部分不需要进行改动。
[0019]用户在机器上部署本框架系统时,可通过框架的XML配置文件自定义网页爬取线程、网页分析线程、生成种子线程的数目及各缓存区大小。如不进行自定义配置,系统将根据预定义的运行策略表自动匹配在当前机器上最优的执行方案。
[0020]本框架所设计的各个线程执行的周期不同,其中工作量最大的网页爬取线程和网页分析线程需要一直循环执行并尽量不使其发生等待;生成URL种子线程工作量适中,有一定时间内生成URL种子线程将处于等待状态;清空网页缓存区线程、装载URL缓存区线程及清空URL缓存区线程工作量最小,大部分时间处于等待状态。根据以上知识指导设计最优策略表,并根据大量实验得出最优策略表如下:
[0021]针对目前常用的商用多核处理器,按照以下方案自动获得CPU的逻辑内核数并进行匹配:
[0022](I)双核处理器:1个网页爬取线程、I个网页分析线程,I个生成URL种子线程;
[0023](2)四核处理器或双核四线程处理器:1个网页爬取线程、2个网页分析线程、I个生成URL种子线程;
[0024](3)六核处理器:2个网页爬取线程、2个网页分析线程、I个生成URL种子线程;
[0025](4)八核处理器或四核八线程处理器:2个网页爬取线程、3个网页分析线程、I个生成URL种子线程;
[0026](5)六核十二线程处理器:4个网页爬取线程、5个网页分析线程、I个生成URL种子线程;
[0027](6)八核十六线程处理器:5个网页爬取线程、7个网页分析线程、2个生成URL种
子线程。
[0028]在本框架之上开发网络爬虫程序时需要提供一个初始URL种子文件,该文件内容为若干条用户感兴趣的URL列表。框架首先通过初始化模块申请哈希表空间,创建所有线程,并将用户提供的初始种子文件中的URL种子加载入URL种子缓冲队列中,种子缓冲队列的结构如图3所示,其元素为一个URL种子块的地址或指针变量,每个变量指向一个存储在堆空间中的600条URL列表组成的种子块对象。此时其他线程处于等待状态,网页爬取线程(如图4所示)从URL种子缓冲队列中取出URL种子块对象进行网页爬取,爬取时仅遍历URL种子数据块中的URL条目,而不进行更深一层的宽度优先搜索。因为本框架能够保证URL种子缓冲队列中的所有URL条目均不重复,所以用这些URL种子进行网页爬取的所有网页爬取线程所获得网页内容也均不重复(不考虑URL不同但网页内容相同的情况)。当爬取的网页数量达到网页爬取线程设定的最大值500时,将网页内容写入网页缓冲队列中。写入前需将网页内容和其对应的URL封装成为网页缓冲队列的元素对象,如图4所示,网页缓冲队列的元素为100条URL和其相应的网页内容这样一对值的顺序排列组成。网页分析线程(如图4所示)每次从网页缓冲队列中摘下一个队列元素,对元素中每一个网页进行URL分析,通过查询哈希表,检查每个经过网页分析所提取到的URL是否重复出现,若是新的URL则加入待爬取URL列表中。当待爬取URL列表达到最大值时将其写入URL缓冲队列中。当一个网页缓冲队列元素中所有网页都已被分析后,将该元素对象插入网页磁盘缓存中,由清空网页缓存线程定期写入磁盘。URL缓冲队列的内容即为URL种子生成线程的源数据,URL种子生成线程每次从URL缓冲队列中摘下5个元素的URL列表,将这些URL重新排列,封装成5个URL种子块插入URL种子缓冲队列中。至此,网络爬虫的一个工作循环已完成。
[0029]在本发明提出的应用于单台多核处理器主机的多线程网络爬虫执行方法中,采用基于位验证的两次哈希去重方法创建所述哈希表,所述两次哈希去重方法包括ELFhash变型算法以及HFIp型URL哈希算法。设计哈希表的目标是为10亿量级的URL条目进行去重操作。为节省内存资源,不考虑处理冲突的键,因为要检测冲突键需要存储URL键值,而URL占用存储空间较多。本方案在此只存储某个哈希值是否已被查询的状态,被查询或未被查询状态用一个bit就可以表示。为存储10亿条URL记录的哈希状态,最多需要长度为109/8=1.25*108 的 char 型数组 hashTable [1.25*108](—个 char 型变量有 8 位),该数组所占用内存约为125MB。为访问到数组元素char中每个位的值,设置一个长度为8的掩码数组 mask[8]。从 mask [0]、mask [I]到 mask[7],它们的值分别是=0x00000001,0x00000010,0x00000100,0x00001000,0x00010000,0x00100000,0x01000000,0x10000000。访问 URL 的哈希值状态的步骤为:(I)计算URL的哈希值(hashValue):hashValue=哈希函数(URL)。
(2)该URL 的哈希状态hashStatus=hashTable[hashValue/8] 'mask[hashValue%8]。哈希状态(hashStatus)的值分为0和非0两种,0表示此URL未出现过,非0表示此URL出现过,哈希表中所有元素初始值都为O。
[0030]当哈希表的规模增大时,哈希函数的不均匀率即冲突率也会随之升高,从而使发生误判的概率增加。例如当某URLl与另一 URL2发生碰撞时,会误判URL2与URLl重复。考虑到不同哈希算法分布差异很大,可以认为相同URL键在两个计算过程不同的哈希函数中发生碰撞这两个事件关联性很小。可以近似的认为同一键在这两个哈希函数下同时发生碰撞的概率为两个函数冲突率之积。因此再增加一张同样规模的哈希表,采用数学过程差别较大的的哈希算法,每次计算URL的两种哈希值,并分别到两个表进行查询,只要其中一个表中状态位为0,就说明该URL不重复。即该URL的最终哈希状态为哈希函数表I状态与哈希函数表2状态的或运算。查询的过程将两个哈希表中的该URL哈希值对应的位都置I表示该URL已出现过。如图6所示,在选用哈希算法时,尽量选用对URL哈希值分布均匀且计算速度快的算法,本系统中采用一个ELFhash算法的变型如代码I所示,进行哈希值的计算,另一个算法为常用的URL哈希算法HFIp如代码2所示。由实验数据得知两种算法在进行大规模URL集的哈希查找时,性能较为优越,且统计均匀性较好。
[0031]
【权利要求】
1.一种应用于单台多核处理器主机的多线程网络爬虫执行方法,包括以下步骤: S10、基于主机处理器核数以及线程数量创建网页爬取线程、网页分析线程以及URL种子线程,申请哈希表空间; S20、获取包含URL列表的初始URL种子文件,将所述初始URL种子文件中的URL种子载入URL种子缓冲队列; S30、网页爬取线程从URL种子缓冲队列中取出URL种子块,采用仅遍历URL种子块中URL条目的策略进行网页爬取; S40、当爬取的网页数量达到网页爬取线程设定的最大阈值时,将网页内容和其对应的URL封装并载入网页缓冲队列; S50、网页分析线程每次从网页缓冲队列中取出一个队列元素,并对所述队列元素中每一个网页通过查询哈希表进行URL分析,排除重复出现的URL,将新出现的URL载入待爬取URL列表; S60、当待爬取URL列表中元素达到最大值时写入URL缓冲队列,当一个网页缓冲队列元素中所有网页被分析后,将元素对象插入网页磁盘缓存,由清空网页缓存线程写入磁盘; S70、URL种子生成线程每次从URL缓冲队列中取出URL列表并重排,封装成URL种子块并插入URL种子缓冲队列 。
2.根据权利要求1所述的应用于单台多核处理器主机的多线程网络爬虫执行方法,其特征在于,对于双核处理器,创建I个网页爬取线程、I个网页分析线程以及I个生成URL种子线程;对于四核处理器或双核四线程处理器,创建I个网页爬取线程、2个网页分析线程以及I个生成URL种子线程;对于六核处理器,创建2个网页爬取线程、2个网页分析线程以及I个生成URL种子线程;对于八核处理器或四核八线程处理器,创建2个网页爬取线程、3个网页分析线程以及I个生成URL种子线程;对于六核十二线程处理器,创建4个网页爬取线程、5个网页分析线程以及I个生成URL种子线程;对于八核十六线程处理器,创建5个网页爬取线程、7个网页分析线程以及2个生成URL种子线程。
3.根据权利要求1所述的应用于单台多核处理器主机的多线程网络爬虫执行方法,其特征在于,采用基于位验证的两次哈希去重方法创建所述哈希表,所述两次哈希去重方法包括ELFhash变型算法以及HFIp型URL哈希算法。
4.根据权利要求1所述的应用于单台多核处理器主机的多线程网络爬虫执行方法,其特征在于,在种子生成线程中,从URL缓存列表中一次提取3000条URL进行随机重排,将重排后的URL封装成种子块插入URL种子缓冲队列。
5.根据权利要求1所述的应用于单台多核处理器主机的多线程网络爬虫执行方法,其特征在于,URL种子生成线程每次从URL缓冲队列中取出5个元素的URL列表并重排,封装成5个URL种子块插入URL种子缓冲队列。
6.根据权利要求1所述的应用于单台多核处理器主机的多线程网络爬虫执行方法,其特征在于,所述网页缓冲队列、URL缓冲队列以及URL种子缓冲队列的生产阈值、消费阈值分别为0.2、0.8。
7.根据权利要求1所述的应用于单台多核处理器主机的多线程网络爬虫执行方法,其特征在于,所述网页爬取线程设定的最大阈值为500。
8.根据权利要求1所述的应用于单台多核处理器主机的多线程网络爬虫执行方法,其特征在于,所述URL种子缓冲队列中的每一元素为一个URL种子块的地址或指针变量。
9.根据权利要求1所述的应用于单台多核处理器主机的多线程网络爬虫执行方法,其特征在于,所述网页缓冲队列中元素为URL及其相应的网页内容拼接而成的数据单元。
10.根据权利要求1所述的应用于单台多核处理器主机的多线程网络爬虫执行方法,其特征在于 ,所述URL缓冲队列中内容即为URL种子生成线程的源数据。
【文档编号】G06F17/30GK103678571SQ201310661466
【公开日】2014年3月26日 申请日期:2013年12月9日 优先权日:2013年12月9日
【发明者】冯铮, 赵中英, 刘明君, 何一峰, 冯圣中 申请人:中国科学院深圳先进技术研究院
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1