Linux企業級專案實踐之網路爬蟲(18)——佇列處理
所有的URL都接受管理,並在此進行流動。URL從管理模組的儲存空間開始,一直到最後輸出給磁碟上的URL索引,都由此部分排程。
首先,給出URL排程的一般過程,如圖所示。
其流程的各個具體操作,後面詳述。
要實現前面DNS的無重複有效請求,那麼在這個部分裡設定一個Nsite類,實現這樣的功能:當一個站點請求過DNS後,就把返回的IP儲存到這個類裡,那麼再有這個站點內的URL出現(域名部分相同),就可以使用這個IP,而不必重複請求。
為了從一個URL中很快的找到其對應的Nsite還應該設定一個hash表,
裡面存放著所有Nsite站點,這樣,一個URL可以通過採用計算其域名的雜湊值就快速的找到對應的站點Nsite。如:
NamedSite *namedSiteList;
namedSiteList = new NamedSite[記憶體中的站點數];
首先,給出URL排程的一般過程,如圖所示。
其流程的各個具體操作,後面詳述。
要實現前面DNS的無重複有效請求,那麼在這個部分裡設定一個Nsite類,實現這樣的功能:當一個站點請求過DNS後,就把返回的IP儲存到這個類裡,那麼再有這個站點內的URL出現(域名部分相同),就可以使用這個IP,而不必重複請求。
為了從一個URL中很快的找到其對應的Nsite還應該設定一個hash表,
裡面存放著所有Nsite站點,這樣,一個URL可以通過採用計算其域名的雜湊值就快速的找到對應的站點Nsite。如:
NamedSite *namedSiteList;
namedSiteList = new NamedSite[記憶體中的站點數];
如果這個站點沒有請求過DNS,那麼就加到一個迴圈佇列dnssite中,隨時等待main( )中對其提出排程。如果有就轉移到IPSite中,如果這個IPSite已經加到了okSite,那麼,就把URL打到tab中。隨時等待main( )排程抓取。
void push_surlqueue(Surl *url)
{
if (url != NULL && surl_precheck(url)) {
SPIDER_LOG(SPIDER_LEVEL_DEBUG, "I want this url: %s", url->url);
pthread_mutex_lock(&sq_lock);
surl_queue.push(url);
if (surl_queue.size() == 1)
pthread_cond_signal(&sq_cond);
pthread_mutex_unlock(&sq_lock);
}
}
Url * pop_ourlqueue()
{
Url *url = NULL;
pthread_mutex_lock(&oq_lock);
if (!ourl_queue.empty()) {
url = ourl_queue.front();
ourl_queue.pop();
pthread_mutex_unlock(&oq_lock);
return url;
} else {
int trynum = 3;
struct timespec timeout;
while (trynum-- && ourl_queue.empty()) {
get_timespec(&timeout, 500); /* 0.5s timeout*/
pthread_cond_timedwait(&oq_cond, &oq_lock, &timeout);
}
if (!ourl_queue.empty()) {
url = ourl_queue.front();
ourl_queue.pop();
}
pthread_mutex_unlock(&oq_lock);
return url;
}
}
相關文章
- Linux企業級專案實踐之網路爬蟲(28)——爬蟲socket處理Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(5)——處理配置檔案Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(13)——處理user-agentLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(10)——處理HTTP狀態碼Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(11)——處理http請求頭Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(12)——處理HTTP應答頭Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(7)——DNS解析Linux爬蟲DNS
- Linux企業級專案實踐之網路爬蟲(19)——epoll介面Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(4)——主程式流程Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(8)——認識URLLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(25)——管理原始碼之SVNLinux爬蟲原始碼
- Linux企業級專案實踐之網路爬蟲(21)——擴充套件為多工爬蟲Linux爬蟲套件
- Linux企業級專案實踐之網路爬蟲(17)——儲存頁面Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(26)——執行緒池Linux爬蟲執行緒
- Linux企業級專案實踐之網路爬蟲(27)——多路IO複用Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(29)——遵守robots.txtLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(24)——定製規則擴充套件為垂直爬蟲Linux爬蟲套件
- Linux企業級專案實踐之網路爬蟲(9)——通過URL抓取網頁內容Linux爬蟲網頁
- Linux企業級專案實踐之網路爬蟲(22)——編寫爬蟲系統服務控制指令碼Linux爬蟲指令碼
- Linux企業級專案實踐之網路爬蟲(6)——將程式設計成為守護程式Linux爬蟲程式設計
- Linux企業級專案實踐之網路爬蟲(15)——區分文字檔案和二進位制檔案Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(14)——使用正規表示式抽取HTML正文和URLLinux爬蟲HTML
- Linux企業級專案實踐之網路爬蟲(20)——擴充套件成為規則外掛模式Linux爬蟲套件模式
- Linux企業級專案實踐之網路爬蟲(23)——系統測試:找出系統中的bugLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(16)——使用base64傳輸二進位制資料Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(30)——通過查閱RFC文件擴充更加複雜的功能Linux爬蟲
- 網路爬蟲專案爬蟲
- 企業資料爬蟲專案爬蟲
- 網路爬蟲專案蒐集爬蟲
- 企業資料爬蟲專案(二)爬蟲
- Python網路爬蟲實戰專案大全 32個Python爬蟲專案demoPython爬蟲
- 專案--python網路爬蟲Python爬蟲
- 網路爬蟲(python專案)爬蟲Python
- Python網路爬蟲實戰小專案Python爬蟲
- Python網路爬蟲實戰專案大全!Python爬蟲
- Java 爬蟲專案實戰之爬蟲簡介Java爬蟲
- 精通Scrapy網路爬蟲【一】第一個爬蟲專案爬蟲
- 如何處理識別出的網路爬蟲爬蟲