Linux企業級專案實踐之網路爬蟲(24)——定製規則擴充套件為垂直爬蟲

尹成發表於2014-08-31
在垂直搜尋的索引建立之前,我們需要到垂直網站上抓取資源並做一定的處理。垂直搜尋與通用搜尋不同之處在於,通用搜尋不需要理會網站哪些資源是需要的,哪些是不需要的,一併抓取並將其文字部分做索引。而垂直搜尋裡,我們的目標網站往往在某一領域具有其專業性,其整體網站的結構相當規範(否則使用者體驗也是個災難,想想東一篇文章西一篇文章基本沒人會喜歡),並且垂直搜尋往往只需要其中一部分具有垂直性的資源,所以垂直爬蟲相比通用爬蟲更加精確。


垂直爬蟲爬取資源步驟:
首先選定需要抓取的目標網站,輸入資料庫的站源表sitelist,然後url crawler會讀取出來存入map,並提出對應站點的正則解析規則。
然後根據事先制定的url列表頁正規表示式,url crawler到列表頁爬取列表並提取出來存入資源url表urllist,當中涉及一些列表頁分頁功能,具體視每個網站分頁url規則而定。
從資料庫的資源url表讀出urls及其資源頁的爬取規則,存入一個同步的佇列中(一般做法會將url做md5處理,用於去重,以免重複爬取相同url,浪費資源),多執行緒下的每個爬蟲程式將從此佇列讀取urls(若佇列為空執行緒將進入等待),然後爬取每個資源頁並保持頁面。

最後根據爬取到的頁面,進行進一步的處理。


int extract_url(regex_t *re, char *str, Url *ourl)
{
    const size_t nmatch = 2;
    regmatch_t matchptr[nmatch];
    int len;

    char *p = str;
    while (regexec(re, p, nmatch, matchptr, 0) != REG_NOMATCH) {
        len = (matchptr[1].rm_eo - matchptr[1].rm_so);
        p = p + matchptr[1].rm_so;
        char *tmp = (char *)calloc(len+1, 1);
        strncpy(tmp, p, len);
        tmp[len] = '\0';
        p = p + len + (matchptr[0].rm_eo - matchptr[1].rm_eo);

        /* exclude binary file */
        if (is_bin_url(tmp)) {
            free(tmp);
            continue;
        }

        char *url = attach_domain(tmp, ourl->domain);
        if (url != NULL) {
            SPIDER_LOG(SPIDER_LEVEL_DEBUG, "I find a url: %s", url);
            Surl * surl = (Surl *)malloc(sizeof(Surl));
            surl->level = ourl->level + 1;
            surl->type = TYPE_HTML;

            /* normalize url */
            if ((surl->url = url_normalized(url)) == NULL) {
                SPIDER_LOG(SPIDER_LEVEL_WARN, "Normalize url fail");
                free(surl);
                continue;
            }

            if (iscrawled(surl->url)) { /* if is crawled */
                SPIDER_LOG(SPIDER_LEVEL_DEBUG, "I seen this url: %s", surl->url);
                free(surl->url);
                free(surl);
                continue;
            } else {
                push_surlqueue(surl);
            }

        }
    }

    return (p-str);
}


相關文章