码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-11 07:17:30      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:

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

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

http://sourceforge.net/projects/larbin/files/latest/download?source=files

 

 

larbin是一个开源的爬虫,有几个优点:首先抓取效率很高,其次支持对网站进行镜像存储。不过正因为效率高,使用larbin时要非常注意,不要把硬盘搞爆。
larbin使用c++开发的,如果需要python版本的爬虫,建议使用scrapy,模块化做的比较好,很容易定制抓取任务。
larbin已经停止维护了,网上资料也很少。之前在学校的时候用larbin下载网页,整理过一个文档,顺便发出来吧。

下面是安装指南,写的非常简单,如果想进一步了解,建议看“开源爬虫larbin分析”或者larbin主页

  • 下载larbin-2.6.3,并解压:tar -xzvf larbin-2.6.3.tar.gz
  • larbin-2.6.3需要使用gcc/g++ 3.3.6的版本编译。Ubuntu默认安装的最新版本的gcc,Ubuntu手动安装旧版本gcc的方法如下:
 1.下载[http://archive.ubuntu.com/ubuntu/pool/universe/g/gcc-3.3/ 3.3.6版本]:
   gcc-3.3-base_3.3.6-15ubuntu6_i386.deb;
   cpp-3.3_3.3.6-15ubuntu6_i386.deb;
   gcc-3.3_3.3.6-15ubuntu6_i386.deb;
   libstdc++5-3.3-dev_3.3.6-15ubuntu6_i386.deb;
   libstdc++5_3.3.6-15ubuntu6_i386.deb;
   g++-3.3_3.3.6-15ubuntu6_i386.deb
 2.次按照上序顺序安装:
   sudo dpkg --force-depends -i xxx.deb
  • 如果makedepend指令不存在时,安装xutils-dev包
   sudo apt-get install xutils-dev
  • 修改larbin.conf文件,建议:
   pagesConnections 500
   dnsConnections 20
   depthInSite 10
   proxy (下外网网页时须设置,但要注意把以上参数调低,以免代理瘫痪)
   startUrl www.sina.com.cn/
   startUrl www.hao123.com/
   #.png .jpg .jpeg .bmp .smi .tiff .gif  (下图像文件时把这一行注释掉)
  • 修改options.h
   #define MIRROR_SAVE 
   #define IMAGES
   #define ANYTYPE
   #define RELOAD
  • 修改src/types.h
   #define fifoFileWait "Fifowait" (将fifowait改为Fifowait,此为larbin的一个bug)
   #define saveDir "save/" (根据需要配置)
  • 修改larbin代码,生成下载文件列表
 1.在src/types.h中72行添加
   #define FILELIST "LIST"
 2.在src/interf/mirrorsaveuseroutput.cc中添加引用头文件
   #include <sys/file.h>
 第65行添加
   FILE * f_list = fopen(FILELIST, "a");
   if(f_list == NULL)
       return;
   fprintf(f_list, "%s\n", filename);
   fclose(f_list);
 3.在larbin文件夹下创建一个名为LIST的空文件
  • 运行./configure
  • 修改config.make文件
   CC=gcc-3.3
   CXX=g++-3.3
  • 运行 make
  • larbin配置完毕,搞定!

 

 

记得以前同事安装过一次,还是我帮着弄好的,最近对web crawler感兴趣,所以就拿来看看。

从sourceforge下载了larbin2.6.3

解压,进入larbin的主目录

./configure ;一堆warning,还发现了一个error:为函数声明和定义不一致所引起的,修改成一致的就OK了。

若是出现gmake[2]: *** [dep-in] Error 127之类错误

需要安装makedepend工具:

# yum install imake

make;这个也会报一堆错:错误是因为larbin是由C++编写的,2006年的C++类库的使用和现在差异有些不同。此处错误的修正方式:将所有的

1
#include<iostream.h>

变成

1
#include<iostream>

即可,然后在引用cerr的.cc文件中加入

1
using namespace std;

即可。

./larbin

 

在oschina上找到larbin的安装文章:《网页爬虫之 Larbin 安装方法》,

 

 

 

 

1adns目录找到internal.h文件注释掉568-572行。
?
//adns_status adns__parse_domain(adns_state ads, int serv, adns_query qu,
                   //vbuf *vb, parsedomain_flags flags,
                   //const byte *dgram, int dglen, int *cbyte_io, int max);
2sudo apt-get install xutils-dev
3sed -i -e ‘s/iostream.h/iostream/g‘ `grep -rl iostream.h *`  
4sed -i -e ‘s/cerr/std::cerr/g‘ `grep -rl cerr *`
5sed -i -e ‘s/endl/std::endl/g‘ `grep -rl endl *`

6sudo apt-get install xutils-dev


以上基本就可以编译成功了。


关于针对单站采集速度慢的解决方案:


1、将larbin.conf里面的waitDuration设置为1,这里不再考虑polite^_^, 设置为1大多数网站其实还能忍受;
    2、将types.h里面的maxUrlsBySite修改为254;
    3、将main.cc里面的代码做如下修改:
  

// see if we should read again urls in fifowait
if ((global::now % 30) == 0) {
    global::readPriorityWait = global::URLsPriorityWait->getLength();
    global::readWait = global::URLsDiskWait->getLength();
}
if ((global::now % 30) == 15) {
    global::readPriorityWait = 0;
    global::readWait = 0;
}



配置说明:

1.larbin.conf
UserAgent : 客服端标识 当对其他网站抓取时被抓取的网站知道是什么抓取的。

httpPort : 用于运行的http web服务器的端口号 (larbin运行时访问http://localhost:8081/ 设置为:httpPort 8081). 如果将端口号设为0 则不会启动web服务器。这允许larbin不作为单线程运行。通过这个查看爬行结果。

      inputPort :你要爬去的urls的端口。如果注释掉或设为0 则可能没有任何输入。如果通过手动或者程序提交爬去的urls则必须连接到计算机的TCP端口1976。即设为: inputPort 1076。可以添加爬行的url

pagesConnexions : 并行爬取网页的数量。根据自己的网络速度调解。如果超时的太多则要降低这个并行数量。

dnsConnexions : 并行dns域名解析的数量。建议为10

depthInSite :对一个站点爬取得深度

noExternalLinks :不允许访问外部连接。如果设置则只可访问同一HOST的连接。

waitDuration :访问同一服务器的时间间隔。不可低于30s。建议60s,也不会慢。

proxy :是否用代理连接,是则要设置. 可以不用代理就不要用代理连接,用代理很慢,也可能不适合于代理特别是带有缓存的。

StartUrl : 开始爬取得url. 如:StartUrl  http://slashdot.org/。

limitToDomain : 这选项可用则不可以爬行指定的特殊域名。设置方式:limitToDomain .fr .dk end 。则不允许爬行这些域名。

forbiddenExtensions : 不想要的扩展名文件。一定不要禁止.html .htm larbin爬得即使它们。实际上指定禁止也一定是无效的。

                      用法:forbiddenExtensions .tar .gz .deb



   2.options.h

     1.选择输出模式 (不用则在前面注释去掉即可)


#define DEFAULT_OUTPUT 默认模式。 什么都不会输出,所以不要选择这个。

#define SIMPLE_SAVE     简单保存。存在save/dxxxxxx/fyyyyyy文件中 每个目录下2000个文件。

#define MIRROR_SAVE    镜像方式存储。按网页的层次存储。可以作为网页的字典。

#define STATS_OUTPUT   状态输出。在网页上进行状态表示。可以通过查看http://localhost:8081/output.html 查看结果。


        这些模式被定制在src/types.h中。自己可以在src/interf/useroutput.cc中定义自己的输出模式。

     2.特定查询

        设定此模式是查询特定的文件,必须定义两个参数。

       

#define SPECIFICSEARCH :设置特定的查询。

#define contentTypes ((char *[]) { "audio/mpeg", NULL }) :内容类型。

#define privilegedExts ((char *[]) { ".mp3", NULL })  :文件扩展。 用于查询速度 不涉及类型 类型由上一个决定


        设置完要设置特定文件的管理

#define DEFAULT_SPECIFIC :默认管理方式。 作为html有限制除了被解析。

#define SAVE_SPECIFIC :存储特定文件。 允许将文件存储在硬盘上  文件可以很大在src/types.h 可以具体设置。

#define DYNAMIC_SPECIFIC :动态存储模式。对于较大的文件动态的分配buffer



        可以通过"src/fetch/specbuf.cc" and "src/fetch/specbuf.h" 定义特定文件的管理方式。

     3. 你要爬虫做什么

 

#define FOLLOW_LINKS 不继续子链接。不设置此项则html页不被解析链接也不会爬子链接。通过输入系统添加url时很有用

#define LINKS_INFO :每个网页中包含的子链接的列表。在"useroutput.cc" page->getLinks() 访问此信息。

#define URL_TAGSurl标签。设置此项url有一个int(默认为0)。使用输入系统统时应该给定一个int。可以通过其获取url。可以重定向。

#define NO_DUP 不允许重复。如果设置则遇到相同网页但已遇到过时则不管。

#define EXIT_AT_END :结束退出。没有url可爬取时是否退出。设置则退出。

#define IMAGES:抓取网页中的图片。设置了此项则要更新larbin.conf中禁止项。

#define ANYTYPE:抓取任何类型网页不管其的类型。设置要更新larbin.conf

#define COOKIES:要larbin管理cookies。只简单实现但很有用。


  4. 其他选项说明

    

#define CGILEVEL 1:定于选项及其参数。用于对爬行的url的限制。

#define MAXBANDWIDTH 200000 larbin使用的带宽大小。不设置则不限带宽。

#define DEPTHBYSITE :当url链接到其他站点时新rul的深度是已被初始化的。


  5.效率和特征

  

  #define THREAD_OUTPUT:是否为输入制定一个专用线程。当你在useroutput.cc定义自己的代码时必须设置此项。

  #define RELOAD:重启位置记录表。设置此项时可以从上次终止处继续爬取。使用-scratch 选项从上次结束处重启。


          6. Larbin怎样工作

           

#define NOWEBSERVER:不启动服务器。不运行线程时很有用

             #define GRAPH:是否在状态也使用柱状图。

             #define NDEBUG:不启动调试信息。

             #define NOSTATS:不启动状态输出。

             #define STATS:启动状态输出。运行时每个一段时间几秒吧就会输出抓取的状态。

             #define BIGSTATS:在标准输出上显示每个被抓去的网页名字。会降低larbin速度。

             #define CRASH:用于报告严重的bugs用。以make debug模式编译时使用。   



    以下是结果截图:
 

技术分享

 

技术分享

 

http://blog.chinaunix.net/uid-26722078-id-3775344.html

http://blog.chinaunix.net/uid-26548237-id-3391533.html

http://blog.sina.com.cn/s/blog_63a9d9f301014v9z.html

http://www.cnblogs.com/zhangchaoyang/articles/2031954.html

https://www.baidu.com/s?wd=larbin%20%E7%BC%96%E8%AF%91&pn=10&oq=larbin%20%E7%BC%96%E8%AF%91&tn=baiduhome_pg&ie=utf-8&rsv_idx=2&rsv_pq=b43d487a0000f36e&rsv_t=54949tMPJaQcJel2Z7ylvFE09cJS99twSmLKkBfwOcnJmTc0JGynzRQCd8KqDWGcfvdG&rsv_page=1

 

 

    larbin编译成功后,有两个主要方向:一是通过相关资料读Larbin的源代码,最终的目的是自己能开发个简单的爬虫;第二个是分析得到的数据,做数据的分析与挖掘。当然,也有人想把这些数据提取出来后,怎么导入数据库。

         所有源代码的读法,肯定要用到工具。在windows下可以用vs系列,而linux开发的源代码则用SourceInsight。所以这里我使用SourceInsight软件看Larbin。

         首先通过网络知识了解爬虫的基本知识和基本问题。爬虫从一个URL出发,使用广度优先算法,遍历整个网站。其中涉及URL的规整化(MD5算法),URL的判重(Bloom Filter算法),爬虫队列的设计,对网络和文件存取的控制等问题。

         Larbin的主函数中有Larbin爬虫的主要工作流程,其代码如下:

  1. stateMain(-count);  
  2. waitBandwidth(&old);  
  3. stateMain(1);  
  4. for (int i=0; i<global::maxFds; i++)  
  5.   global::ansPoll[i] = 0;  
  6. for (uint i=0; i<global::posPoll; i++)  
  7.   global::ansPoll[global::pollfds[i].fd] = global::pollfds[i].revents;  
  8. global::posPoll = 0;  
  9. stateMain(2);  
  10. input();  
  11. stateMain(3);  
  12. sequencer();  
  13. stateMain(4);  
  14. fetchDns();  
  15. stateMain(5);  
  16. fetchOpen();  
  17. stateMain(6);  
  18. checkAll();  
  19. // select  
  20. stateMain(count++);  
  21. poll(global::pollfds, global::posPoll, 10);  
  22. stateMain(7);  

其中,stateMain 函数其实是个简单的宏,只是将状态变量简单的设置为i,记录当前爬虫所处在第几个阶段;

  1. #define stateMain(i) (stateMain = i)  


其他几个函数,网上查到的资料如下:

        1.waitbandwidth() 等待带宽满足需要 
        2.input() 将需要爬取的seed URL装载进来
        3.sequencer() 对将要爬取的页面进行缓冲,确定每一轮可以进行爬取的页面 
        4.fetchDns()  获取待爬取页面的IP地址和端口号,这需要通过练习DNS服务器将URL进行转换 
        5.fetchOpen() 获取当前网页
        6.checkAll() 做一些检验和网页链接分析(也是我们可以定制化的一部分)

 

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

标签:

原文地址:http://www.cnblogs.com/x113/p/4719817.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!