IpSite站點(diǎn)的抽象類
一 該類的功能
NamedSite中的類經(jīng)過dns請(qǐng)求之后,就會(huì)將站點(diǎn)名轉(zhuǎn)換為ip,然后將url transfer到Ipsite中,由Ipsite具體完成爬蟲工作。
二 類的具體成員參數(shù)
time_t lastAccess; //該IP最后獲取的時(shí)間
bool isInFifo; //當(dāng)該對(duì)象完成了一次fetch之后,將其加入到oksites中,并將其置為true,或者將一個(gè)url加入進(jìn)fifo中
url *getUrl (); //獲取隊(duì)列中的 url對(duì)象
IPSite ();
~IPSite ();
Fifo<url> tab; //隊(duì)列中進(jìn)行爬取的url列表
int fetch (); //具體執(zhí)行爬取
三 具體函數(shù)實(shí)現(xiàn)
(1) 構(gòu)造函數(shù)IPSite() 函數(shù)的具體實(shí)現(xiàn)為 lastAccess = 0 ; isInFifo = false ;
(2)IPSite::putUrl (url *u)
將url放入IPSite的fifo隊(duì)列中,然后將isInFifo設(shè)置為true。如果lastAccess+waitDuration <= now
以及當(dāng)期存在空閑的連接,則可以 調(diào)用fetch以進(jìn)行爬取網(wǎng)頁(yè)。
否則將該IpSite加入進(jìn)okSites中。
(3)inline url *IPSite::getUrl () 從fifo中獲取一個(gè)url
(4) fetch() 函數(shù),用以爬取網(wǎng)頁(yè)
Connexion *conn = global::freeConns->get(); //首先獲取一個(gè)空閑的連接
url *u = getUrl(); //獲取一個(gè)url
char res = getFds(conn, &(u->addr), u->getPort()); //然后根據(jù)url建立一個(gè)連接
if (res != emptyC) { //下面則為一個(gè)具體發(fā)送http報(bào)文請(qǐng)求的過程
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); //建立頁(yè)面解析類
conn->pos = 0; //獲取的數(shù)據(jù)中的下標(biāo)位置 ,pos
conn->err = success;
conn->state = res;
if (tab.isEmpty()) {
isInFifo = false;
} else {
global::okSites->put(this);
}
return 0;
}
下面附帶上一次http請(qǐng)求的頭部的格式
GET /index.html HTTP/1.1
Accept:text/html
User-Agent:larbin
Host: ioa.rising.com.cn
From:jiangzy@rising.com.cn
四 總結(jié):
該類IpSite主要用來向http服務(wù)器發(fā)送連接請(qǐng)求,并構(gòu)建出對(duì)應(yīng)的文件解析類html,存儲(chǔ)在conn中。