控制网络爬虫的任务分配方法和装置与流程

文档序号:12837127阅读:148来源:国知局
控制网络爬虫的任务分配方法和装置与流程

本申请涉及互联网领域,具体而言,涉及一种控制网络爬虫的任务分配方法和装置。



背景技术:

网络爬虫爬取网页时会从一个或若干初始网页的统一资源定位符(uniformresourcelocator,简称为url)开始,抽取初始网页上的所有url,并放入url队列,等待网络爬虫从url队列获取一个新的url继续执行网页爬取。现有方法是通过中间控制器来给网络爬虫分配任务,所以网络爬虫任务的分配非常依赖于中间控制器,当中间控制器出现异常情况时会导致网络爬虫分配不到任务或者分配过多任务,如果网络爬虫分配不到任务就会一直处于空闲状态,浪费机器资源;如果网络爬虫同时执行过多的任务则会导致网络爬虫崩溃,造成任务和数据的丢失,带来较为严重的后果。

具体地,现有通过中间控制器分配网络爬虫任务的方法存在如下缺点:首先,需要另写一个中间控制器程序分配网络爬虫的爬取任务,使得整个爬虫系统变得复杂,不易维护;其次,网络爬虫任务的分配非常依赖中间控制器程序,当中间控制器程序出现异常崩溃时,会存在数据丢失或是浪费机器资源的问题。

针对相关技术中通过中间控制器分配网络爬虫任务导致爬虫系统变得较为复杂的问题,目前尚未提出有效的解决方案。



技术实现要素:

本申请的主要目的在于提供一种控制网络爬虫的任务分配方法和装置,以解决相关技术中通过中间控制器分配网络爬虫任务导致爬虫系统变得较为复杂的问题。

为了实现上述目的,根据本申请的一个方面,提供了一种控制网络爬虫的任务分配方法。网络爬虫采用多线程执行任务,多线程预先存放于线程池内,该方法包括:通过信号量判断多线程中的任务线程的数量是否达到任务最大并行数,其中,信号量的初始值为任务最大并行数,任务线程为经过信号量的线程;在通过信号量判断出多线程中的任务线程的数量达到任务最大并行数时,阻止线程池内的线程从url队列中获取任务;以及在通过信号量判断出多线程中的任务线程的数量未达到任务最大并行 数时,控制线程池内的线程从url队列中获取任务。

进一步地,通过信号量判断多线程中的任务线程的数量是否达到任务最大并行数包括:判断信号量的值是否为0;在判断出信号量的值为0时,则确定多线程中的任务线程的数量达到任务最大并行数;以及在判断出信号量的值不为0时,则确定多线程中的任务线程的数量未达到任务最大并行数。

进一步地,在通过信号量判断出多线程中的任务线程的数量未达到任务最大并行数时,控制线程池内的线程从url队列中获取任务之后,该方法还包括:将信号量的值减1,在任务线程的任务执行完成或取消时,方法还包括:将信号量的值加1。

进一步地,在通过信号量判断出多线程中的任务线程的数量达到任务最大并行数时,阻止线程池内的线程从url队列中获取任务之后,该方法还包括:控制线程池内的线程进入等待状态。

进一步地,在通过信号量判断多线程中的任务线程的数量是否达到任务最大并行数之前,该方法还包括:在网络爬虫启动时,从数据库中读取任务最大并行数,其中,数据库中预先存储有任务最大并行数;以及将任务最大并行数赋值给信号量,并作为信号量的初始值。

为了实现上述目的,根据本申请的另一方面,提供了一种控制网络爬虫的任务分配装置。网络爬虫采用多线程执行任务,多线程预先存放于线程池内,该装置包括:判断单元,用于通过信号量判断多线程中的任务线程的数量是否达到任务最大并行数,其中,信号量的初始值为任务最大并行数,任务线程为经过信号量的线程;阻止单元,用于在通过信号量判断出多线程中的任务线程的数量达到任务最大并行数时,阻止线程池内的线程从url队列中获取任务;以及第一控制单元,用于在通过信号量判断出多线程中的任务线程的数量未达到任务最大并行数时,控制线程池内的线程从url队列中获取任务。

进一步地,判断单元包括:判断模块,用于判断信号量的值是否为0;第一确定模块,用于在判断出信号量的值为0时,则确定多线程中的任务线程的数量达到任务最大并行数;以及第二确定模块,用于在判断出信号量的值不为0时,则确定多线程中的任务线程的数量未达到任务最大并行数。

进一步地,该装置还包括:减单元,用于在通过信号量判断出多线程中的任务线程的数量未达到任务最大并行数时,控制线程池内的线程从url队列中获取任务之后,将信号量的值减1,加单元,用于在任务线程的任务执行完成或取消时,将信号量的值加1。

进一步地,该装置还包括:第二控制单元,用于在通过信号量判断出多线程中的 任务线程的数量达到任务最大并行数时,阻止线程池内的线程从url队列中获取任务之后,控制线程池内的线程进入等待状态。

进一步地,该装置还包括:读取单元,用于在网络爬虫启动时,从数据库中读取任务最大并行数,其中,数据库中预先存储有任务最大并行数;以及赋值单元,用于将任务最大并行数赋值给信号量,并作为信号量的初始值。

本申请的网络爬虫采用多线程执行任务,多线程预先存放于线程池内,通过信号量判断多线程中的任务线程的数量是否达到任务最大并行数,其中,信号量的初始值为任务最大并行数,任务线程为经过信号量的线程;在通过信号量判断出多线程中的任务线程的数量达到任务最大并行数时,阻止线程池内的线程从url队列中获取任务;以及在通过信号量判断出多线程中的任务线程的数量未达到任务最大并行数时,控制线程池内的线程从url队列中获取任务,本申请通过信号量控制网络爬虫爬取任务数,不仅简化了爬虫系统的结构,而且可以避免网络爬虫执行过多或是过少的任务,解决了相关技术中通过中间控制器分配网络爬虫任务导致爬虫系统变得较为复杂的问题,进而达到了简化了爬虫系统的结构的效果。

附图说明

构成本申请的一部分的附图用来提供对本申请的进一步理解,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1是根据本申请实施例的控制网络爬虫的任务分配方法的流程图;以及

图2是根据本申请实施例的控制网络爬虫的任务分配装置的示意图。

具体实施方式

需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。

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

需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这 样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

为了便于描述,以下对本申请涉及的一些概念或术语进行说明:

爬虫系统,是指用于执行网页内容爬取的系统,在该爬虫系统中设置有网络爬虫。

网络爬虫,是一种按照预设规则自动抓取互联网中信息的程序或者脚本。

根据本申请实施例,提供了一种控制网络爬虫的任务分配方法。本申请实施例的网络爬虫采用对现场执行任务,多线程预先存放于线程池内。图1是根据本申请实施例的控制网络爬虫的任务分配方法的流程图,如图1所示,该方法包括如下的步骤s102至步骤s106:

步骤s102,通过信号量判断多线程中的任务线程的数量是否达到任务最大并行数,其中,信号量的初始值为任务最大并行数,任务线程为经过信号量的线程。

本申请实施例的信号量是基于计数器的一种多线程同步机制,在多线程环境下,信号量负责协调各线程,以保证各线程能够正确合理的使用公共资源。具体地,信号量通过一个计数器控制对共享资源的访问,信号量的值是一个非负整数,所有通过信号量的线程都会将该整数减1,如果信号量的值大于0,则访问被允许;如果信号量的值为0,则访问被禁止,所有试图经过信号量的线程都将处于等待状态。

本申请实施例中的任务最大并行数是指网络爬虫并行执行任务的最大数值,具体地,任务最大并行数可以根据爬虫系统的性能进行设置,例如,500,即最多可以并行处理500条任务。本申请实施例将该任务最大并行数作为信号量的初始值,也是信号量的最大值。可选地,任务最大并行数的值可以是预先在程序中指定,也可以是在程序执行过程中从数据库中获取。优选地,为了便于后期维护和修改,在通过信号量判断多线程中的任务线程的数量是否达到任务最大并行数之前,该方法还包括:在网络爬虫启动时,从数据库中读取任务最大并行数,其中,数据库中预先存储有任务最大并行数;以及将任务最大并行数赋值给信号量,并作为信号量的初始值。

本申请实施例的数据库可以是爬虫系统中的数据库,例如,用于存储爬虫系统的配置项的远程数据库。具体地,可以预先在数据库中配置任务最大并行数的字段和值,当启动网络爬虫时,从数据库中根据任务最大并行数的字段获取任务最大并行数的值,并将其赋值给信号量。本申请实施例通过网络爬虫从数据库中读取任务最大并行数的值,从而用户可以根据需求随时修改任务最大并行数的值,此外,网络爬虫通常部署 在多台机器上,通过从数据库中读取任务最大并行数的值便于快速实现多台机器上的网络爬虫的任务最大并行数的修改。

在本申请实施例中,网络爬虫采用多线程执行任务,因此,网络爬虫的所有线程执行任务时都必须经过信号量。具体地,当某个线程去执行任务时,会将信号量的值减1,当任务线程的数量达到最大任务并行数时,此时信号量的值减为0,其他线程此时必须等待,直到信号量的值大于0,即信号量得到释放。

可选地,通过信号量判断多线程中的任务线程的数量是否达到任务最大并行数包括:判断信号量的值是否为0;在判断出信号量的值为0时,则确定多线程中的任务线程的数量达到任务最大并行数;以及在判断出信号量的值不为0时,则确定多线程中的任务线程的数量未达到任务最大并行数。

由上可知,任务线程达到最大任务并行数时,信号量的值减为0,因此,可以通过信号量的值判断多线程中的任务线程的数量是否达到任务最大并行数。具体地,当信号量的值为0时,表示任务线程的数量达到任务最大并行数,当信号量的值大于0时,则表示任务线程的数量尚未达到任务最大并行数。

步骤s104,在通过信号量判断出多线程中的任务线程的数量达到任务最大并行数时,阻止线程池内的线程从url队列中获取任务。

为了避免网络爬虫执行过多任务崩溃,在判断出多线程中的任务线程的数量达到任务最大并行数时,阻止线程池内的线程从url队列中获取任务,即阻止从线程池内获取新的线程以及通过该线程从url队列中获取任务并执行,其中,url队列为用于存储待爬取url的队列,网络爬虫通过从url队列中获取待爬取url进行网页的爬取。可选地,在通过信号量判断出多线程中的任务线程的数量达到任务最大并行数时,阻止线程池内的线程从url队列中获取任务之后,该方法还包括:控制线程池内的线程进入等待状态。

具体地,在信号量的值为0时,将所有线程池内的线程都将处于等待状态,直至存在任务线程执行完任务或是取消任务,信号量释放(即信号量的值大于0)才允许处于等待状态的线程去url队列里获取任务执行。

步骤s106,在通过信号量判断出多线程中的任务线程的数量未达到任务最大并行数时,控制线程池内的线程从url队列中获取任务。

为了避免网络爬虫执行任务过少,浪费机器资源,在判断出多线程中的任务线程的数量未达到任务最大并行数时,控制线程池内的线程从url队列中获取任务,即从线程池内获取线程,并通过该线程从url队列中获取任务。可选地,在通过信号量判断出多线程中的任务线程的数量未达到任务最大并行数时,控制线程池内的线程从 url队列中获取任务之后,该方法还包括:将信号量的值减1。

需要说明的是,在任务线程的任务执行完成或取消时,该方法还包括:将信号量的值加1。

本申请实施例的网络爬虫采用多线程执行任务,通过信号量判断多线程中的任务线程的数量是否达到任务最大并行数,其中,信号量的初始值为任务最大并行数,任务线程为经过信号量的线程;在通过信号量判断出多线程中的任务线程的数量达到任务最大并行数时,阻止线程池内的线程从url队列中获取任务;以及在通过信号量判断出多线程中的任务线程的数量未达到任务最大并行数时,控制线程池内的线程从url队列中获取任务,本申请实施例通过信号量控制网络爬虫爬取任务数,无需额外的中间控制器,不仅简化了爬虫系统的结构,而且可以避免网络爬虫执行过多或是过少的任务,解决了相关技术中通过中间控制器分配网络爬虫任务导致爬虫系统变得较为复杂的问题,进而达到了简化了爬虫系统的结构的效果。

根据本申请又一实施例的控制网络爬虫的任务分配方法,包括如下步骤:

步骤s202,在远程数据库中配置任务最大并行数。

具体地,在远程数据库中配置任务最大并行数的字段和值。

步骤s204,网络爬虫初始化任务最大并行数。

具体地,当启动网络爬虫程序时,从远程数据库中根据任务最大并行数的字段获取任务最大并行数的值。

步骤s206,将任务最大并行数的值赋给信号量,并通过信号量控制网络爬虫的任务分配。

本申请实施例的信号量是基于计数器的一种多线程同步机制,在多线程环境下,信号量负责协调各线程,以保证各线程能够正确合理的使用公共资源。信号量通过一个计数器控制对共享资源的访问,信号量的值是一个非负整数,所有通过信号量的线程都会将该整数减1。具体地,如果信号量的值大于0,则访问被允许,信号量的值减1;如果信号量的值为0,则访问被禁止,此时,所有试图通过信号量的线程都将处于等待状态。

具体地,在爬虫架构中,网络爬虫是采用多线程去执行任务,所有的线程都会放在一个线程池内,当一个任务线程执行完一个任务后,就会从线程池内取出一个线程去执行任务。具体地,所有线程执行任务都必须经过信号量,当一个线程去执行任务时,会将信号量的值减1,当任务线程的数量达到最大任务并行数时,信号量的值减为0,其他线程(即线程池内的线程)此时必须等待,直到信号量的值大于0,即信号 量被释放;如果某个任务线程的任务执行完或被取消时,信号量被释放,即信号量值加1,此时又会有新的线程(例如,线程池内处于等待状态的线程)去url队列里获取任务执行。本申请实施例通过信号量智能的控制了网络爬虫爬取的任务数,避免爬虫执行过多或过少的任务。

从以上的描述中,可以看出,本申请实施例通过在远程数据库中配置网络爬虫爬取任务的任务最大并行数,并作为信号量的最大值,通过信号量智能的控制网络爬虫爬取任务数,省略了中间控制器,简化了爬虫系统;同时网络爬虫能够智能从url队列里获取适量的任务,使得整个爬虫系统变得更易操作和维护,同时能保证网络爬虫正常的爬取数据,从而可以避免因爬虫任务监控程序出现异常导致爬虫同时爬取过多任务或长时间空闲,进一步导致网络爬虫崩溃造成数据丢失或机器资源浪费等问题。

需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

根据本申请实施例的另一方面,提供了一种控制网络爬虫的任务分配装置,该控制网络爬虫的任务分配装置可以用于执行本申请实施例的控制网络爬虫的任务分配方法,本申请实施例的控制网络爬虫的任务分配方法也可以通过本申请实施例的控制网络爬虫的任务分配装置来执行。

需要说明的是,本申请实施例的网络爬虫采用多线程执行任务,图2是根据本申请实施例的控制网络爬虫的任务分配装置的示意图。如图2所示,该装置包括:判断单元10、阻止单元20和第一控制单元30。

判断单元10,用于通过信号量判断多线程中的任务线程的数量是否达到任务最大并行数,其中,信号量的初始值为任务最大并行数,任务线程为经过信号量的线程。

可选地,判断单元10包括:判断模块,用于判断信号量的值是否为0;第一确定模块,用于在判断出信号量的值为0时,则确定多线程中的任务线程的数量达到任务最大并行数;以及第二确定模块,用于在判断出信号量的值不为0时,则确定多线程中的任务线程的数量未达到任务最大并行数。

阻止单元20,用于在通过信号量判断出多线程中的任务线程的数量达到任务最大并行数时,阻止线程池内的线程从url队列中获取任务。

第一控制单元30,用于在通过信号量判断出多线程中的任务线程的数量未达到任务最大并行数时,控制线程池内的线程从url队列中获取任务。

本申请实施例的网络爬虫采用多线程执行任务,本申请通过判断单元10通过信号 量判断多线程中的任务线程的数量是否达到任务最大并行数,其中,信号量的初始值为任务最大并行数,任务线程为经过信号量的线程;阻止单元20在通过信号量判断出多线程中的任务线程的数量达到任务最大并行数时,阻止线程池内的线程从url队列中获取任务;以及第一控制单元30在通过信号量判断出多线程中的任务线程的数量未达到任务最大并行数时,控制线程池内的线程从url队列中获取任务,本申请实施例通过信号量控制网络爬虫爬取任务数,不仅简化了爬虫系统的结构,而且可以避免网络爬虫执行过多或是过少的任务,解决了相关技术中通过中间控制器分配网络爬虫任务导致爬虫系统变得较为复杂的问题,进而达到了简化了爬虫系统的结构的效果。

可选地,该装置还包括:减单元,用于在通过信号量判断出多线程中的任务线程的数量未达到任务最大并行数时,控制线程池内的线程从url队列中获取任务之后,将信号量的值减1,加单元,用于在任务线程的任务执行完成或取消时,将信号量的值加1。

可选地,该装置还包括:第二控制单元,用于在通过信号量判断出多线程中的任务线程的数量达到任务最大并行数时,阻止线程池内的线程从url队列中获取任务之后,控制线程池内的线程进入等待状态。

优选地,该装置还包括:读取单元,用于在网络爬虫启动时,从数据库中读取任务最大并行数,其中,数据库中预先存储有任务最大并行数;以及赋值单元,用于将任务最大并行数赋值给信号量,并作为信号量的初始值。

所述控制网络爬虫的任务分配装置包括处理器和存储器,上述判断单元、阻止单元和第一控制单元等均作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序单元来实现相应的功能。

处理器中包含内核,由内核去存储器中调取相应的程序单元。内核可以设置一个或以上,通过调整内核参数来控制网络爬虫的任务分配。

存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram),存储器包括至少一个存储芯片。

本申请还提供了一种计算机程序产品,当在数据处理设备上执行时,适于执行初始化有如下方法步骤的程序代码:通过信号量判断多线程中的任务线程的数量是否达到任务最大并行数,其中,信号量的初始值为任务最大并行数,任务线程为经过信号量的线程;在通过信号量判断出多线程中的任务线程的数量达到任务最大并行数时,阻止线程池内的线程从url队列中获取任务;以及在通过信号量判断出多线程中的任务线程的数量未达到任务最大并行数时,控制线程池内的线程从url队列中获取任 务。

上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。

在本申请的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述仅是本申请的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。

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