Linux企業級專案實踐之網路爬蟲(9)——通過URL抓取網頁內容

尹成發表於2014-08-31
基本URL包含模式(或稱協議)、伺服器名稱(或IP地址)、路徑和檔名,如“協議://授權/路徑?查詢”。完整的、帶有授權部分的普通統一資源標誌符語法看上去如下:協議://使用者名稱:密碼@子域名.域名.頂級域名:埠號/目錄/檔名.檔案字尾?引數=值#標誌
爬蟲系統要處理的URL是指使用超文字傳輸協議HTTP的URL。
URL分為絕對URL和相對URL
絕對URL顯示檔案的完整路徑,這意味著絕對URL本身所在的位置與被引用的實際檔案的位置無關。
相對URL以包含URL本身的資料夾的位置為參考點,描述目標資料夾的位置。如果目標檔案與當前頁面(也就是包含URL的頁面)在同一個目錄,那麼這個檔案的相對URL僅僅是檔名和副檔名,如果目標檔案在當前目錄的子目錄中,那麼它的相對URL是子目錄名,後面是斜槓,然後是目標檔案的檔名和副檔名。
如果要引用檔案層次結構中更高層目錄中的檔案,那麼使用兩個句點和一條斜槓。可以組合和重複使用兩個句點和一條斜槓,從而引用當前檔案所在的硬碟上的任何檔案,

一般來說,對於同一伺服器上的檔案,應該總是使用相對URL,它們更容易輸入,而且在將頁面從本地系統轉移到伺服器上時更方便,只要每個檔案的相對位置保持不變,連結就仍然是有效地。


char * url_normalized(char *url) 
{
    if (url == NULL) return NULL;

    /* rtrim url */
    int len = strlen(url);
    while (len && isspace(url[len-1]))
        len--;
    url[len] = '\0';

    if (len == 0) {
        free(url);
        return NULL;
    }

    /* remove http(s):// */
    if (len > 7 && strncmp(url, "http", 4) == 0) {
        int vlen = 7;
        if (url[4] == 's') /* https */
            vlen++;

        len -= vlen;
        char *tmp = (char *)malloc(len+1);
        strncpy(tmp, url+vlen, len);
        tmp[len] = '\0';
        free(url);
        url = tmp;
    }

    /* remove '/' at end of url if have */
    if (url[len-1] == '/') {
        url[--len] = '\0';
    }

    if (len > MAX_LINK_LEN) {
        free(url);
        return NULL;
    }

    return url;
}


相關文章