Spider系统是搜索引擎当中进行互联网上数据采集的一个核心子系统。在这个子系统当中,通常先种入一批种子Url,Spider对这些种子Url采集之后将链接提取入库,然后再对新入库的Url进行采集,并且负责对采集过的Url进行更新采集,如此循环。
随着各种垂直搜索引擎的不断发展,整个Spider在功能上又分为传统的收集互联网上所有数据的大Spider和服务于某个专门领域的聚焦 Spider。两类Spider的不同之处在于,后者需要一个过滤器来过滤掉那些专门领域不要的Url。从架构上来讲,两类Spider通常都会采用分布式的架构。从技术实现上来说,Spider通常都会包括Url存储库,抓取调度模块,页面采集模块,链接分析和抽取模块,反垃圾模块等几个核心模块。本文就Url存储、抓取调度的主流技术和技术难点做一个简单的描述。
1:Url存储库:近些年互联网发展迅猛,互联网上的Url数量也极为庞大,所以对Url库的核心要求之一就是可扩展性必须要很强,在爬行过程中Url 数目逐步增大时,要能及时的进行扩展。另外一个要求就是能便于抓取调度技术的实施。当然,对容错性和负责均衡方面也需要有充足的考虑。
2:抓取调度: 如果把Spider看成互联网上的蜘蛛的话,抓取调度模块就是蜘蛛的大脑,它会根据Url库里面收录的Url的情况,来调度指挥蜘蛛先爬哪些Url,后爬哪些Url。对于一个Spider来说,有两类调度需要处理,一类是未抓Url的抓取,一类是已抓Url的更新抓取。
未抓Url的抓取调度策略通常分为如下三大类:深度优先抓取,广度优先抓取和最优调度优先抓取。
深度优先抓取会在每个Site里面一个分支一个分支的进行抓透。由于互联网上很多站点都存在类似陷阱的情况,采用深度优先抓取通常容易在某个Site内陷入死循环。广度优先通常会沿着某个Site的每一层来抓,先抓完一层然后再抓下一层。由于能有效避免深度优先抓取可能会陷入死循环的问题,广度优先抓取得到了较为广泛的使用。然而,对于广度优先抓取来说,要抓取到某个Site内层次比较深的高信息含量的数据,通常会比较困难。
为了有效地避免上述问题,最优调度优先抓取的方法被Spider的一些研究人员提出。在这种调度方法中,通常会一边抓取一边进行抓取Url的质量评估,用已抓Url的质量来预估未抓Url集合当中每个Url的质量,然后使用这些质量因子对未抓Url进行排序,依据排序的结果来进行抓取调度,例如,通过抓取Url后形成的链接地图计算PageRank之后,按照PageRank值的大小来进行排序等。
已抓Url的更新抓取是调度系统中的一个难点,一种最简单的方法是将所有已经抓取过的Url设置一个下一次抓取的时间值,对其进行定期更新。然而,在互联网上,各个站点的活跃度,同一个站点内的不同Url的更新活跃度都存在很大的差异。如果采用统一的值定期更新的方法,一方面活跃站点的活跃页面通常会被更新不及时,这样会造成一些链接的遗失和一部分索引数据的老化;另外一方面,不活跃站点的Url会造成大量的无效更新,降低了更新的效率。
一些技术文章曾经有过少量的介绍Google对不同的站点采用不同的更新周期,例如教育网当中的页面更新周期会明显长于一些商业网站。然而,在站点级别上进行区别是远远不够的,调度当中最好能够对单个的Url根据其属性采用不同的更新周期,具体的做法值得深入研究。
抓取调度中的另一个难点是对每个Site的压力评估,在这个方面,Google可能是行业的领先者,其优雅抓取的方式得到了大部分站点的认可。
压力评估的一个困难在于互联网上各个站点服务器能力的不同和服务架构的不同。大型的网站通常采用CDN的方式为用户服务,其服务能力超强,对于这些站点,Spider每天抓取上百万的Url对其流量都影响不大。而一些小型站点通常采用服务器托管的方式,一方面带宽有限,另外一个方面多个站点通常共用一个服务器,多站点的并行抓取通常会使得那些服务器瘫痪。
压力评估的另外一个困难在于大部分的站点都会期望白天服务期间,Spider能尽量少抓取页面;而到了晚上能多抓取页面。这个期望看起来对Spider 来说好像比较简单,但事实并非如此,因为活跃站点每天都会产生大量的新页面,搜索引擎是希望能及时发现和收录这些新页面,目前对搜索引擎的要求甚至到了分钟级别。而及时发现和收录这些新页面就涉及到如何才能精准的找到并且及时更新发布这些新页面的父页面,若精准性做的好,白天下载的量可以适量减少,否则就只能以量来补准了。
随着各种垂直搜索引擎的不断发展,整个Spider在功能上又分为传统的收集互联网上所有数据的大Spider和服务于某个专门领域的聚焦 Spider。两类Spider的不同之处在于,后者需要一个过滤器来过滤掉那些专门领域不要的Url。从架构上来讲,两类Spider通常都会采用分布式的架构。从技术实现上来说,Spider通常都会包括Url存储库,抓取调度模块,页面采集模块,链接分析和抽取模块,反垃圾模块等几个核心模块。本文就Url存储、抓取调度的主流技术和技术难点做一个简单的描述。
1:Url存储库:近些年互联网发展迅猛,互联网上的Url数量也极为庞大,所以对Url库的核心要求之一就是可扩展性必须要很强,在爬行过程中Url 数目逐步增大时,要能及时的进行扩展。另外一个要求就是能便于抓取调度技术的实施。当然,对容错性和负责均衡方面也需要有充足的考虑。
2:抓取调度: 如果把Spider看成互联网上的蜘蛛的话,抓取调度模块就是蜘蛛的大脑,它会根据Url库里面收录的Url的情况,来调度指挥蜘蛛先爬哪些Url,后爬哪些Url。对于一个Spider来说,有两类调度需要处理,一类是未抓Url的抓取,一类是已抓Url的更新抓取。
未抓Url的抓取调度策略通常分为如下三大类:深度优先抓取,广度优先抓取和最优调度优先抓取。
深度优先抓取会在每个Site里面一个分支一个分支的进行抓透。由于互联网上很多站点都存在类似陷阱的情况,采用深度优先抓取通常容易在某个Site内陷入死循环。广度优先通常会沿着某个Site的每一层来抓,先抓完一层然后再抓下一层。由于能有效避免深度优先抓取可能会陷入死循环的问题,广度优先抓取得到了较为广泛的使用。然而,对于广度优先抓取来说,要抓取到某个Site内层次比较深的高信息含量的数据,通常会比较困难。
为了有效地避免上述问题,最优调度优先抓取的方法被Spider的一些研究人员提出。在这种调度方法中,通常会一边抓取一边进行抓取Url的质量评估,用已抓Url的质量来预估未抓Url集合当中每个Url的质量,然后使用这些质量因子对未抓Url进行排序,依据排序的结果来进行抓取调度,例如,通过抓取Url后形成的链接地图计算PageRank之后,按照PageRank值的大小来进行排序等。
已抓Url的更新抓取是调度系统中的一个难点,一种最简单的方法是将所有已经抓取过的Url设置一个下一次抓取的时间值,对其进行定期更新。然而,在互联网上,各个站点的活跃度,同一个站点内的不同Url的更新活跃度都存在很大的差异。如果采用统一的值定期更新的方法,一方面活跃站点的活跃页面通常会被更新不及时,这样会造成一些链接的遗失和一部分索引数据的老化;另外一方面,不活跃站点的Url会造成大量的无效更新,降低了更新的效率。
一些技术文章曾经有过少量的介绍Google对不同的站点采用不同的更新周期,例如教育网当中的页面更新周期会明显长于一些商业网站。然而,在站点级别上进行区别是远远不够的,调度当中最好能够对单个的Url根据其属性采用不同的更新周期,具体的做法值得深入研究。
抓取调度中的另一个难点是对每个Site的压力评估,在这个方面,Google可能是行业的领先者,其优雅抓取的方式得到了大部分站点的认可。
压力评估的一个困难在于互联网上各个站点服务器能力的不同和服务架构的不同。大型的网站通常采用CDN的方式为用户服务,其服务能力超强,对于这些站点,Spider每天抓取上百万的Url对其流量都影响不大。而一些小型站点通常采用服务器托管的方式,一方面带宽有限,另外一个方面多个站点通常共用一个服务器,多站点的并行抓取通常会使得那些服务器瘫痪。
压力评估的另外一个困难在于大部分的站点都会期望白天服务期间,Spider能尽量少抓取页面;而到了晚上能多抓取页面。这个期望看起来对Spider 来说好像比较简单,但事实并非如此,因为活跃站点每天都会产生大量的新页面,搜索引擎是希望能及时发现和收录这些新页面,目前对搜索引擎的要求甚至到了分钟级别。而及时发现和收录这些新页面就涉及到如何才能精准的找到并且及时更新发布这些新页面的父页面,若精准性做的好,白天下载的量可以适量减少,否则就只能以量来补准了。