开源的网路爬虫larbin

优采云 发布时间: 2020-06-26 08:00

  larbin是一种开源的网路爬虫/网路蜘蛛,由美国的年轻人 Sébastien Ailleret独立开发。larbin目的是能否跟踪页面的url进行扩充的抓取,最后为搜索引擎提供广泛的数据来源。Larbin只是一个爬虫,也就 是说larbin只抓取网页,至于怎样parse的事情则由用户自己完成。另外,如何储存到数据库以及完善索引的事情 larbin也不提供。一个简单的larbin的爬虫可以每晚获取500万的网页。

  利用larbin,我们可以轻易的获取/确定单个网站的所有连结,甚至可以镜像一个网站;也可以用它完善url 列表群,例如针对所有的网页进行 url retrive后,进行xml的连结的获取。或者是 mp3,或者订制larbin,可以作为搜索引擎的信息的来源。

  不过它的最大的亮点还是开源,相信很多人领到larbin源代码的时侯会觉得无从入手,下面是一篇特别不错的开源的网络爬虫/网络蜘蛛larbin结构剖析的文章,有兴趣的最好仔细阅读尝试一下。

  互联网是一个庞大的非结构化的数据库,将数据有效的检索并组织呈现下来有着巨大的应用前景,尤其是类似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须要记录出来,由于量比较大,我们将它讲到c盘上,所以还须要一个FIFO的类(记作ur*敏*感*词*isk)。

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

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

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

  HTML文档的解析类也要有一个,用来剖析网页,取出上面的url,加入到ur*敏*感*词*isk。

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

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

  Larbin网站爬虫简明使用说明

  larbin是一种爬虫工具,我也是前段时间网上见到 Larbin 一种高效的搜索引擎爬虫工具 一文时才晓得有这么个东西,初步认定,我比较喜欢这个工具(比起nutch的crawl来说),因为它是C++写的,类似C嘛,我熟,可以自己改改,顺便 学习一下C++(几年来的经验告诉我说:改他人的东西来学一种技术比从头写helloworld快好多)。于是开始了我辛酸的larbin试用之旅。

  回头瞧瞧自己遇见的问题都是因为没认真看文档造成的,唉,老毛病了。下次虽然是E文的也得好好看,不能盲目的试,浪费时间。

  larbin官方地址:

  一,编译

  这也好说,whahahaha,那是!因为从官方网站下出来的代码不能编译通过(linux gcc下)

  ./configure

  make

  gcc -O3 -Wall -D_REENTRANT -c -o parse.o parse.c

  parse.c:115: error: conflicting types for ’adns__parse_domain’

  internal.h:571: error: previous declaration of ’adns__parse_domain’ was here

  parse.c:115: error: conflicting types for ’adns__parse_domain’

  internal.h:571: error: previous declaration of ’adns__parse_domain’ was here

  gmake[1]: *** [parse.o] 错误 1

  gmake[1]: Leaving directory `/home/leo/leo/larbin-2.6.3/adns’

  make: *** [all] 错误 2

  函数原型和定义不一致这个好改:

  打开./adns/internal.h文件,把568-571行直接注释掉就行了。

  二,运行

  这个就不说了,./larbin就运行了,larbin.conf中先进行配置就可以了,这个配置就不说了。。

  运行后可以:8081 看运行状态,不错的看法。 larbin.conf中有个:inputPort 1976配置,就是可以运行时降低要抓取的URL,这个看法非常好,可是?怎么加呢?象原本那样::1976那样是不行的,报 错???试了很久没结果,最后GDB跟踪了一下,唉,原来直接telnet host 1976进行降低就可以了。后来见到文档里写的亲亲楚楚,晕倒。。。。。

  三,结果

  哈哈,下班后找了台机子跑了上去,那晚午睡的时侯都梦到自己的搜索引擎赶GOOGLE超BAIDU了,那个激动啊。

  第二天下班的时侯取看结果,发现目录下不仅些fifo*文件外哪些都没有,那个纠结。没办法啊,再看文档 How to customize Larbin 发现如此段说明:

  The first thing you can define is the module you want to use for ouput. This defines what you want to do with the pages larbin gets. Here are the different options :

  DEFAULT_OUTPUT : This module mainly does nothing, except statistics.

  SIMPLE_SAVE : This module saves pages on disk. It stores 2000 files per directory (with an index).

  MIRROR_SAVE : This module saves pages on disk with the hierarchy of the site they come from. It uses one directory per site.

  STATS_OUTPUT : This modules makes some stats on the pages. In order to see the results, see :8081/output.html.

  靠,默认哪些都没输出,于是认真的看了官方网站上仅有的两个文档,修改了options.h再编译,终于有结果了。

  我的option中改了:

  SIMPLE_SAVE 简单输出一个目录两千个文件,包含索引。

  CGILEVEL=0 处理服务器端程序,也就是但url中包含? & = 之类的querString时也处理。

  NO_DUP

  其余可依据各自须要更改,详见: How to customize Larbin 一文。

  四,问题

  在使用过程中发觉,在抓网页的时侯,如果URL中包含未编码(encodurl)中文时,无法抓取,简单的看了一下在: src/utils/中的fileNormalize 有涉及。于是写了个encodurl函数加在url类的构造函数里,问题就解决了。

  由于须要比较好的可定制性,这个工具其实还不大满足我的需求,最终我没使用她,而是自己用perl在WWW:SimpleRobot的基础上搞了个适宜我的。。再说了perl在字符蹿处理上应当不比C++慢,总的来说那种小工具性能还不错。。呵呵。

  不过还是把这种写下来,给没看文档的同学(希望极少),也警示自己一定要认真看文档

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线