Linux企業級項目實踐之網絡爬蟲(9)——經過URL抓取網頁內容

基本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;
}
相關文章
相關標籤/搜索