抓取提速策略(合作抓取策略)
提速基本可以采用下面几种方法。
(1)提高抓取单个网页的速度。
(2)尽可能减少不必要的抓取任务。
(3)增加同时工作的爬虫数量。
事实证明,受到万维网发展水平的限制,第(1)种方法基本不可行,单个网页的抓取速度受到下载带宽的限制,在现有技术条件下很难任意提高;第(2)种方法难度很大,由于需要和万维网的变化保持紧密同步,所以冗余的抓取总是不可避免的,减少不必要的抓取会导致网页重访不及时,这样就不能快速同步目标网页的变化;第(3)种方法通过增加爬虫数量提高总体抓取速度是可行的。
在多个爬虫抓取的情况下,如何将工作量分解成为主要的问题,即要解决一个网页交给哪一个爬虫抓取?如果分工不明,很可能多个爬虫抓取了相同的网页,从而引入额外的开销。通常采用以下两种方法来进行抓取任务的分解。
(1)通过Web主机的IP地址来分解,使某个爬虫仅抓取某个地址段的网页。
(2)通过网页的域名来分解,使某个爬虫仅抓取某个域名段的网页。
如何选择这两种方案呢?
万维网在网络基础设施中按照IP地址来确定主机位置,IP地址为点分十进制数,难于记忆。由此采用了域名对IP地址进行一次映射,由于域名对人友好,于是出现了一些问题,即存在多个域名对应同样的IP的情况,对于中小网站来说,通常采用这种方法提供不同的Web服务。这主要出于经济的考虑,因为可以只配置一台服务器。而对于大型网站,如新浪和搜狐这些门户网站通常采用负载均衡的IP组技术,同样的域名对应于多个IP地址,一方面提高系统健壮性,一方面做到了负载均衡。
鉴于多域名对应相同IP和同域名对应多IP的情况,通常的做法是按照域名分解任务。即只要保证不重复抓取大型网站的网页,小型网站即便重复抓取也可以接受的策略分配任务。这种分配方法将不同的域名分配给不同的爬虫抓取,某一个爬虫只抓取固定一个域名集合下的网页。例如sina.com.cn会固定交给spider1抓取,zoujingsousuoyinq.cn会固定交给spider2抓取,zoujingsousuoyinqbook.cn会固定交给spider3抓取等。
这两种方案的主要区别可以通过下面两个例子进一步理解。
假定zoujingsousuoyinq.cn和zoujingsousuo yinqbook.cn是两个域名不同、但IP相同的网站,假定为10.10.67.208。有这样两个网页,即http://www.zoujingsousuoyinq.cn/index.html和http://www.zoujingsousuoyinqbook.cn/index.html,在经过域名解析后,实际上它们同为http://10.10.67.208/index.html。采用域名分解的方案,spider2和spider3就会重复抓到这个网页。由于这两个站点信息较小,所以可以容忍因抓重而带来的损失。
反之,我们如果通过IP分配抓取任务的方案,例如sina.com.cn(71.5.7.138)被“指定”交给spider1抓取,sina.com.cn(71.5.6.136)被“指定”交给spider2抓取,zoujingsousuoyinq.cn(10.10.67.208)被“指定”交给spider3抓取,zoujingsousuo yinqbook.cn(10.10.67.208)被“指定”交给spider3抓取。这种分配方案,对于不同域名指向相同IP的情况,例如zoujingsousuoyinq.cn和zoujingsousuoyinqbook.cn的抓取工作都由spider3完成,没有重复抓取问题。但是sina.com.cn对应多个IP,被分配由spider1和spider2分别抓取,这样spider1和spider2抓取工作就相互重复。很显然,新浪属于大型网站,这种因为抓重带来的损失往往是巨大的。
通过比较,为了照顾大站按照域名分解的策略更加合理。在下载系统中,按照域名分解抓取任务(网页集合)的工作由一个称为“调度员”的模块来处理,通过域名分解将不同的网页调度给不同的爬虫进行抓取。因此,下载系统主要由爬虫和调度员构成。
形式化的调度分配方式如下:
首先假定有n个爬虫可以并行工作,并且定义一个可以提取URL域名的函数domain,例如:
说明如下:
(1)对于任意的URL,利用domain函数提取URL的域名。
(2)用MD5签名函数签名域名,MD5(domain(URL))。
(3)将MD5签名值对n取模运算,int spider_no=MD5(domain(URL))%n。
(4)该URL分配给编号为spider_no的爬虫进行抓取。
由于模运算可以实现将一个全集分成多个等价类,所以等价类的并集等于全集,且一个等价类中的元素必然不属于另一个等价类中。
等价关系形式化表述如下。
令U为全集,通过某种等价关系可以将集合U分别映射到集合S1,S2,...,Sn上,并且满足如下两个条件:
(1)S1∪S2∪...∪Sn=U。
(2)∀a∈Si,∀b∈Sj,Si!=Sj,则有a!=b。