for (;;) {
// update time
global::now = time(NULL);
if (old != global::now) {
// this block is called every second
old = global::now;
cron();
}
stateMain(-count);
waitBandwidth(&old);
stateMain(1);
for (int i=0; i<global::maxFds; i++)
global::ansPoll[i] = 0;
for (uint i=0; i<global::posPoll; i++)
global::ansPoll[global::pollfds[i].fd] = global::pollfds[i].revents;
global::posPoll = 0;
stateMain(2);
input();
stateMain(3);
sequencer();
stateMain(4);
fetchDns();
stateMain(5);
fetchOpen();
stateMain(6);
checkAll();
// select
stateMain(count++);
poll(global::pollfds, global::posPoll, 10);
stateMain(7);
}
}
larbin主函数最主要的部分为上面的一个循环,其中各个函数的介绍为:
(1)在main函数的起始处,对global类进行初始化。global类是整个爬虫的核心,因此对他的分析要慢慢深入。在此我们只要知道,global类中有许多静态成员变量,也就是说可以作全局变量使用,这里主要就是对他们进行初始化。
(2)waitbandwidth() 等待带宽满足需要
(3)input() 将需要爬取的seed URL装载进来
(4)sequencer() 对将要爬取的页面进行缓冲,确定每一轮可以进行爬取的页面
(5)fetchDns() 获取待爬取页面的IP地址和端口号,这需要通过练习DNS服务器将URL进行转换
(6)fetchOpen() 获取当前网页
(7)checkAll() 做一些检验和网页链接分析(也是我们可以定制化的一部分) 这几部基本上包含了一个爬虫的特征,那么对于一个爬虫来说,需要考虑的问题还有很多。 比方说网页分析与网页保存问题。在爬虫爬取过程中,应该花多大的工夫去分析一个网页?网页的保存形式应该是怎样?