Linux企業級專案實踐之網路爬蟲(8)——認識URL

尹成發表於2014-08-31
URL是Uniform Resource Location的縮寫,譯為“統一資源定位符”。也可以說,URL是Internet上用來描述資訊資源的字串,主要用在各種WWW客戶程式和伺服器程式上。採用URL可以用一種統一的格式來描述各種資訊資源,包括檔案、伺服器的地址和目錄等。URL的格式由三部分組成:第一部分是協議(或稱為服務方式)。第二部分是存有該資源的主機IP地址,包括埠號,預設為80。第三部分是主機資源的具體地址,即目錄和檔名。
爬蟲系統要處理的URL
在這裡,爬蟲系統要處理的URL是指使用超文字傳輸協議HTTP的URL,其埠號預設是80。第三部分是Web伺服器上資源的具體地址,即相對路徑。一般來說,在Web頁面上提取出來的URL,如果是這個站點內部的,那麼多是相對地址,而且可能要進行URL編碼,所以要採用過濾技術,把這些不規範的URL進行解碼,規範化。
進行URL的排程:
爬蟲程式在分析頁面時,會提取出來各種URL,比如,這個站點內的,或這個站點外的,甚至失效的URL。那麼,對於這些不同的URL,同爬行演算法一致,它們的優先順序應該是各不相同的,哪一個的DNS請求已經獲得到並可以立即進行連線?哪一個是失效的、錯誤的,應該立即丟棄掉?或者哪一個是從高優先順序空間中得到的,應該無條件的,以高優先的狀態進行連線,都是需要進行合理,穩妥,高效的排程。
解決方案:
首先,應該明確,這裡所有的URL都應該是優先順序清晰的。否則,所有URL排程將因為沒有級別權重、優先順序而變的混亂不堪。其次,應該設定合適的儲存空間,不能把所有的URL都堆積到一塊,那樣既談不到優先順序清晰,更不要說快速提取。那麼,解決方案如下:
採用URL的多級儲存架構。 
給每一級結構都分配不同的排程優先順序。

各個級別的結構之間進行合適的資料通訊。


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;
    }
}


相關文章