IpSite站点的抽象类
一 该类的功能
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
四 总结:
该类IpSite主要用来向http服务器发送连接请求,并构建出对应的文件解析类html,存储在conn中。