`
deepfuture
  • 浏览: 4335563 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:79448
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:68426
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:101570
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:281331
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:14623
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:65627
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:31341
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45240
社区版块
存档分类
最新评论

Larbin-C++实现的爬虫

阅读更多

http://larbin.sourceforge.net/index-eng.html

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

二,运行

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

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

 

  三,结果

  哈哈,下班后找了台机子跑了起来,那晚睡觉的时候都梦见自己的搜索引擎赶GOOGLE超BAIDU了,那个兴奋啊。

 

  第二天上班的时候取看结果,发现目录下除了些fifo*文件外什么都没有,那个郁闷。没办法啊,再看文档HowtocustomizeLarbin发现这么段说明:

  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 http://localhost:8081/output.html.

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

 

  我的option中改了:

 

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

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

  NO_DUP

 

  其余可根据各自需要修改,详见:HowtocustomizeLarbin一文。

 

  四,问题

 

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

 

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

  不过还是把这些写出来,给没看文档的朋友(希望很少),也警示自己一定要认真看文档

Larbin网站爬虫简明使用说明




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

  回头看看自己遇到的问题都是由于没认真看文档引起的,唉,老毛病了。下次即使是E文的也得好好看,不能盲目的试,浪费时间。

  larbin官方地址:http://larbin.sourceforge.net/index-eng.html


  一,编译

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


  ./configure

  make

  gcc-O3-Wall-D_REENTRANT-c-oparse.oparse.c

  parse.c:115:error:conflictingtypesfor’adns__parse_domain’


  internal.h:571:error:previousdeclarationof’adns__parse_domain’washere


  parse.c:115:error:conflictingtypesfor’adns__parse_domain’

  internal.h:571:error:previousdeclarationof’adns__parse_domain’washere


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

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

  make:***[all]错误2

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


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

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

二,运行

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

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

 

  三,结果

  哈哈,下班后找了台机子跑了起来,那晚睡觉的时候都梦见自己的搜索引擎赶GOOGLE超BAIDU了,那个兴奋啊。

 

  第二天上班的时候取看结果,发现目录下除了些fifo*文件外什么都没有,那个郁闷。没办法啊,再看文档HowtocustomizeLarbin发现这么段说明:

  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 http://localhost:8081/output.html.

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

 

  我的option中改了:

 

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

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

  NO_DUP

 

  其余可根据各自需要修改,详见:HowtocustomizeLarbin一文。

 

  四,问题

 

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

 

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

  不过还是把这些写出来,给没看文档的朋友(希望很少),也警示自己一定要认真看文档

Larbin网站爬虫简明使用说明

 

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

  回头看看自己遇到的问题都是由于没认真看文档引起的,唉,老毛病了。下次即使是E文的也得好好看,不能盲目的试,浪费时间。

  larbin官方地址:http://larbin.sourceforge.net/index-eng.html

 

  一,编译

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

 

  ./configure

  make

 

  gcc-O3-Wall-D_REENTRANT-c-oparse.oparse.c

  parse.c:115:error:conflictingtypesfor’adns__parse_domain’

 

  internal.h:571:error:previousdeclarationof’adns__parse_domain’washere

 

  parse.c:115:error:conflictingtypesfor’adns__parse_domain’

  internal.h:571:error:previousdeclarationof’adns__parse_domain’washere

 

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

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

  make:***[all]错误2

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

 

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

分享到:
评论

相关推荐

    larbin-高效网络爬虫

    LINUX下的网络爬虫。larbin应当是一个被广大搜索引擎爱好者应当引起注意的一个产品,虽然其功能逐渐被 Nutch 所接受和替代,但是其在爬虫上的优美设计的确值得称道。

    larbin源码 c++的网络爬虫

    larbin源码 c++的网络爬虫larbin源码 c++的网络爬虫larbin源码 c++的网络爬虫

    larbin-2.6.3

    larbin-2.6.3larbin-2.6.3larbin-2.6.3larbin-2.6.3larbin-2.6.3

    如何配置Larbin - 翻译

    关于Larbin网络爬虫的权威文档,你可以在这里学会Larbin的详细配置方法,让你的Larbin工作得更好

    larbin2.6.3爬虫程序

    larbin2.6.3爬虫,错误已全部改正,已在ubuntu下通过运行,可进行简单的爬网页任务。

    Webtools 4 larbin-开源

    Larbin是一个Web搜寻器,旨在获取大量Web页面,它应该能够在具有大量u / d的标准PC上获取超过1亿个页面。 这套称为webtools4larbinPHP和Perl脚本可以处理Larbin和p的输出。

    larbin 网络爬虫

    larbin是一种开源的网络爬虫/网络蜘蛛

    从Larbin看互联网爬虫设计

    一个高手写的东西 值得一看

    larbin的头文件可用于网络爬虫

    这个是larbin的头文件,其实这个在哪都可以找到,我只想要赚点积分。各位乡亲父老好不好啊?

    larbin网络爬虫的体系结构[参照].pdf

    larbin网络爬虫的体系结构[参照].pdf

    论文研究-Larbin的设计与优化 .pdf

    Larbin的设计与优化,叶建平,,搜索引擎是万维网能够更好为人类利用的重要工具。而网络爬虫是搜索引擎的核心组成部分。Larbin是一个高效,比较简单,而且功能比较

    网络爬虫larbin

    经典的网络爬虫,经典的larbin,采用asdn域名异步解析,单线程非阻塞模型。

    Larbin

    主要是网络爬虫,整个网络进行景象,得到网络资源

    网络爬虫调研报告.doc

    Larbin 开发语言:C++ 简介 larbin是一种开源的网络爬虫/网络蜘蛛,由法国的年轻人 Sébastien Ailleret独立开发。larbin目的是能够跟踪页面的url进行扩展的抓取,最后为搜索引擎 提供广泛的数据来源。 Larbin只是...

    网络爬虫调研报告(1).doc

    Larbin 开发语言:C++ 简介 larbin是一种开源的网络爬虫/网络蜘蛛,由法国的年轻人 Sébastien Ailleret独立开发。larbin目的是能够跟踪页面的url进行扩展的抓取,最后为搜索引擎 提供广泛的数据来源。 Larbin只是...

    网络爬虫调研报告(2).doc

    Larbin 开发语言:C++ 简介 larbin是一种开源的网络爬虫/网络蜘蛛,由法国的年轻人 Sébastien Ailleret独立开发。larbin目的是能够跟踪页面的url进行扩展的抓取,最后为搜索引擎 提供广泛的数据来源。 Larbin只是一...

    larbin源码分析全解

    主要是分析larbin开源爬虫的源代码,主要思路是先从global文件中的各个重要的结构开始讲解、分析代码。

    修改好的larbin源代码

    修改好的larbin源代码,可以直接在ubuntu8.10下编译使用

    larbin 分析和win下移植

    介绍larbin原理和在win下怎么移植

Global site tag (gtag.js) - Google Analytics