Linux企业级项目实践之网络爬虫(8)——认识URL
2014-08-31 22:08
579 查看
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的多级存储架构。
给每一级结构都分配不同的调度优先级。
各个级别的结构之间进行合适的数据通信。
爬虫系统要处理的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; } }
相关文章推荐
- Linux企业级项目实践之网络爬虫(8)——认识URL
- Linux企业级项目实践之网络爬虫(9)——通过URL抓取网页内容
- Linux企业级项目实践之网络爬虫(14)——使用正则表达式抽取HTML正文和URL
- Linux企业级项目实践之网络爬虫(14)——使用正则表达式抽取HTML正文和URL
- Linux企业级项目实践之网络爬虫(9)——通过URL抓取网页内容
- Linux企业级项目实践之网络爬虫(15)——区分文本文件和二进制文件
- Linux企业级项目实践之网络爬虫(13)——处理user-agent
- Linux企业级项目实践之网络爬虫(1)——项目概述及准备工作
- Linux企业级项目实践之网络爬虫(12)——处理HTTP应答头
- Linux企业级项目实践之网络爬虫(11)——处理http请求头
- Linux企业级项目实践之网络爬虫(6)——将程序设计成为守护进程
- Linux企业级项目实践之网络爬虫(3)——设计自己的网络爬虫
- Linux企业级项目实践之网络爬虫(10)——处理HTTP状态码
- Linux企业级项目实践之网络爬虫(4)——主程序流程
- Linux企业级项目实践之网络爬虫(7)——DNS解析
- Linux企业级项目实践之网络爬虫(5)——处理配置文件
- Linux企业级项目实践之网络爬虫(11)——处理http请求头
- Linux企业级项目实践之网络爬虫(3)——设计自己的网络爬虫
- Linux企业级项目实践之网络爬虫(1)——项目概述及准备工作