Linux企業級專案實踐之網路爬蟲(17)——儲存頁面

尹成發表於2014-08-31
在爬蟲系統中資料的流量相當大,要處理的資料內容不僅包括爬蟲系統的各種資料結構空間,而且包括從外部節點中得到的各種資料,比如HTTP請求,HTML頁面,ROBOT.TXT等等。如果對這些內容處理不當,那麼不僅造成空間的冗餘浪費,使爬蟲程式效率降低,而且還可能會使系統崩潰。所以,要有合適的空間分配策略。
空間分配與管理方案。
在記憶體中使用緩衝空間,以快速的得到、儲存資料。
統一各種請求的結構,應該合理利用並在每次用完後進行回收。比如,ROBOT.TXT檔案,HTTP請求頭及相應的應答。這種方式,在站點數目數量相當龐大的情況下,非常有必要。

在頁面的抓取部分和儲存部分之間設定合適的介面,直接進行資料交換,從而使系統不必分配更多的空間來緩衝資料。資料緩衝功能由儲存部分內部實現。


static int handler(void * data) {
    Response *r = (Response *)data;
    
    if (strstr(r->header->content_type, "text/html") == NULL)
        return MODULE_ERR;

    char *fn = url2fn(r->url);
    int fd = -1;
    if ((fd = open(fn, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) {
        return MODULE_ERR;
    }

    int left = r->body_len;
    int n = -1;
    while (left) {
        if ((n = write(fd, r->body, left)) < 0) {
            // error
            close(fd);
            unlink(fn);
            free(fn);
            return MODULE_ERR;
        } else {
            left -= n;
        }
    }
    close(fd);
    free(fn);
    return MODULE_OK;
}


相關文章