网络爬虫十三-队列处理

所有的URL都接受管理,并在此进行流动。URL从管理模块的存储空间开始,一直到最后输出给磁盘上的URL索引,都由此部分调度。
首先,给出URL调度的一般过程,如图所示。
其流程的各个具体操作,后面详述。
要实现前面DNS的无重复有效请求,那么在这个部分里设置一个Nsite类,实现这样的功能:当一个站点请求过DNS后,就把返回的IP保存到这个类里,那么再有这个站点内的URL出现(域名部分相同),就可以使用这个IP,而不必重复请求。
为了从一个URL中很快的找到其对应的Nsite还应该设置一个hash表,
里面存放着所有Nsite站点,这样,一个URL可以通过采用计算其域名的哈希值就快速的找到对应的站点Nsite。如:
NamedSite *namedSiteList;
namedSiteList = new NamedSite[内存中的站点数];
如果这个站点没有请求过DNS,那么就加到一个循环队列dnssite中,随时等待main( )中对其提出调度。如果有就转移到IPSite中,如果这个IPSite已经加到了okSite,那么,就把URL打到tab中。随时等待main( )调度抓取。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值