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

Linux企业级项目实践之网络爬虫(8)——认识URL的更多相关文章

  1. Linux企业级项目实践之网络爬虫(1)——项目概述及准备工作

    我们在学习了Linux系统编程之后,需要一些实战项目来提高自己的水平,本系列我们通过编写一个爬虫程序,将我们学习的知识进行综合应用,同时在实现项目的过程中逐渐养成一些有用的思维方式,并具有初步的软件开 ...

  2. Linux企业级项目实践之网络爬虫(29)——遵守robots.txt

    Robots协议(也称为爬虫协议.机器人协议等)的全称是"网络爬虫排除标准"(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以 ...

  3. Linux企业级项目实践之网络爬虫(21)——扩展为多任务爬虫

    高效的网络爬虫是搜索引擎的重要基础.采用多任务并发执行,实现类似于CPU的流水线(pipeline)运行方式,可极大地提高网络和计算资源的利用率等性能. #include "threads. ...

  4. Linux企业级项目实践之网络爬虫(2)——网络爬虫的结构与工作流程

    网络爬虫是捜索引擎抓取系统的重要组成部分.爬虫的主要目的是将互联网上的网页下载到本地形成一个或联网内容的镜像备份. 一个通用的网络爬虫的框架如图所示:

  5. Linux企业级项目实践之网络爬虫(23)——系统测试:找出系统中的bug

    为了验证爬虫的业务流程.性能和健壮性需要进行测试. 软件测试是描述一种用来促进鉴定软件的正确性.完整性.安全性和质量的过程.软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件 ...

  6. Linux企业级项目实践之网络爬虫(28)——爬虫socket处理

    Socket是进程之间交换数据的机制.这些进程即可以是同一台机器上的,也可以是通过网络连接起来的不同机器.一旦一个Socket连接建立,那么数据就能够双向传输,直到其中一端关闭连接. 通常,请求数据的 ...

  7. Linux企业级项目实践之网络爬虫(19)——epoll接口

    由于要实现爬虫程序的快速抓取,显然如果采用阻塞型的I/O方式,那么系统可能很长时间都处在等待内核响应的状态中,这样爬虫程序将大大地降低效率.然而,如果采用非阻塞I/O,那么就要一直调用应用进程,反复对 ...

  8. Linux企业级项目实践之网络爬虫(6)——将程序设计成为守护进程

    在linux或者unix操作系统中在系统的引导的时候会开启很多服务,这些服务就叫做守护进程.为了增加灵活性,root可以选择系统开启的模式,这些模式叫做运行级别,每一种运行级别以一定的方式配置系统. ...

  9. Linux企业级项目实践之网络爬虫(3)——设计自己的网络爬虫

    网络抓取系统分为核心和扩展组件两部分.核心部分是一个精简的.模块化的爬虫实现,而扩展部分则包括一些便利的.实用性的功能.目标是尽量的模块化,并体现爬虫的功能特点.这部分提供简单.灵活的API,在基本不 ...

  10. Linux企业级项目实践之网络爬虫(30)——通过查阅RFC文档扩充更加复杂的功能

    HTTP是一种很简单的请求.响应式协议,客户端发送一个请求.服务器返回一个响应.HTTP 1.1 版本规范由 RFC2616 定义.了解了 HTTP请求.响应消息在TCP数据流中的格式,很容易使用纯 ...

随机推荐

  1. Palindrome Permutation II 解答

    Question Given a string s, return all the palindromic permutations (without duplicates) of it. Retur ...

  2. [LeetCode] 237. Delete Node in a Linked List 解题思路

    Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...

  3. RSA算法python实现

    RSA算法是一种非对称加密算法,是现在广泛使用的公钥加密算法,主要应用是加密信息和数字签名.详情请看维基:http://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF ...

  4. linux下的java远程调试jpda+tomcat

    项目放到linux服务器了,服务器的环境或者数据可能和我们本地不一样,这个时候我们可能需要远程的断点进行调试,来查看请求过程中的各个变量的值.这里我们的应用服务器用的tomcat5.5.17 这个时候 ...

  5. MVC 4.0语法 自动分页

    4.0语法中实现自动分页只需要两个方法即可,Skip() ----跳过序列中指定的元素,Take()-----从序列的开头返回指定数量元素. 一般用自动分页都是无刷新的,可以把显示的数据,用局部页面封 ...

  6. 《python源代码剖析》笔记 python中的Dict对象

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.PyDictObject对象 -->  C++ STL中的map是基于RB-tre ...

  7. UVALive 6525 Attacking rooks 二分匹配 经典题

    题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=4536">点击打开链接 题意: ...

  8. 【Android】Activity的菜单机制和方法解析

    Activity有一套机制来实现对菜单的管理,方法如下: 1. 初始化菜单 public boolean onCreateOptionsMenu(Menu menu) 此方法用于初始化菜单,其中men ...

  9. Javascript和jQuery WordPress 图片轮播插件, 内容滚动插件,前后切换幻灯片形式显示

    用于在有限的网页空间内展示一组产品图片或者照片,同时还有非常吸引人的动画效果.本文向大家推荐12款实用的 jQuery 图片轮播效果插件,帮助你在你的项目中加入一些效果精美的图片轮播效果,希望这些插件 ...

  10. python课程第一天作业1-模拟登录

    第一周作业: 作业1:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 流程图: 代码:后来修改过一次: #!/usr/bin/env python # -*-conding:ut ...