转自:http://blog.csdn.net/s030702614/article/details/5683928

1. 主函数:

int main (int argc, char *argv[])  {
global glob(argc,argv) //初始化变量、队列
StartThread(startWebserver,NULL) //web服务
cron() //配置初始化
for( ; ;) {
waitBandWidth(&old); //等待带宽
poll(NULL,0,10); //间隔10ms
cron();
input(); //接受数据,装载url(貌似都没有执行过)
sequencer(); //url队列调度
fetchDns(); //解析DNSSites中的dns
fetchOpen(); //爬取网页
CheckAll(); //读取数据
poll(); //间隔10ms
}
}

2. void sequencer ();

函数功能:按优先级顺序将url加入到namedSiteList

参数说明:void

返回值:队列中有url返回true,否则返回false

bool sequencer(void)  {
space=putAll(); //能够装载的urls数
CanGetUrl(& testPriority); { //获得一个url,放到namedsitelist中去
if(URLPriorityWait中有url)
从中获得url加入到namedSiteList;
else if(URLPtiority中有url)
从中获得url加入到namedSiteList;
else {
if(URLDiskwait中有url)
从中获得url加入到namedSiteList;
else //URLDisk中有url
从中获得url加入到namedSiteList;
}
}
}

3. void fetchDns;

函数功能:建立socket,进行dns解析

参数说明:void

返回值:void

void fetchDns ()  {
while(等待解析的dns数<dns最大并行连接数&&有空闲连接&&IPUrl < maxIPUrls) {
从dnsSites获得一个url;
site->newQuery();//dns查询
} while (有dns等待解析&&有空闲连接) {// Read available answers
adns_check(global::ads, &quer, &ans, (void**)&site);
site->dnsAns(ans); // dns解析成功,申明连接空闲
}
}
 
4. void fetchOpen ();

函数功能:建立sockets连接(仅仅对于已经经过dns解析的站点)

参数说明:void

返回值:void

备注:工作在主线程

void fetchOpen () {
while (okSites中还有url &&有空闲的连接) {
从okSites-中获得一个url;
/** s->fetch() means :
* fetch the first page in the fifo okSites
* there must be at least one element in freeConns !!!
* return expected time for next call (0 means now is OK)
* This function always put the IPSite in fifo before returning
* (or set isInFifo to false if empty)
*/
next_call = s->fetch();//调用fetch()
}
}

5. void checkAll ()

函数功能:1、read all data available   2、fill fd_set for next select  3、give back max fds

参数说明:void

返回值:void

void checkAll ()  {
for (uint i=0; i<global::nb_conn; i++) {//nb_conn为并行的连接数,对于每个连接
switch(连接状态) {
case connectingC:
case writeC:
/*如果是要连接,调用getsockopt,再把状态改为writeC。如果是writeC,调用write,将状态改为openC。*/
pipeWrite(conn);
break;
case openC:
pipeRead(conn);
break;
}
} // update fd_set for the next select
/*对要将读写设为非堵塞的设置*/
for (uint i=0; i<global::nb_conn; i++) {
int n = (global::connexions+i)->socket;
switch ((global::connexions+i)->state) {
case connectingC:
case writeC:
global::setPoll(n, POLLOUT);
break;
case openC:
global::setPoll(n, POLLIN);
break;
}
}
}

【转】larbin主要代码说明的更多相关文章

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

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

  2. Larbin初试

    前阵子找工作的时候经常会看到epoll多路复用的知识点,无奈自己一点都不懂.慌忙之际也只能去了解个大概.所以最近闲下来之后想要基于epoll机制实现一个比较有用的东西,刚好最近又想爬些东西,希望这次能 ...

  3. 爬虫Larbin解析(二)——sequencer()

    分析的函数: void sequencer() //位置:larbin-2.6.3/src/fetch/sequencer.ccvoid sequencer() { bool testPriority ...

  4. 爬虫Larbin解析(一)——Larbin配置与使用

    介绍 功能:网络爬虫 开发语言:c++ 开发者:Sébastien Ailleret(法国) 特点:只抓取网页,高效(一个简单的larbin的爬虫可以每天获取500万的网页) 安装 安装平台:Ubun ...

  5. ROBOTS.TXT屏蔽笔记、代码、示例大全

    自己网站的ROBOTS.TXT屏蔽的记录,以及一些代码和示例: 屏蔽后台目录,为了安全,做双层管理后台目录/a/xxxx/,蜘蛛屏蔽/a/,既不透露后台路径,也屏蔽蜘蛛爬后台目录 缓存,阻止蜘蛛爬静态 ...

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

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

  7. larbin之哈希之谈

    由于工作原因,打算对larbin的源码进行分析一番 用的是2.6.3版本的larbin源码,由于这是业余,会断断续续的分析上传,已做记录笔记 今天我们分析一下larbin的哈希表 这个哈希表结构比较简 ...

  8. 日期格式代码出现两次的错误 ORA-01810

    错误的原因是使用了两次MM . 一.Oracle中使用to_date()时格式化日期需要注意格式码 如:select to_date('2005-01-01 11:11:21','yyyy-MM-dd ...

  9. 可爱的豆子——使用Beans思想让Python代码更易维护

    title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...

随机推荐

  1. 【LeetCode 235】Lowest Common Ancestor of a Binary Search Tree

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...

  2. 【加解密】关于DES加密算法的JAVA加密代码及C#解密代码

    JAVA加密: package webdomain; import java.security.Key; import java.security.spec.AlgorithmParameterSpe ...

  3. C++ 串

    ♣ string 的基类basic_string中没有虚函数,它无意成为基类.更像是为了处理字符相关的问题而专门提供的一个工具及操作方法.如:想要在一个字符串str1中查找str2,没必要每次都去写K ...

  4. WCF寄宿方式

    WCF开发框架形成之旅---WCF的几种寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者 ...

  5. Redis批量导入数据

    首先准备数据文件 格式为 SET Key0 Value0 SET Key1 Value1 ... SET KeyN ValueN 利用shell转换数据 #!/bin/bash while read ...

  6. Java执行groovy脚本

    Binding binding = new Binding(); binding.setVariable("foo", new Integer(2)); GroovyShell s ...

  7. 【数据结构与算法分析——C语言描述】第二章总结 算法分析

    算法 算法(algorithm)是为求解一个问题需要遵循的.被清楚地指定的简单指令的集合. 数学基础 四个定义: 1.大O表示法: 如果存在正常数 c 和 n0 使得当 N ≥ n0时,T(N) ≤ ...

  8. 隐藏StatusBar 非setStatusBarHidden

    UIWindow * window = [[UIApplication sharedApplication].windows lastObject]; 隐藏 [window setWindowLeve ...

  9. 从数列1,2,3.......n 中 随意取几个数,使其和等于 m

    //从数列1,2,3.......n 中 随意取几个数,使其和等于 m           public static void Print(int n, int m, List<int> ...

  10. 2款好用的Web在线编辑器

    1.CKEditor FCKEditor 现在已经重新开发,并改名为 CKEditor. CKeditor是一个专门使用在网页上,开放源代码,高度可定制,跨平台的所见即所得文字编辑器,兼容于绝大部分的 ...