网络爬虫基本原理(二)

本文转载至 http://www.cnblogs.com/wawlian/archive/2012/06/18/2554072.html

四、更新策略

互联网是实时变化的,具有很强的动态性。网页更新策略主要是决定何时更新之前已经下载过的页面。常见的更新策略又以下三种:

1.历史参考策略

顾名思义,根据页面以往的历史更新数据,预测该页面未来何时会发生变化。一般来说,是通过泊松过程进行建模进行预测。

2.用户体验策略
    尽管搜索引擎针对于某个查询条件能够返回数量巨大的结果,但是用户往往只关注前几页结果。因此,抓取系统可以优先更新那些现实在查询结果前几页中的网页,而后再更新那些后面的网页。这种更新策略也是需要用到历史信息的。用户体验策略保留网页的多个历史版本,并且根据过去每次内容变化对搜索质量的影响,得出一个平均值,用这个值作为决定何时重新抓取的依据。
    3.聚类抽样策略

前面提到的两种更新策略都有一个前提:需要网页的历史信息。这样就存在两个问题:第一,系统要是为每个系统保存多个版本的历史信息,无疑增加了很多的系统负担;第二,要是新的网页完全没有历史信息,就无法确定更新策略。

这种策略认为,网页具有很多属性,类似属性的网页,可以认为其更新频率也是类似的。要计算某一个类别网页的更新频率,只需要对这一类网页抽样,以他们的更新周期作为整个类别的更新周期。基本思路如图:

五、分布式抓取系统结构
    一般来说,抓取系统需要面对的是整个互联网上数以亿计的网页。单个抓取程序不可能完成这样的任务。往往需要多个抓取程序一起来处理。一般来说抓取系统往往是一个分布式的三层结构。如图所示:

最下一层是分布在不同地理位置的数据中心,在每个数据中心里有若干台抓取服务器,而每台抓取服务器上可能部署了若干套爬虫程序。这就构成了一个基本的分布式抓取系统。

对于一个数据中心内的不同抓去服务器,协同工作的方式有几种:

1.主从式(Master-Slave)

主从式基本结构如图所示:

对于主从式而言,有一台专门的Master服务器来维护待抓取URL队列,它负责每次将URL分发到不同的Slave服务器,而Slave服务器则负责实际的网页下载工作。Master服务器除了维护待抓取URL队列以及分发URL之外,还要负责调解各个Slave服务器的负载情况。以免某些Slave服务器过于清闲或者劳累。

这种模式下,Master往往容易成为系统瓶颈。

2.对等式(Peer to Peer)

对等式的基本结构如图所示:

在这种模式下,所有的抓取服务器在分工上没有不同。每一台抓取服务器都可以从待抓取在URL队列中获取URL,然后对该URL的主域名的hash值H,然后计算H mod m(其中m是服务器的数量,以上图为例,m为3),计算得到的数就是处理该URL的主机编号。

举例:假设对于URL www.baidu.com,计算器hash值H=8,m=3,则H mod m=2,因此由编号为2的服务器进行该链接的抓取。假设这时候是0号服务器拿到这个URL,那么它将该URL转给服务器2,由服务器2进行抓取。

这种模式有一个问题,当有一台服务器死机或者添加新的服务器,那么所有URL的哈希求余的结果就都要变化。也就是说,这种方式的扩展性不佳。针对这种情况,又有一种改进方案被提出来。这种改进的方案是一致性哈希法来确定服务器分工。其基本结构如图所示:

一致性哈希将URL的主域名进行哈希运算,映射为一个范围在0-232之间的某个数。而将这个范围平均的分配给m台服务器,根据URL主域名哈希运算的值所处的范围判断是哪台服务器来进行抓取。

如果某一台服务器出现问题,那么本该由该服务器负责的网页则按照顺时针顺延,由下一台服务器进行抓取。这样的话,及时某台服务器出现问题,也不会影响其他的工作。

参考书目:

1.《这就是搜索引擎——核心技术详解》  张俊林  电子工业出版社

2.《搜索引擎技术基础》         刘奕群等 清华大学出版社

时间: 2024-12-14 14:25:13

网络爬虫基本原理(二)的相关文章

GJM:用C#实现网络爬虫(二) [转载]

上一篇<用C#实现网络爬虫(一)>我们实现了网络通信的部分,接下来继续讨论爬虫的实现 3. 保存页面文件 这一部分可简单可复杂,如果只要简单地把HTML代码全部保存下来的话,直接存文件就行了. 1 private void SaveContents(string html, string url) 2 { 3 if (string.IsNullOrEmpty(html)) //判断html字符串是否有效 4 { 5 return; 6 } 7 string path = string.Form

GJM:用C#实现网络爬虫(二)

网络爬虫在信息检索与处理中有很大的作用,是收集网络信息的重要工具. 接下来就介绍一下爬虫的简单实现. 爬虫的工作流程如下 爬虫自指定的URL地址开始下载网络资源,直到该地址和所有子地址的指定资源都下载完毕为止. 下面开始逐步分析爬虫的实现. 1. 待下载集合与已下载集合 为了保存需要下载的URL,同时防止重复下载,我们需要分别用了两个集合来存放将要下载的URL和已经下载的URL. 因为在保存URL的同时需要保存与URL相关的一些其他信息,如深度,所以这里我采用了Dictionary来存放这些UR

用C#实现网络爬虫(二)

上一篇<用C#实现网络爬虫(一)>我们实现了网络通信的部分,接下来继续讨论爬虫的实现 3. 保存页面文件 这一部分可简单可复杂,如果只要简单地把HTML代码全部保存下来的话,直接存文件就行了. 1 private void SaveContents(string html, string url) 2 { 3 if (string.IsNullOrEmpty(html)) //判断html字符串是否有效 4 { 5 return; 6 } 7 string path = string.Form

基于C#.NET的高端智能化网络爬虫(二)(攻破携程网)

本篇故事的起因是携程旅游网的一位技术经理,豪言壮举的扬言要通过他的超高智商,完美碾压爬虫开发人员,作为一个业余的爬虫开发爱好者,这样的言论我当然不能置之不理.因此就诞生了上一篇基础爬虫以及这一篇高级爬虫的开发教程. 有人评论我上一篇的简单爬虫:代码太过简单以至于弱爆了,真是被这群有文化的孩子给雷到了!不得不猜测你是不是携程网的托儿,我还没写完你咋就知道弱爆了?看来不下点猛料你是得不到满足啊! 今天我们就来学习高级爬虫的开发,同时我们还要利用之前的简单爬虫程序,来实现分布式爬虫的Links Mas

Pyhon网络爬虫(二)

就像学驾照你需要一台车,幸运的是我们的爬虫在上一篇已经选择了Pyhton,恭喜你,这是一辆自动档的车,相信你可以愉快轻松的上路 我们学习第一步:requests库 我们的爬虫如何进入网络,路在哪里? URL便是我们的入口,网络上的资源全部都可以通过URL链接得到 URL的格式 我们利用requests库可以轻松,通过URL访问网络 (1)安装requests库 Windows 平台 运行 cmd,执行pip install requests (安装出问题,请检查配置环境变量) (2)尝试第一个程

老蜗牛写采集:网络爬虫(二)

短小精悍的xNet 这个一个俄国牛人写的开源工具,为啥说他强悍了,因为他将所有Http协议的底层都实现了一遍,这有啥好处?只要你是写爬虫的,都会遇到一个让人抓狂的问题,就是明明知道自己Http请求头跟浏览器一模一样了,为啥还会获取不到自己想要的数据.这时你如果使用HttpWebReaquest,你只能调试到GetRespone,底层的字节流是调试不到了.所以必须得有个更深入的底层组件,方便自己调试.以下是xNet的开源地址:https://github.com/X-rus/xNet快速入门 快速

python网络爬虫(二)requests库的基本介绍和使用

一.requests库的七个重要方法 (1)最常用方法:requests.get(url,params=None,**kwargs)//对应HTTP协议的GET()操作 (请求获得URL位置的资源) ① url:拟获取页面的url链接.url:在WWW上,每一信息资源都有统一的且在网上唯一的地址, 该地址就叫URL(Uniform Resource Locator,统一资源定位符),它是WWW的统一资源定 位标志,就是指网络地址.例:http://baidu.com ② params:url中的

[Python]网络爬虫(二):利用urllib2通过指定的URL抓取网页内容

版本号:Python2.7.5,Python3改动较大. 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. 类似于使用程序模拟IE浏览器的功能,把URL作为HTTP请求的内容发送到服务器端, 然后读取服务器端的响应资源. 在Python中,我们使用urllib2这个组件来抓取网页.urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件. 它以urlopen函数的形式提供了一个非常简单的接口. 最简单的urllib2

Python网络爬虫实战(二)数据解析

上一篇说完了如何爬取一个网页,以及爬取中可能遇到的几个问题.那么接下来我们就需要对已经爬取下来的网页进行解析,从中提取出我们想要的数据. 根据爬取下来的数据,我们需要写不同的解析方式,最常见的一般都是HTML数据,也就是网页的源码,还有一些可能是Json数据,Json数据是一种轻量级的数据交换格式,相对来说容易解析,它的格式如下. { "name": "中国", "province": [{ "name": "黑龙江