网络爬虫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的实现细节做一些分析。

猜你喜欢

转载自hsmyy198712.iteye.com/blog/765082
今日推荐