您的位置:首页 > 编程语言

Larbin源代码分析[10]IPSITE站点的抽象类

2011-10-24 17:39 155 查看
一 该类的功能

NamedSite中的类经过dns请求之后,就会将站点名转换为ip,然后将url transfer到Ipsite中,由Ipsite具体完成爬虫工作。

二 类的具体成员参数

time_t lastAccess; //该IP最后获取的时间

bool isInFifo; //当该对象完成了一次fetch之后,将其加入到oksites中,并将其置为true,或者将一个url加入进fifo中

url *getUrl (); //获取队列中的 url对象

IPSite ();

~IPSite ();

Fifo<url> tab; //队列中进行爬取的url列表

int fetch (); //具体执行爬取

三 具体函数实现

(1) 构造函数IPSite() 函数的具体实现为 lastAccess = 0 ; isInFifo = false ;

(2)IPSite::putUrl (url *u)

将url放入IPSite的fifo队列中,然后将isInFifo设置为true。如果lastAccess+waitDuration <= now

以及当期存在空闲的连接,则可以 调用fetch以进行爬取网页。

否则将该IpSite加入进okSites中。

(3)inline url *IPSite::getUrl () 从fifo中获取一个url

(4) fetch() 函数,用以爬取网页

Connexion *conn = global::freeConns->get(); //首先获取一个空闲的连接

url *u = getUrl(); //获取一个url

char res = getFds(conn, &(u->addr), u->getPort()); //然后根据url建立一个连接

if (res != emptyC) { //下面则为一个具体发送http报文请求的过程

lastAccess = global::now;

conn->timeout = timeoutPage;

conn->request.addString("GET ");

if (global::proxyAddr != NULL) {

char *tmp = u->getUrl();

conn->request.addString(tmp);

} else {

conn->request.addString(u->getFile());

}

conn->request.addString(" HTTP/1.0\r\nHost: ");

conn->request.addString(u->getHost());

#ifdef COOKIES

if (u->cookie != NULL) {

conn->request.addString("\r\nCookie: ");

conn->request.addString(u->cookie);

}

#endif // COOKIES

conn->request.addString(global::headers);

conn->parser = new html (u, conn); //建立页面解析类

conn->pos = 0; //获取的数据中的下标位置 ,pos

conn->err = success;

conn->state = res;

if (tab.isEmpty()) {

isInFifo = false;

} else {

global::okSites->put(this);

}

return 0;

}

下面附带上一次http请求的头部的格式

GET /index.html HTTP/1.1

Accept:text/html

User-Agent:larbin

Host: ioa.rising.com.cn

From:jiangzy@rising.com.cn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: