Larbin 设计原理

标签: 默认分类 | 发表时间:2012-04-07 18:19 | 作者:Hins_pan
出处:http://hi.baidu.com/hins%5Fpan

互联网是一个庞大的非结构化的数据库,将数据有效的检索并组织呈现出来有着巨大的应用前景,尤其是类似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的分布式算法。

说的简单易懂一些,网络爬虫跟你使用的〖离线阅读〗工具差不多。说离线,其实还是要跟网络联结,否则怎么抓东西下来?

那么不同的地方在哪里?

1】 网络爬虫高度可配置性。
2】 网络爬虫可以解析抓到的网页里的链接
3】 网络爬虫有简单的存储配置
4】 网络爬虫拥有智能的根据网页更新分析功能
5】 网络爬虫的效率相当的高

那么依据特征,其实也就是要求了,如何设计爬虫呢?要注意哪些步骤呢?

1】 url 的遍历和纪录
这点 larbin 做得非常的好,其实对于url的遍历是很简单的,例如:
cat [what you got]| tr " \n | gawk '{print $2}' | pcregrep ^ http://
就可以得到一个所由的 url 列表

2】多进程 VS 多线程
各有优点了,现在一台普通的PC 例如 booso.com 一天可以轻松爬下5个G的数据。大约20万网页。

3】时间更新控制
最傻的做法是没有时间更新权重,一通的爬,回头再一通的爬。
通常在下一次爬的的数据要跟上一次进行比较,如果连续5次都没有变化,那么将爬这个网页的时间间隔扩大1倍。

如果一个网页在连续5次爬取的时候都有更新,那么将设置的爬取时间缩短为原来的1/2。

注意,效率是取胜的关键之一。

4】爬的深度是多少呢?
看情况了。如果你比较牛,有几万台服务器做网络爬虫,我劝您跳过这一点。
如果你同我一样只有一台服务器做网络爬虫,那么这样一个统计您应该知道:

网页深度:网页个数:网页重要程度
0 : 1 : : 10
1 :20 : :8
2: :600: :5
3: :2000: :2
4 above: 6000: 一般无法计算

好了,爬到三级就差不多了,再深入一是数据量扩大了3/4倍,二是重要度确下降了许多,这叫做“种下的是龙种,收获的是跳蚤。”

5】爬虫一般不直接爬对方的网页,一般是通过一个Proxy出去,这个proxy有缓解压力的功能,因为当对方的网页没有更新的时候,只要拿到 header 的 tag就可以了,没有必要全部传输一次了,可以大大节约网络带宽。

apache webserver里面纪录的 304 一般就是被cache的了。

6】请有空的时候照看一下robots.txt

7】存储结构。
这个人人见智,google 用 gfs 系统,如果你有7/8台服务器,我劝你用NFS系统,要是你有70/80个服务器的话我建议你用afs 系统,要是你只有一台服务器,那么随便。

给一个代码片断,是我写的新闻搜索引擎是如何进行数据存储的:

NAME=`echo $URL |perl -p -e 's/([^w-.@])/$1 eq " " ? " ":sprintf("%%%2.2x",ord($1))/eg'`
mkdir -p $AUTHOR
newscrawl.pl $URL --user-agent="news.booso.com+(+ http://booso.com)" -outfile=$AUTHOR/$NAME


类别: 默认分类  查看评论

相关 [larbin 设计 原理] 推荐:

Larbin 设计原理

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

HTML5设计原理

- jessie - 蓝色理想
Jeremy Keith在 Fronteers 2010 上的主题演讲 下载PPT(PDF) 观看视频 今天我想跟大家谈一谈HTML5的设计. 主要分两个方面:一方面,当然了,就是HTML5. 我可以站在这儿只讲HTML5,但我并不打算这样做,因为如果你想了解HTML5的话,你可以Google,可以看书,甚至可以看规范.

HBase 原理、设计与优化实践

- - leejun_2005的个人页面
HBase —— Hadoop Database的简称,Google BigTable的另一种开源实现方式,从问世之初,就为了解决用大量廉价的机器高速存取海量数据、实现数据分布式存储提供可靠的方案. 从功能上来讲,HBase不折不扣是一个数据库,与我们熟悉的Oracle、MySQL、MSSQL等一样,对外提供数据的存储和读取服务.

交互设计七大原理

- - 人人都是产品经理
它由保罗.菲茨在1954年首先提出,具体内容为:从一个起始位置移动到一个最终目标所需的时间由两个参数来决定,到目标的距离和目标的大小,用数学公式表达为时间 :. 其中:T代表完成移动所需的平均时间,a代表光标开始/停止时间,b代表光标的移动速度,D代表从起点到目标中心的距离,W代表目标的宽度. 总而言之:目标越大,指向越快,时间越短.

Kafka 设计与原理详解

- - IT瘾-geek
本文综合了我之前写的kafka相关文章,可作为一个全面了解学习kafka的培训学习资料. 转载请注明出处 : 本文链接. 当今社会各种应用系统诸如商业、社交、搜索、浏览等像信息工厂一样不断的生产出各种信息,在大数据时代,我们面临如下几个挑战:. 以上几个挑战形成了一个业务需求模型,即生产者生产(produce)各种信息,消费者消费(consume)(处理分析)这些信息,而在生产者与消费者之间,需要一个沟通两者的桥梁-消息系统.

《深入理解mybatis原理》 MyBatis的二级缓存的设计原理

- - CSDN博客架构设计推荐文章
       MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能. 本文将全面分析MyBatis的二级缓存的设计原理. 1.MyBatis的缓存机制整体设计以及二级缓存的工作模式.      如上图所示,当开一个会话时,一个 SqlSession对象会使用一个 Executor对象来完成会话操作, MyBatis的二级缓存机制的关键就是对这个 Executor对象做文章.

MySQL Cluster 与 MongoDB 复制集分片设计及原理

- - MySQLOPS 数据库与运维自动化技术分享
分布式数据库计算涉及到分布式事务、数据分布、数据收敛计算等等要求. 分布式数据库能实现高安全、高性能、高可用等特征,当然也带来了高成本(固定成本及运营成本),我们通过MongoDB及MySQL Cluster从实现上来分析其中的设计思路,用以抽象我们在设计数据库时,可以引用的内部方法. 首先说说关系及非关系数据库的特征.

移动交互设计那些值得你学习的原理

- - 人人都是产品经理
买了本《设计之下》,是搜狐UED团队写的书,挺好的. 今天又拿来体会了下,顺便摘抄点下来,算是读书笔记,感谢搜狐新闻客户端UED团队. 人、动作(情感、典型、策略、用户研究、流程、动机)、环境、工具、目的. 创起来的流程是这样子的,人,通过工具,完成动作,达到目的,在环境里. 2、解析需求的过程可以获得以下两点东西:.

(转)剖析nginx等单线程服务器设计原理与性能优势

- - 博客园-Ruby's Louvre
nginx现在正在以光的速度蔓延开来,他以其稳定性和高性能等众多优点迅速扩大市场,大家都知道,nginx是以单线程为基础的,那么他怎么能在并发性上取得优势的呢. 会不会因为网络阻塞而导致主线程阻塞呢. 下面就相关问题作一些概念性的阐述. 那么既然多线程都会存在这样的问题单线程怎么会逃脱的调呢. 对于公网就更不用说了,网络等IO阻塞才是影响服务器的主要因素,是那块短了的板.

分布式文件系统FastDFS设计原理及技术架构

- - mysqlops
FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)三个部分组成,主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务. Storage server(后简称storage)以组(卷,group或volume)为单位组织,一个group内包含多台storage机器,数据互为备份,存 储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费.