海纳百川 有容乃大(http://www.brtech.com.cn)

海纳百川,有容乃大(http://www.brtech.com.cn)

  :: 首页 :: 博问 :: 闪存 :: :: 联系 :: 订阅 订阅 :: 管理 ::
第七章         Spider采集

信息采集系统的最前沿就是与Internet相连的Spider采集,也叫“网络蜘蛛”,是系统专门与具体的Web协议打交道的部分。主要通过各种Web协议来自动采集WWW站点内有效的信息(包括文本、超链接文本、图象、声音、影像、压缩包等各类文档)。这些Web协议包括HTTPFTP以及BBS,我们还根据用户的需要,采集了Web ChatICQ等特殊信息。本章先就Spider结构作了一个简要说明,然后详细论述了我们的相关算法。

7.1 Spider的系统模型

 

 

 

如图7.1所示,为了能够高效地采集页面数据,我们在Spider系统中采用了Client / Server结构。 “网络蜘蛛”由一台或多台Spider构成,它们通过内部通信,由信息服务器统一管理并协同工作。由于Spider的效率受采集平台、网络性能等诸多限制,为了达到比较理想的采集速度,我们采用了用多个Spider同时并行采集的策略。具体并行的Spider个数需要根据实际的采集速度要求和网络环境而定。

显而易见,采用服务器/采集器的结构使采集系统具有很好的可扩展性。管理员可根据系统采集规模的变化动态地调整采集器的数量,在保证系统性能的前提下尽量减少系统开销,达到最佳的性能/价格比。而且在规模动态变化的过程中,系统能维持一致的管理和数据输出接口。

我们这里所说的信息服务器主要负责对全局URL队列中的URL进行分发、对采集到的页面信息和文件信息进行缓存和压缩以及在采集过程中的一些协调和控制。这一部分所要处理的一个中心问题就是URL的分配策略,以便能够快速的有效的利用多个Spider共同高效采集。为了实现的简单性,我们采用了轮转法进行分配。并且当某个Spider没有待采集的URL时,它也会主动向URL分发器发送URL请求。

每个Spider的任务就是将信息服务器分配给它的URL按照到来的先后顺序插入到自己的URL队列中,然后不停的从队首取出URL进行采集,直到自己的URL队列为空。另一种URL入队的方法是根据URL的主题相关性评分高低插入自己的URL队列(评分最高的放在队首),但插入队列的时间代价和入队时的互斥操作都会影响采集的效率,而此方法换来的好处“更加优先的采集评分更高的页面”也并不太影响最终采集页面的质量。因此, 我们选择了前者这种简单的方法。为了提高进一步的采集效率,在每个Spider上我们采用了多线程方式。

7.2 采集算法及实现

7.2.1 URL的调度策略

为了提高分布式采集的效率,一般常用两种调度策略:静态调度和动态调度。

静态调度相对比较简单,它并不看采集器当时的负载情况,而是按事先的决策进行页面的分配。目前,主要有三种方法。1).轮转法,即将待采集的页面依次分配给n个采集器,直观上看,每个采集器被分配了相同的采集页面数,但是由于每个页面的连接时间不同,页面的大小也不同,尤其在复杂多变的网络环境下,分配不均衡几乎是不可避免的。2)加权轮转法,针对刚才提到的轮转法的缺点,将导致分配不均的主要因素网络连接时间长短作为权值,来引导轮转。一般来说,初始采集很难知道页面连接的时间长短,所以此时不能用加权轮转法,但由于网络中大部分网站在一段时间内的平均连接时间变化不大,因此在刷新的时候可以用加权轮转法,试验说明此时加权轮转法好于轮转法。3).随机选择法,假设每个页面的采集时间满足指数分布,每个采集器的处理能力为C1,C2, … ,Cn ,则以概率  /   k=1,2, … , n  为采集器K分配待采集页面。当每个采集器的处理能力相同时,则对每个采集器按概率为1/n分配页面。

实际的Web是异构的、无序的和复杂的,文件格式各式各样,网络状况也随时间变化莫测。采用静态调度策略,并不考虑Web当前的负载情况这一重要信息,结果常常难以令人满意。相应的,根据当前的负载情况进行调度的策略称为动态调度,这是一种更加智能化的方法,但算法往往比较复杂,维持此方法的系统开销也较大。主要有以下几种方法:1). 最低负载法,即将页面总是分配给当前负载最低的采集器。这个算法的问题在于:收集各个采集器的当前负载会导致额外的开销,并且过时的信息可能导致误判。2).Pick-2方法,在这种复杂的环境中,与其增加大量的开销以跟踪负载,倒不如简单的增加选择的随机性以模拟环境的随机性。事实上,这样反而会改善整个系统的性能。Pick-2方法就是这样一个例子,它是指随机的选择两个采集器,并选择负载较低的一个采集器分配页面。同理,Pick-k就是随机的选择k个采集器进行比较,当k=n时,Pick-k方法就退化成最低负载法了,当k=1时,Pick-k方法就变成了我们前边说的随机分配法。MitzenmacherPick-k进行了实验分析,他认为在大多数情况下,k=2是较好的选择[马晓星&吕建]

对于我们的系统来说,首先这是一个试验系统,试验的重点并不是分布式,而主要是测试页面和URL的过滤算法和系统的整体工作运转情况;其次,我们系统中所并行的各个Spider的环境较相似(网络环境和机器性能),所以我们选择了较简单的轮转法。

7.2.2 每个Spider的抓取流程

 

                    7.2 Spider的抓取流程

 

抓取工作流程如图7.2所示,大致步骤如下:

1)        如果采集数据达到300K(上传数据阈值),则上传数据到信息服务器。

2)        URL队列中取出一个URL放入协议判断器中。如果此时URL队列为空,则转入7),否则转入3)

3)        根据URL头部的协议信息,协议判断器对URL所采用的协议进行判断,如果是HTTP协议,转入4),如果是FTP协议,转入5),如果是BBS协议,转入6)

4)        启动采集Http协议的线程HttpPageControl,对本页通过HttpConnection进行采集。采集完后保存此页,转入1)

5)        启动采集Ftp协议的线程FtpPageControl,对本页通过FtpConnection进行采集。采集完后保存此页,转入1)

6)        启动采集Bbs协议的线程BbsPageControl,对本页通过BbsConnection进行采集。采集完后保存此页,转入1)

7)        向信息服务器发送请求URL指令,采集完毕。

7.2.3 抓取页面时的处理

因为所抓取的主要页面都是符合HTTP协议的,所以我们以HTTP协议为例,说明具体的页面抓取时的处理。在页面抓取过程中用Socket实现了基本的HTTP协议。采集器可以经由指定的代理服务器(Proxy)采集目标URL,并且在目标URL要求身份认证时能自动用事先设置好的用户标识和口令应答。抓取页面的主要实现算法如下

1)        分析页面URL,抽出目标站点地址和端口号,若无端口号设为HTTP默认端口80。判断该站点的连接方式设置,若设为直接连接则与该地址和端口建立网络连接;若设为穿越Proxy连接则与指定的Proxy地址和端口建立网络连接。

2)        若建立网络连接失败,说明该站点不可达,中止抓取该页面并将其抛弃;否则继续下一步骤获取指定页面。

3)        由页面URL组装HTTP请求头,若该站点需要用户标识和口令则将其填入请求头中,发送请求到目标站点。若超过一定时间未收到应答消息则中止抓取该页面并将其抛弃;否则继续下一步骤分析应答消息。

4)        分析应答头,判断返回的状态码:

Ø        若状态码为2xx,返回正确页面,进入步骤5)

Ø        若状态码为301302,表示页面被重定向,从应答头中提取出新的目标URL,转入步骤3)

Ø        若状态码为其它,说明页面连接失败,中止抓取该页面并将其抛弃。

5)        从应答头中提取出日期、长度、页面类型等页面信息。若设置了页面抓取限制,进行必要的判断和过滤,抛弃不符合要求的页面。

6)        读取页面的内容。对于长度较大的页面,采用分块读取再拼接的方法保证页面内容的完整。至此该页面的抓取完成。

7.2.4 采集数据的组织

采集的数据存储主要有两个数据库:缓存数据库,页面记录数据库。

缓存库保存采集到的站点源页面,每个页面存成单独文件。每个站点创建一独立的目录,并按照页面URL中体现的层次组建本地缓存文件的目录。例如,页面“www.ncic.ac.cn/dir1/file1”在缓存库中对应文件即为“[CACHEBASE]/www.ncic.ac.cn/dir1”目录下的“file1”文件,其中[CACHEBASE]指缓存库的根目录。由于URL可能包含文件名中不允许的特殊字符,在转换成目录和文件名时要用系统规定的转义字符替换。

所采集页面的长度、更新日期、标题等数据存储在页面记录数据库中。每个页面对应库中的一条记录,包含了页面的简要说明,在后续的某些处理过程中可以从中获得必要的信息而不必再查看源页面。

posted on 2006-03-26 02:54  阿昆  阅读(693)  评论(0编辑  收藏  举报