转自风中之炎的博客:http://www.cnblogs.com/FengYan/archive/2012/02/04/2338630.html

1. larbin简介(百度百科)

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

latbin最初的设计也是依据设计简单但是高度可配置性的原则,因此我们可以看到,一个简单的larbin的爬虫可以每天获取500万的网页,实在是非常高效。  利用larbin,我们可以轻易的获取/确定单个网站的所有联结,甚至可以镜像一个网站;也可以用它建立url 列表群,例如针对所有的网页进行 url retrive后,进行xml的联结的获取。或者是 mp3,或者定制larbin,可以作为搜索引擎的信息的来源。

2. 高效的larbin

简介中提到larbin是一个非常高效的爬虫,但没有说明为什么。这里尝试列出几个原因。此外,由于接触爬虫的时间尚短,没发现的地方,希望各位能补充下。

a. 节省空间的hash容器。在larbin中,hash的主要用途是判重,因此没必要将元素的值记录到hash表中。于是就使用一个位图保存hash code,根据位图某个位是否为1,判断某个元素是否在hash表中。当要插入一个新元素时,就将hash code对应的位置1。这样说可能不容易明白,举个例吧。假设int为32位,位图为int bitmap[100],元素A的hash code为120,将元素A插入到hash容器就是将bitmap的第120位置1,即bitmap[120/32] | (1 << 120%32)。

      b. 减少dns次数。对于一个站点,使用一次dns解析出IP地址后,下次再遇到该站点的其它网页,就用IP地址替换域名。

c. 异步连接。使用单线程非阻塞的方法进行socket连接,充分利用了网络资源和CPU资源。

3. larbin的大致流程

larbin的大致流程可以从main.cc看出,这里去掉不重要语句,给出关键语句形成的流程,并加上注释。

int main(int argc, char *argv[]) {

  global glob(argc, argv)  //使用配置文件初始化global类中的成员变量

  for(; ;) {
waitbandwidth() //如果用户设置了最大带宽,则由此函数保证带宽的使用情况
input() //接收用户的输入,得到初始URL列表
   sequencer() //按优先度将URL放到待爬取站点    fetchDns() //对站点名即host,进行DNS请求    fetchOpen() //从DNS解析成功的站点中,取出一些URL进行socket连接    checkAll() //下载网页,提取URL,并执行用户定制的网页分析
  }
}

4. larbin的关键函数

这一节主要使用伪代码说明第3节列出的函数是怎样工作的。

// wait to limit bandwidth usage
waitBandwidth() {
  while( 剩余带宽 < ) {
    等10ms
    if( socket超时 )   更新待爬取的url数量
    更新剩余带宽
  }
} //
input() {
  初始化webServe,等待用户连接
  接收用户输入,包括优先度,深度,抓取模式,初始URL列表
  从初始URL得到hostName,portNumber,fileName
  按优先度将URL放到待爬取队列
} //start the sequencer
sequencer() {
  得到一轮(perCall)可以加载URL的数量(存放在变量still中)
  根据URL的优先级加载最多still条URL到待爬取站点
} //Opens sockets ; this function perform dns calls, using adns
fetchDns() {
  从dnsSite取出hostName,发送dns解析请求(发送数量受最大连接数限制)
  接收dns解析结果
  if(解析成功) {
    获取并解析该host的robots.txt
    保存URL到okSites
  }
} //Opens sockets ; Never block (only opens sockets on already known sites) ; work inside the main thread
fetchOpen() {
  while( 空闲连接数 ) {
    从okSites取出一个URL
    if( 成功打开socket ) {
      向conn填写一些信息
      减少一个空闲连接
    }
  }
} //read all data available ; fill fd_set for next select ; give back max fds
checkAll() {
  for( 每个连接 ) {
    switch( 连接状态 ) {
      case connecting : 检查是否socket错误,若不是,则将状态转为write,break
      case write : 写socket请求,将状态转为open,break
      case open : 读网页,分析网页,提取链接(endInput函数),状态转为empty,break
    }
  }   for( 每个连接 ) 更新pollfds数组的状态(与异步IO有关)
}

5. 参考文献

以下是我看larbin源码时,对我帮助很大的文献。

a. larbin官网

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

b. larbin的配置和使用 http://www.cnblogs.com/zhangchaoyang/articles/2031954.html

c. 从larbin看互联网爬虫设计 http://www.oschina.net/question/12_4114

d. Linux网络编程入门 http://www.cnblogs.com/duzouzhe/archive/2009/06/19/1506699.html

e. adns官网 http://ftp.gnu.org/gnu/adns/

(转)开源爬虫larbin分析的更多相关文章

  1. c++开源爬虫-Larbin简单介绍

    原文地址:http://leihuang.net/2014/06/16/Larbin-Introduction/ 由于近期学校实训.做的是一个搜索相关的项目,而且是c++的一个项目.所以就想到了lar ...

  2. 开源爬虫Labin,Nutch,Neritrix介绍和对比

    crawler 开发 语言 功能 单一 支持分布式 爬取 效率 镜像 保存 Nutch Java × √ 低 × Larbin C++ √ × 高 √ Heritrix Java √ × 中 √ ** ...

  3. 10 个强大的开源 Web 流量分析工具(转帖)

    Web 流量分析工具多不胜数,从 WebTrends 这样专业而昂贵的,到 Google Analytics 这样强大而免费的,从需要在服务器端单独部署的,到可以从前端集成的,不一而足.本文收集并介绍 ...

  4. 基于python的知乎开源爬虫 zhihu_oauth使用介绍

    今天在无意之中发现了一个知乎的开源爬虫,是基于Python的,名字叫zhihu_oauth,看了一下在github上面star数还挺多的,貌似文档也挺详细的,于是就稍微研究了一下.发现果然很好用啊.就 ...

  5. python爬虫之分析Ajax请求抓取抓取今日头条街拍美图(七)

    python爬虫之分析Ajax请求抓取抓取今日头条街拍美图 一.分析网站 1.进入浏览器,搜索今日头条,在搜索栏搜索街拍,然后选择图集这一栏. 2.按F12打开开发者工具,刷新网页,这时网页回弹到综合 ...

  6. 开源实时日志分析ELK

    开源实时日志分析ELK 2018-01-04 转自:开源实时日志分析ELK平台部署 日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的错 ...

  7. DICOM:DICOM三大开源库对比分析之“数据加载”

    背景: 上一篇博文DICOM:DICOM万能编辑工具之Sante DICOM Editor介绍了DICOM万能编辑工具,在日常使用过程中发现,“只要Sante DICOM Editor打不开的数据,基 ...

  8. Java开源爬虫框架crawler4j

    花了两个小时把Java开源爬虫框架crawler4j文档翻译了一下,因为这几天一直在学习Java爬虫方面的知识,今天上课时突然感觉全英文可能会阻碍很多人学习的动力,刚好自己又正在接触这个爬虫框架,所以 ...

  9. Webkit内核开源爬虫蜘蛛引擎

    C#开发的基于Webkit内核开源爬虫蜘蛛引擎 https://www.cnblogs.com/micro-chen/p/9075590.html 概述 在各个电商平台发展日渐成熟的今天.很多时候,我 ...

随机推荐

  1. mysql max_allowed_packet自动重置为1024 终结解决

    背景: 测试环境1台centOS机器,最近一段频繁报“ Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too ...

  2. 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求【转载】

    标签:C# HTTPS HttpWebRequest HTTP HttpWebResponse 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. ...

  3. [JS进阶] 编写可维护性代码 (1)

    今天的web应用大至成千上万行的javascript代码,执行各种复杂的过程,这种演化让我们开发者必须得对可维护性有一定的认识!编写可维护性代码很重要,很多情况下我们是以他人的工作成果为基础,确保代码 ...

  4. 解决Win7下运行php Composer出现SSL报错的问题

    以前都在linux环境使用php composer.今天尝试在win7下运行composer却出现SSL报错: D:\data\www\mmoyu\symapp>php -f %phprc%\c ...

  5. Dll学习一_Dll 创建并动态引用窗体且释放窗体Demo

    1.新建Dll工程 2.Dll工程全部代码 library SubMain; { Important note about DLL memory management: ShareMem must b ...

  6. C#中Delegate

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. AJAX请求遭遇未登录和Session失效的解决方案

    使用技术:HTML + Servlet + Filter + jQuery 一般来说我们的项目都有登录过滤器,一般请求足以搞定.但是AJAX却是例外的,所以解决方法是设置响应为session失效. 一 ...

  8. python学习小结9:面向对象

    面向对象技术 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且 ...

  9. Notes of the scrum meeting(2013/10/23)

    ps:本来是10月23号周三下午开的会,这几天由于各种事情忙,忘记写博客了,现在补上. 软工项目组buaa_smile开始项目第一次scrum meeting meeting time:4:00~5: ...

  10. ios显示艺术字字体颜色渐变

    UIColor * myColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"123.jpg"]]; self. ...