网络爬虫六-URL

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

基本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;  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值