web机器人是能够在无需人类干预的情况下自动进行一系列Web事物处理的软件,很多机器人能够从额web站点逛到另一个web站点,获取内容,跟踪超链,并对他们找到的数据进行处理,根据这些机器人自动探查web站点的方式,我们将他们成为“爬虫”。
常见的机器人实例:
股票图形机器人每隔几分钟就会想股票市场的服务器发送http get,用于得到数据来构建股票价格趋势图。
比较购物机器人会从在线商店的目录中手机web页面,构建商品及其价格的数据库
爬虫以及爬行方式:
web爬虫是一种机器人,他们会递归地对各种信息性web站点进行遍历,获取第一个web页面,然后获取那个页面所指向的所有web页面,然后是那些页面指向的所有web页面,依次类推,递归地追踪web链接的机器人会沿着HTML超链接创建的网络“爬行”,所以将其成为爬虫。
因特网搜索引擎使用爬虫在web上游荡,并把他们碰到的文档全部拉回来,然后对这些文档进行处理,形成一个可搜索的数据库,以便用户查找包含了特定单词的文档。下面我们来看看爬虫是怎么样工作的。
从哪里开始:根集
根集是蜘蛛的一个起始点,,爬虫开始访问的url初始集合被成为根集,挑选根集的时候,应该从足够多不同的站点选择URL,这样,爬遍所有链接才能最终达到大部分我们所感星期的web页面。
链接的提取以及相对链接的标准化
爬虫在web上移动时,会不停的对HTML 页面进行解析,他要对所解析的每个页面上的url链接进行分析,并将这些链接添加到需要爬行的页面列表中去,随着爬虫的前进,当其发现需要探查的新连接时,这个列表常常会迅速扩张。爬虫要通过简单的html解析,将这些链接提取出来,并将相对的URL转换成觉对形式。
机器人环路:
环路对于机器人的害处;
1 他们会使爬虫陷入可能将其困住的循环之中,使爬虫将时间都耗费在不停的获取相同的页面上。
2爬虫不断的获取相同的页面时,另一端的web服务器也在遭受着打击。
3 即使循环自身不是什么问题,爬虫也是在获取大量重复的页面,爬虫应用程序会被重复的内容所充斥,这样应用程序就会变得毫无用处。
面包屑留下的痕迹
记录曾经到过那些地方并不是一件容易的事情,如果爬行世界范围的一大块web内容,就要做好访问数十亿url准备,记录下哪些URL已经访问过了是件很具有挑战的事情,机器人至少要用到搜索树和散列表,以快速判定某个URL是否被访问过。大量的url会占用大量的存储空间,这里列出一些大规模web爬虫对其访问过的地址进行管理时使用的一些有用的技术:
1树和散列表:用来记录已访问的url,
2有损的存在位图:为了减少空间,一些大型爬虫会使用有损数据结构,比如存在位数组,用一个散列函数将每个url都转换成一个定长的数字,这个数字在数组中有个相关的“存在位”。
3检查点 一定要将已访问url列表保存到硬盘上,以防止机器人崩溃
4 分类 为每个机器人分配一个特定的url片,尤其负责爬行。
别名与机器人环路:
由于url“别名”的存在,即使使用了正确的数据结构,有时很难分辨出以前是否访问过某个页面,如果两个url 看起来不一样,但实际指向的是同一资源,就成这两个url为“别名”
规范化URL
大多数web机器人都视图通过将url规范化为标准格式来消除上面的那些显而易见的别名,规范化过程如下:
1 如果没有指定的端口,就将主机名中添加80。
2 将所有转义字符%xx都转换成等价字符。
3 删除#标签
文件系统链接环路
文件系统中的符号链接会造成特定的潜在环路,因为他们会在目录层次深度有限的情况下,造成深度无限的假象,符号链接环路通常是由服务器管理者无心的错误造成的。
动态虚拟web空间
恶意的网管可能会有意的创建一些复杂的爬虫循环来陷害那些无辜的,毫无戒备的机器人,
避免循环和重复
没有什么简单明了的方式可以避免所有的环路,实际上,经过良好设计的机器人中要包含一组试探方式,以避免环路的出现。
总的来说,爬虫的自动化程度越高,越可能陷入麻烦之中,可以让机器人有更好表现的一些方式:
1 规范化url 将url转换为标准形式以避免语法上的别名。
2 广度优先遍历
3 节流 限制一段时间内机器人可以从一个web站点获取页面数量
4 限制url的大小 机器人会拒绝爬行超出特定长度的URL。
5 url 站点黑名单
6 模式检测
7 内容指纹 一些更负责的web爬虫会使用指纹这种更直接的方式来检测重复,
8 人工监视