Linux企業級專案實踐之網路爬蟲(7)——DNS解析

尹成發表於2014-08-31
DNS 是Domain Name Service的縮寫。域名系統為Internet上的主機分配域名地址和IP地址。IP地址不易於記憶,然而域名地址相比較而言是方便於記憶的。使用者如果使用域名地址,當想獲得IP地址時,就要向域名伺服器傳送請求。這個域名伺服器就會自動把域名地址轉為IP地址返回給使用者。
爬蟲程式優化DNS請求的必要性
當爬蟲程式從HTML頁面上提取URL時,一般情況下,應該有很多都是這個站點內部的URL。那麼當這個站點裡的某個URL請求過DNS以後,就應該採用某種資料結構把這個值儲存起來。以後再發現這個站點內的URL後,就把域名部分的IP取出給這個URL,從而減少不必要的DNS請求。這樣可以大大加快抓取頁面的速度,提高效率。
優化DNS請求的方式

對於同一個站點內部的頁面應該設一個資料結構以儲存,並且方便查詢。這樣,當爬蟲系統得到了一個新的URL以後,可以快速的轉換地址格式並進行連線。


void * urlparser(void *none)
{
    Surl *url = NULL;
    Url  *ourl = NULL;
    map<string, string>::const_iterator itr;


    while(1) {
        pthread_mutex_lock(&sq_lock);
        while (surl_queue.empty()) {
            pthread_cond_wait(&sq_cond, &sq_lock);
        }
        url = surl_queue.front();
        surl_queue.pop();
        pthread_mutex_unlock(&sq_lock);

        ourl = surl2ourl(url);

        itr = host_ip_map.find(ourl->domain);
        if (itr == host_ip_map.end()) { /* not found */
            /* dns resolve */
            event_base * base = event_init();
            evdns_init();
            evdns_resolve_ipv4(ourl->domain, 0, dns_callback, ourl);
            event_dispatch();
            event_base_free(base);

        } else {
            ourl->ip = strdup(itr->second.c_str());
            push_ourlqueue(ourl);
        }
    }

    //evdns_base_free(dnsbase, 0);
    //event_base_free(base);
    return NULL;
}


相關文章