网络爬虫Larbin的学习(一)——larbin的配置
Larbin是一款历史比较悠久的网络爬虫程序,它基于C/C++编写。
目前它可以在linux下运行,对于windows下的运行情况目前尚不清楚(可能需要进行修改)
对于网络爬虫的基础知识,在此不做太多的介绍,本文只对爬虫的配置进行解说。
由于larbin的年头比较远(作者从上世纪开始编写),里面难免有一些与现在系统不一致的情况(作者于2003年停止了维护),所以我们在配置中需要修改它的源代码。
首先到它的官方网站:
http://larbin.sourceforge.net/index-eng.html
下载larbin,这个程序是由法国人写的,因此对于Chinese来说一定要进英文版的首页
由于下载到的内容是他的源代码,而非二进制版,所以我们要做编译。
(1)首先在linux 的CMD下,运行./configure,它会生成一系列的文件,当然,在结尾处可能会有错误,不过这个没有关系
(2)把所有源文件中包含“#include”的内容改变为“#include”,并且在文件中加入“using namespace std;”原因就不说了。
检查哪个文件包含了这句话,可以用grep实现:
grep -nR "include" ./
具体的修改还没有好的办法。
(3)此时再运行make命令,如果不出意外,系统会报一个重定义的错误。这时我们可以找到%LARBIN_HOME%/adsn/interal.h,将其中冲突的那个函数注释掉。
(4)对于一些系统还说,可能还需要安装一个makedepend的东西,在ubuntu下,使用如下命令:
sudo apt-get install xutils-dev
(5)对于本人来说,到这里我的larbin就可以使用了。
larbin的使用
一 编译
1 sudo apt-get install xutils-dev
2 注释掉adns下internal.h中第568—571行代码
3 到/usr/include/c++/下CP一份iostream文件到larbin的src目录下。并将其的名改为iostream.h.打开此文件添加一句
using namespace std;
4 ./configure && make
二 配置
修改larbin.conf的 StartUrl
修改options.h的4中输出
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.
将SIMPLE_SAVE和STATS_OUTPUT选项打开
三 运行
./larbin
larbin在当前目录下创建save文件夹,用来存储网页
网络爬虫Larbin的学习(三)——整体架构
这一回开始对Larbin的源代码进行学习。经过一段时间的学习,我发现larbin的架构还是不错的。而且他的架构中使用到了许多技术,在阅读源代码的过程中也可以捡起以前学过的东西。
进入%LARBIN_HOME%/src,我们可以看到许多源文件,这些源文件主要分为两大类:
(1)主控类
main.cc : 主控程序,调度所有代码进行工作
global.h,global.cc : 实际上的核心程序,包含爬虫的所有核心内容
(2)配置类
option.h : 策略方面的配置
types.h : 具体数值的配置
关于具体数值的问题,我们在第二部分已经说过了,下面重点看main.cc
(1)在main函数的起始处,对global类进行初始化。global类是整个爬虫的核心,因此对他的分析要慢慢深入。在此我们只要知道,global类中有许多静态成员变量,也就是说可以作全局变量使用,这里主要就是对他们进行初始化。
(2)waitbandwidth() 等待带宽满足需要
(3)input() 将需要爬取的seed URL装载进来
(4)sequencer() 对将要爬取的页面进行缓冲,确定每一轮可以进行爬取的页面
(5)fetchDns() 获取待爬取页面的IP地址和端口号,这需要通过练习DNS服务器将URL进行转换
(6)fetchOpen() 获取当前网页
(7)checkAll() 做一些检验和网页链接分析(也是我们可以定制化的一部分)
这几部基本上包含了一个爬虫的特征,那么对于一个爬虫来说,需要考虑的问题还有很多。
比方说网页分析与网页保存问题。在爬虫爬取过程中,应该花多大的工夫去分析一个网页?网页的保存形式应该是怎样?
这些我们将在后面做详细地分析与介绍。
下一部分将对一些基本数据结构做一些介绍
网络爬虫Larbin的学习(四)——基本数据结构
这一回介绍Larin中的基本数据结构,其实这一部分对于每一个高水平的程序来说,都是相似的,但是在此还是废话一下。
首先从我接触到的第一个数据结构开始(因为我在详细阅读代码前首先做了些源代码修改工作)——Vector
(1)%LARBIN_HOME%/src/utils/Vector
这个类唯一值得一提的就是他的存储空间优化机制。这在大量的数据结构中都有。
它有两个成员变量:
uint pos;
uint size;
其中pos代表vector的使用容量,size代表vector的占用容量。
当占用容量不够用,vector就需要进行一次扩容。代码中是扩1倍容量,如果还不够,就扩到当前需要的量。
vector的使用处:大家应该还记得第2部分中,用户可以参与的程序部分。
也就是loaded()函数,他的参数是一个html。它里面包含一个vector用于存储当前页面指向的链接。如果需要输出特定的链接关系(用于PR)的话,那么就需要用到这个结构。
(2)%LARBIN_HOME%/src/utils/url
这个类主要处理url相关的一些基本问题。他的成员变量中包含Host,port等url的基础组成部分。
它的内部包含两个hashcode的算法,一个是求对整体url的hash值,一个是对Host求hash值。
这两个求值用在的地方也不太一样。在后面会详细介绍。
(3)%LARBIN_HOME%/src/utils/Fifo
这个类就是模拟一个队列,当然,在他里面也包含了扩容的算法。按需扩容的思想在整个程序中有很好地体现。具体的队列算法想来十分简单了。
这个类还有两个相关的类:syncFIfo和PersistentFifo,前者支持同步,后者支持同步和备份(文件存储),在具体的使用中再看他们的用途。
(4)%LARBIN_HOME%/src/utils/NameSite
这个类是一个比较重要的类,这个爬虫爬行过程的一些核心代码就在这里面。首先,它是一组站点的集合,他的成员变量分为两个部分:
网址部分:
char name[maxSiteSize]
uint16 port
队列部分:
uint16 nburl
url *fifo[maxUrlsBySite]
uint8 inFifo
uint8 outFifo
在队列中会保存一定量的url,当某个url需要被处理时,则将这个url取出,保存在网址部分的变量中。
在这个类的函数中,还包含一些DNS解析的功能,这些在流程分析中再谈。
(5)%LARBIN_HOME%/src/utils/IPSite
这个类和上面的类类似,不过他保存的就已经是IP地址了。这个类的结构略显简单,它里面也是包含一个fifo,在这个类中包含了一个功能函数,就是fetch,其实这个函数只是对待访问站点进行连接,并不做真正的内容读取。
还有一些类,比如string,text,hashTable,hashDup就不做介绍了,因为这些类的内容比较少,大家一看名字便知他的含义。
下一次将对Larbin的实现细节做一些分析。