`
fengzl
  • 浏览: 215619 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论
阅读更多

从Larbin看互联网爬虫设计

于敦德
2005.12.16
转载请注明出处

互联网是一个庞大的非结构化的数据库,将数据有效的检索并组织呈现出来有着巨大的应用前景,尤其是类似RSS的以XML为基础的结构化的数据越来越多,内容的组织方式越来越灵活,检索组织并呈现会有着越来越广泛的应用范围,同时在时效性和可读性上也会有越来越高的要求。这一切的基础是爬虫,信息的来源入口。一个高效,灵活可扩展的爬虫对以上应用都有着无可替代的重要意义。

要设计一个爬虫,首先需要考虑的效率。对于网络而言,基于TCP/IP的通信编程有几种方法。

第一种是单线程阻塞,这是最简单也最容易实现的一种,一个例子:在Shell中通过curl,pcregrep等一系统命令可以直接实现一个简单的爬虫,但同时它的效率问题也显而易见:由于是阻塞方式读取,dns解析,建立连接,写入请求,读取结果这些步骤上都会产生时间的延迟,从而无法有效的利用服务器的全部资源。

第二种是多线程阻塞。建立多个阻塞的线程,分别请求不同的url。相对于第一种方法,它可以更有效的利用机器的资源,特别是网络资源,因为无数线程在同时工作,所以网络会比较充分的利用,但同时对机器CPU资源的消耗也是比较大,在用户级多线程间的频繁切换对于性能的影响已经值得我们考虑。

第三种是单线程非阻塞。这是目前使用的比较多的一种做法,无论在client还是server都有着广泛的应用。在一个线程内打开多个非阻塞的连接,通过poll/epoll/select对连接状态进行判断,在第一时间响应请求,不但充分利用了网络资源,同时也将本机CPU资源的消耗降至最低。这种方法需要对dns请求,连接,读写操作都采用异步非阻塞操作,其中第一种比较复杂,可以采用adns作为解决方案,后面三个操作相对简单可以直接在程序内实现。

效率问题解决后就需要考虑具体的设计问题了。

url肯定需要一个单独的类进行处理,包括显示,分析url,得到主机,端口,文件数据。

然后需要对url进行排重,需要一个比较大的url Hash表。

如果还要对网页内容进行排重,则还需要一个Document Hash表。

爬过的url需要记录下来,由于量比较大,我们将它写到磁盘上,所以还需要一个FIFO的类(记作urlsDisk)。

现在需要爬的url同样需要一个FIFO类来处理,重新开始时,url会从定时从爬过的url FIFO里取出来,写到这个FIFO里。正在运行的爬虫需要从这个FIFO里读数据出来,加入到主机类的url列表里。当然,也会从前一个FIFO里直接读url出来,不过优先级应该比这个里面出来的url低,毕竟是已经爬过的。

爬虫一般是对多个网站进行爬取,但在同时站点内dns的请求可以只做一次,这就需要将主机名独立于url,单独有一个类进行处理。

主机名解析完成后需要有一个解析完成的IP类与之应用,用于connect的时候使用。

HTML文档的解析类也要有一个,用来分析网页,取出里面的url,加入到urlsDisk。

再加上一些字符串,调度类,一个简单的爬虫基本上就完成了。

以上基本上是Larbin的设计思路,Larbin在具体实现上还有一些特殊的处理,例如带了一个webserver,以及对特殊文件的处理。 Larbin有一点设计不不太好,就是慢的访问会越来越多,占用大量的连接,需要改进,另外如果对于大规模的爬虫,这仅仅实现了抓取的部分,要分布式的扩展还需要增加url的集中管理与调度以及前台spider的分布式算法。

 

 

用python编写分布式爬虫
1、 网络连接需要持续连接(persistent connection),DNS解析的瓶颈(先查本地DNS缓存)

实现方法:基于python httplib(对http1.1完成对持续连接的支持(python的httplib完全支持http1.1),如果不是http1.1那么可以使用urlopen对其进行一次连接)并对其socket对象进行控制,关键是加入对读取DNS本地缓存(在我的机制下这个根本就不是主要问题可以暂时忽略),以及有settimeout(Igloo)(搞定,就用setdefaulttimeout())的支持(或者利用自己的DNS服务器,进行优化处理),以及对sock对象的settimeout进行设置,防止长时间的等待一个有可能连接不上的web服务器.(要测试一下连接模块和DNS解析模块在访问不存在url在默认情况下的时间消耗)对站点的ip解析出来后就直接用ip进行连接而避免了重复调用DNS解析.例子:socket.gethostbyname("www.163.com")


网络连接下载模块非常重要,需要精心反复测试,因为有可能碰到一些不规范的web服务器,如果没有加以考虑会使整个线程崩溃。

   
2、    多线程:机器任务的分配及站点任务的分配。

实现方法:(在某台机器上实现,在对本机内存cpu的消耗情况判断后对机器任务进行分配;在对和站点的连接情况进行判断后对站点任务进行分配)
机器任务的分配:对于机器负担的情况调整在一个机器开的线程的个数。(在关闭线程时注意要先让线程完成当前运行任务)
站点任务的分配:就是某个机器对一个站点开的线程的个数的分配。(同样是要注意关闭线程时先让其完成当前任务)


3、    对web文件树遍历过程更好的控制,对web文件树在广度优先遍历时层次的判断。(整个网络是一个图,而某个站点的模型更接近于一棵树)

实现方法:在每个地址进入队列时加一个层次号,那么要遍历第n层的话那么遍历到第一个n+1就停止读取。

4、    利用robotparser解析robots.txt

5、    单个机器spider的作用:

a)    同2多线程3文件树的遍历
b)    将获取的外部url发回中央控制器,并从中央控制器取回新的外部url。


6、    中央控制器的作用:

a)    观察各机器的状态包括:cpu、内存、线程、站点、网络流量
b)    观察对外整体网络流量和连接状况,可以根据网络状况来调节timeout。
c)    接受各个机器发送过来的外部url并对每个url的重复数字计数。然后分配到各个机器。(分配时要用爬行策略控制器对外部url进行排序来分配,Igloo利用Page Rank,我们可以使用最简单的重复越多重要系数就越高来进行排序)
d)    分布式URL分配算法:Igloo1.2的二级哈希映射算法(集中式分配算法那个中央控制器容易成为系统瓶颈)复习哈希算法,还有就是对url是否访问过的判断(Igloo使用的是URL Trie滞后合并策略)。可以使用Berkeley DB作为URL Trie的替代品。两种实现方式的比较:
i.    现在的想法:(面向站点,信息颗粒大)外部链接只是保存主机名比如:www.163.com, 站内访问用解析好的ip地址维持连接,用相对链接来得到各个页面,这样就要维护一个外部链接列表,几个站点的链接列表。优点:节省内存,对某个站点的信息获取全面,对站点的出现频率统计,排序,重要站点先取。 缺点:对链接的获取的全面性得不到保证,而且不能获取更多的重要页面,每个站点的重要页面也不会很多。
ii.    老方案:(面向页面,信息颗粒小)所有连接一视同仁。缺点:浪费资源,对单一站点的获取不一定全面。优点:可以得到全面的链接图,可以使用Page Rank对列表进行排序,页面更重要就在最前面。


7、    解析html(超级链接的提取)搞定(用python的sgmllib)缺点:速度太慢(可能会造成瓶颈,要好好包装好,以后有机会换掉它)

分享到:
评论
1 楼 hu474676693 2013-09-25  
看到作者写的爬虫文章,真是收益菲浅!
但是作者只考虑了爬虫的效率和架构,有没有考虑过爬虫的技术难点?
比如说 网络异步数据的抓取(如 ajax,jquery返回数据的抓取问题)等等

相关推荐

    爬虫设计文档 关于网络爬虫设计的文档

    网络爬虫设计是信息技术领域中一个重要的实践环节,主要用于自动化地从互联网上抓取大量信息。本篇文章将探讨网络爬虫设计的一些核心概念和策略,包括URL标准化、防止陷入网络陷阱、遵循漫游拒绝访问规则,以及两种...

    山东建筑大学计算机网络课程设计《基于Python的网络爬虫设计》.docx

    在本课程设计中,基于Python的网络爬虫设计旨在让学生掌握网络爬虫的基本原理、实现方法以及在实际中的应用。通过该项目,学生能够学习到如何利用Python语言和相关库进行网页抓取、数据解析,并对抓取的数据进行有效...

    基于Java的主题网络爬虫设计与实现

    这篇毕业设计的标题是“基于Java的主题网络爬虫设计与实现”,它涵盖了数据库设计、程序开发以及论文撰写等多个方面。 首先,我们来看数据库部分。`article.sql`可能包含了项目的数据库结构,这通常会包括表的设计...

    网络爬虫设计与实现毕业设计论文.pdf

    根据给定文件的部分内容,我们可以提取以下关于网络爬虫设计与实现的知识点: 1. 网络爬虫设计目的:论文的主要目的是设计一个面向主题的网络爬虫,这种爬虫需要考虑到网络爬虫的多样化需求,并满足一定的性能标准...

    基于python的网络爬虫设计.doc

    基于Python的网络爬虫设计 本文档旨在介绍基于Python的网络爬虫设计,旨在帮助读者了解网络爬虫的基本概念、Python语言的应用以及爬虫设计的思路和实现方法。 一、网络爬虫的基本概念 网络爬虫(Web Spider)是一...

    基于Python的网页数据爬虫设计分析.pdf

    综上所述,一个完整的基于Python的网页数据爬虫设计,应当包括对网络爬虫概念的清晰理解、Python语言及其相关库的掌握、爬虫工作原理和流程的把握、不同类型爬虫的构建方法、反爬虫策略的应对、数据整理和存储的方法...

    山东建筑大学计算机网络课程设计《基于Python的网络爬虫设计》(367).docx

    《基于Python的网络爬虫设计》是一门针对山东建筑大学计算机网络课程的实践性课程设计。该设计旨在帮助学生巩固计算机网络基础知识,培养网络管理和配置技能,以及提升网络编程和文档编写能力。网络爬虫是搜索引擎的...

    基于Python对资讯信息的网络爬虫设计.pdf

    随着大数据时代的到来,网络爬虫技术已成为数据采集和信息挖掘的重要工具...本文的内容涵盖了网络爬虫设计的各个方面,包括相关概念解释、爬虫程序的详细设计以及环境搭建等,是一篇集理论研究与实操于一体的学术论文。

    基于Java线程池技术的数据爬虫设计与实现.pdf

    本文所提及的基于Java线程池技术的数据爬虫设计与实现,不仅涉及到了数据爬虫的原理和架构,还包括了多线程编程的知识点,以及线程池技术在数据爬虫中的具体应用。 首先,数据爬虫的基本原理是模拟用户的点击行为,...

    网络爬虫设计实现

    ### 网络爬虫设计实现相关知识点 #### 一、网络爬虫概述与应用场景 - **定义**:网络爬虫是一种自动从互联网上下载网页的程序,是搜索引擎的重要组成部分,用于从海量的网络资源中抽取有用信息。 - **应用场景**:...

    搜索引擎中爬虫设计

    搜索引擎中的爬虫设计是互联网信息检索的关键组成部分,它负责自动地遍历并抓取网络上的大量数据,为搜索引擎提供新鲜且全面的网页内容。爬虫技术对于理解和构建高效的搜索引擎至关重要,因为它涉及到网络数据的获取...

    基于Hadoop分布式爬虫设计综述.docx

    基于Hadoop分布式爬虫设计综述 Hadoop分布式爬虫设计是当今互联网发展的最大挑战之一,旨在快速高效和安全地让网络用户在浩瀚的信息海洋中找到并获取自己所需的资源。本文主要阐述了基于Hadoop分布式文件系统HDFS...

    山东建筑大学计算机网络课程设计《基于Python的网络爬虫设计》.pdf

    《基于Python的网络爬虫设计》是山东建筑大学计算机网络课程设计的一项重要任务,旨在让学生深入理解网络爬虫的工作原理并掌握Python编程语言在爬虫开发中的应用。本设计成果报告详细介绍了网络爬虫的设计过程,包括...

    山东建筑大学计算机网络课程设计《基于Python的网络爬虫设计》.rar

    《基于Python的网络爬虫设计》是一门针对山东建筑大学计算机网络课程的实践性学习项目,旨在让学生深入了解网络数据的抓取与处理技术。在这个项目中,学生将使用Python编程语言来构建网络爬虫,从而获取并分析互联网...

    基于Java的多线程网络爬虫设计与实现.pdf

    ### 基于Java的多线程网络爬虫设计与实现 #### 一、引言与背景 在当今数字化时代,互联网成为人们获取信息的主要渠道,而搜索引擎则是导航这一庞大信息海洋的关键工具。搜索引擎的核心技术之一是网络爬虫(Web ...

    计算机毕业设计:Python实现的分布式爬虫设计(Python+Scrapy+Redis),保证可靠运行,赠计算机答辩PPT模板

    《计算机毕业设计:Python实现的分布式爬虫设计(Python+Scrapy+Redis)》是一项综合性强、实用性高的计算机学习资源,特别适用于本科课程设计、毕业设计以及Python学习等多个领域。该资源通过结合Python、Scrapy...

    基于HTMLParser 信息提取的网络爬虫设计

    ### 基于HTMLParser 信息提取的网络爬虫设计 #### 概述 随着互联网技术的迅猛发展,网络信息量急剧增加,人们对于信息获取的需求也日益个性化和精细化。在此背景下,网络爬虫作为信息采集的重要工具,在搜索引擎...

Global site tag (gtag.js) - Google Analytics