分布式网络爬虫关键技术分析与实现0001_第1页
分布式网络爬虫关键技术分析与实现0001_第2页
分布式网络爬虫关键技术分析与实现0001_第3页
分布式网络爬虫关键技术分析与实现0001_第4页
分布式网络爬虫关键技术分析与实现0001_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、? 一、 研究所属范围分布式网络爬虫包含多个爬虫, 每个爬虫需要完成的任务和单个的爬行器类似, 它们从互联 网上下载网页,并把网页保存在本地的磁盘,从中抽取URL并沿着这些 URL 的指向继续爬行。由于并行爬行器需要分割下载任务,可能爬虫会将自己抽取的URL 发送给其他爬虫。这些爬虫可能分布在同一个局域网之中,或者分散在不同的地理位置。根据爬虫的分散程度不同,可以把分布式爬行器分成以下两大类:1、基于局域网分布式网络爬虫:这种分布式爬行器的所有爬虫在同一个局域网里运行,通过高 速的网络连接相互通信。 这些爬虫通过同一个网络去访问外部互联网, 下载网页, 所有的网 络负载都集中在他们所在的那个局

2、域网的出口上。 由于局域网的带宽较高, 爬虫之间的通信 的效率能够得到保证; 但是网络出口的总带宽上限是固定的, 爬虫的数量会受到局域网出口 带宽的限制。2、基于广域网分布式网络爬虫: 当并行爬行器的爬虫分别运行在不同地理位置 (或网络位置) , 我们称这种并行爬行器为分布式爬行器。例如,分布式爬行器的爬虫可能位于中国,日本, 和美国,分别负责下载这三地的网页;或者位于CHINANET ,CERNET,CEINET,分别负责下载这三个网络的中的网页。分布式爬行器的优势在于可以子在一定程度上分散网络流量, 减小网络出口的负载。如果爬虫分布在不同的地理位置(或网络位置), 需要间隔多长时间 进行一

3、次相互通信就成为了一个值得考虑的问题。 爬虫之间的通讯带宽可能是有限的, 通常 需要通过互联网进行通信。在实际应用中, 基于局域网分布式网络爬虫应用的更广一些, 而基于广域网的爬虫由于 实现复杂, 设计和实现成本过高, 一般只有实力雄厚和采集任务较重的大公司才会使用这种 爬虫。本论文所设计的爬虫就是基于局域网分布式网络爬虫。、分布式网络爬虫整体分析分布式网络爬虫的整体设计重点应该在于爬虫如何进行通信。 目前分布式网 络爬虫按通信方式不同分布式网路爬虫可以分为主从模式、 自治模式与混合模式 三种。主从模式是指由一台主机作为控制节点负责所有运行网络爬虫的主机进行管理, 爬虫只 需要从控制节点那里接

4、收任务, 并把新生成任务提交给控制节点就可以了, 在这个过程中不 必与其他爬虫通信,这种方式实现简单利于管理。而控制节点则需要与所有爬虫进行通信, 它需要一个地址列表来保存系统中所有爬虫的信息。 当系统中的爬虫数量发生变化时, 协调 者需要更新地址列表里的数据, 这一过程对于系统中的爬虫是透明的。 但是随着爬虫网页数 量的增加。 控制节点会成为整个系统的瓶颈而导致整个分布式网络爬虫系统性能下降。 主从 模式的整体结构图:自治模式是指系统中没有协调者,所有的爬虫都必须相互通信,比主从模式 下爬虫要复杂一些。 自治模式的通信方式可以使用全连接通信或环形通信。 全连 接通信是指所用爬虫都可以相互发送

5、信息, 使用这种方式的每个网络爬虫会维护 一个地址列表, 表中存储着整个系统中所有爬虫的位置, 每次通信时可以直接把 数据发送给需要此数据的爬虫。 当系统中的爬虫数量发生变化时, 每个爬虫的地 址列表都需要进行更新。 环形通信是指爬虫在逻辑上构成一个环形网, 数据在环 上按顺时针或逆时针单向传输, 每个爬虫的地址列表中只保存其前驱和后继的信 息。爬虫接收到数据之后判断数据是否是发送给自己的, 如果数据不是发送给自 己的,就把数据转发给后继;如果数据是发送给自己的,就不再发送。假设整个 系统中有 n 个爬虫,当系统中的爬虫数量发生变化时, 系统中只有 n-1 个爬虫的 地址列表需要进行更新。混合

6、模式是结合上面两种模式的特点的一种折中模式。 该模式所有的爬虫都可以 相互通信同时都具有任务分配功能。 不过所有爬虫中有个特殊的爬虫, 该爬虫主 要功能对已经经过爬虫任务分配后无法分配的任务进行集中分配。 使用这个方式 的每个网络爬虫只需维护自己采集范围的地址列表。 而特殊爬虫需除了保存自己 采集范围的地址列表外还保存需要进行集中分配的地址列表。 混合模式的整体结 构图:三、大型分布式网络爬虫体系结构图:从这些图可以看出, 分布式网络爬虫是一项十分复杂系统。 需要考虑很多方面因素。 性 能可以说是它这重要的指标。当然硬件层面的资源也是必须的。不过不在本系列考虑范围。 从下篇开始, 我将从单机网

7、络爬虫一步步介绍我们需要考虑的问题的解决方案。 如果大家有 更好的解决方案。欢迎指教。吉日的一句话说的很有道理, 一个人一辈子只能做好几件事。 希望大家支持我的这个系 列。谈谈网络爬虫设计中的问题网络蜘蛛现在开源的已经有好几个了, Larbin ,Nutch ,Heritrix 都各有用户之地,要做 一个自己的爬虫要解决好多个问题, 比如调度算法、更新策略、分布式存储等,我们来一一 看一下。一个爬虫要做的事主要有以下这些1.从一个网页入口,分析链接,一层一层的遍历,或者从一组网页入口,或者从一个 rss 源列表开始爬 rss ;2.获取每个页面的源码保存在磁盘或者数据库里;3. 遍历抓下来的网

8、页进行处理,比如提取正文,消重等;4. 根据用途把处理后的文本进行索引、分类、聚类等操作。以上是个人理解哦,呵呵。这些过程中,大约有如下问题 如何获取网页源或者 RSS 源 如果是一般的爬虫的话, 就是给几个入口页面, 然后顺着超链接以遍历图的算法一个页面一 个页面的爬,这种情况网页源很少,可以选择从 hao123 等网址大全的网站为入口开始爬。 如果做垂直搜索的话就人工去收集一些这个行业的网站, 形成一个列表, 从这个列表开始爬。 如果是爬 RSS 的话,需要先收集 RSS源,现在大的门户的新闻频道和主流的博客系统都有 rss 的功能,可以先爬一遍网站,找出 rss 的链接,要获取每个链接的

9、内容,分析是否是 rss 格式,如果是就把这个链接保存到 rss源数据库里, 以后就专门爬这个 rss源的 rss。还有一 种就是人工来整理,一般 blog 的 rss 都是有规律的,主域名跟一个用户名后面再跟上一个 rss 的固定页面,比如,这样就弄一个用户字典,拼接 rss 地址,然后用程序去探测是否有 这个页面来整理出每个网站的 rss 源。整理出 rss 源后再人工设置 rss 源的权重及刷新时间 间隔等。如果源页面很多,如何用多线程去有效的调度处理,而不会互相等待或者重复处理 如果现在有 500 万个页面要去爬,肯定要用多线程或者分布式多进程去处理了。可以把页 面进行水平分割, 每个

10、线程处理一段儿, 这样每个线程之间不需要同步, 各自处理各自的就 行了。比如给这 500W 个页面分配一个自增 ID,2 个线程的话就让第一个线程去爬1, 3,5的网页,第二个线程去爬 2, 4,6 的网页,这样做多个线程间基本上能均衡,而且不会相 互等待,而且不会重复处理,也不会拉掉网页。每个线程一次取出 1w 个页面,并记录最高 的源页面 ID 号,处理完这一批后再从数据库里提取大于这个源页面 ID 号的下 1W 个页面, 直到抓取完本线程要处理的所有页面。 1w 这个值根据机器的内存可做适当的调整。为了防 止抓了半截儿死机, 所以要支持断点续抓, 要为每个线程的处理进度保存状态, 每取一

11、批网 页都要记录本线程最大的网页 ID,记录到数据库里,进程重启后可以读取这个 ID ,接着抓 后面的页面。如何尽量的利用 CPU ,尽量的不让线程处于等待、休眠、阻塞等空闲状态而且要尽量用少 的线程以减少上下文切换。爬虫有两个地方需要 IO 操作,抓网页的时候需要通过网卡访问网络,抓到网页后要把内容 写到磁盘或者数据库里。所以这两个部分要用异步 IO 操作,这样可以不用线程阻塞在那里 等待网页抓过来或者写完磁盘文件,网卡和硬盘都支持内存直接读取,大量的 IO 操作会在 硬件驱动的队列里排队, 而不消耗任何 CPU。.net 的异步操作使用了线程池, 不用自己频繁 的创建和销毁线程,减少了开销

12、,所以线程模型不用考虑, IO 模型也不用考虑, .net 的异 步 IO 操作直接使用了完成端口,很高效了,内存模型也不需要考虑,整个抓取过程各线程不需要访问共享资源,除了数据库里的源页面,各管各的,而且也是每个线程分段处理,可 以实现无锁编程。如何不采集重复的网页去重可以使用 king 总监的布隆过滤器 ,每个线程使用一个 bitarray ,里面保存本批源页面上次 抓取的页面的哈希值情况, 抓取下来的源页面分析链接后, 去这个 bitarray 里判断以前有没 有抓过这个页面, 没有的话就抓下来, 抓过的话就不管了。 假设一个源页面有 30 个链接把, 一批 10W 个源页面, 300w

13、 个链接的 bitarray 应该也不会占太大内存。 所以有个五六个线程 同时处理也是没问题的。抓下来的页面更快的保存保存到分布式文件系统还是保存在数据库里 如果保存到磁盘, 可以每个域名创建一个文件夹, 凡是这个网站的页面都放到这个文件夹下, 只要文件名不一样, 就不会出现冲突。 如果把页面保存到磁盘, 数据库有自己的一套锁管理 机制,直接用 bulk copy 放数据库就行了。 一般频繁的写磁盘可能会引起 CPU过高,而频繁 的写数据库 CPU 还好一些。而且 sqlserver2008 支持 类型 的字段,在保存大文本字段的时候 有很好的性能,并且还能使用数据库的 API 来访问。所以我觉得如果没有 GFS 那样高效成 熟的分布式文件系统的话还不如存 sqlserver 里面呢。如何有效的根据网页的更新频率来调整爬虫的采集时间间隔 做爬虫要了解一些 HTTP 协议,如果要抓的网页支持 Last-Modified 或者 ETag 头,我们可以先 发个 head 请求来试探这个页面有没有变化来决定是否要重新抓取,但是好多网站根本就不支持这个东西, 所以让爬虫也很费劲, 让自己的网站也会损失更多的性能。 这样我们就要自 己去标注每个源页面的更新时间间隔及权重,再根据这两个值去用一定的算法 制定蜘蛛的更新策略。采集下来的数据做什么用可

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论