本篇文章旨在对爬虫这一概念做一个简单的介绍,希望能让读者朋友们对爬虫有初步的了解与认识
爬虫是什么
现在人们说的 Python 写爬虫啊之类的,爬虫当然不是普通的那个爬虫,而是指按照一定的规则获取网络上信息的程序,因为它在获取一个网页信息的同时会从这个网页上获得URL然后再对这个URL获取信息,所以称为爬虫。
爬虫的分类
爬虫之间也有不同,不过大致可以分为以下几类
通用爬虫
这类爬虫的目标从几个URL扩展到整个网络,一般用于为搜索引擎和Web服务提供商采集数据。这类爬虫不太看重页面间的联系,而看重获得页面的数量,因此对存储空间有一定要求。
聚焦爬虫
这类爬虫主要根据选定好的主题来搜索页面,主要来满足对特定领域信息的需求,保存的页面数量不多,可以节省网络资源与存储空间。
增量爬虫
这类爬虫主要是对新产生或是发生变化的网页来搜寻的爬虫,虽然这样也可以避免重复爬行造成空间与网络资源浪费,但是所需要的算法比其他爬虫更复杂。
Deep Web 爬虫
这些爬虫主要对不能够通过链接进入的页面进行搜索,比如说注册后可见的页面等等。这类爬虫通常需要一个附带具有填写表单的能力之类的辅助模块来帮助进入之后的页面。
爬虫的各种搜索策略
IP地址搜索
IP 地址搜索策略是先给爬虫一个起始的 IP 地址,然后根据 IP 地址以递增的方式搜索本 IP 地址段后的每一个地址中的文档,它完全不考虑各文档中指向其它 Web 站点的超级链接地址。这种搜索策略的优点是搜索比较全面,因此能够发现那些没被其它文档引用的新文档的信息源;但是缺点是不适合大规模搜索。
深度优先搜索
深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的 HTML 文件)。例如,在一个 HTML 文件中,当一个超链被选择后,被链接的 HTML 文件将执行深度优先搜索,也就是说在搜索其余的超链结果之前必须先完整地搜索单独的一条链。深度优先搜索沿着 HTML 文件上的超链走到不能再深入为止,然后返回到某一个 HTML 文件,再继续选择该 HTML 文件中的其他超链。当不再有其他超链可选择时,说明搜索已经结束。
宽度优先搜索
宽度优先搜索的过程是先搜索完一个 Web 页面中所有的超级链接,然后再继续搜索下一层,直到底层为止。例如,一个 HTML 文件中有三个超链,选择其中之一并处理相应的HTML文件,然后不再选择第二个 HTML 文件中的任何超链,而是返回并选择第二个超链,处理相应的 HTML 文件,再返回,选择第三个超链并处理相应的 HTML 文件。当一层上的所有超链都已被选择过,就可以开始在刚才处理过的 HIML 文件中搜索其余的超链。
宽度优先搜索的优点:一个是保证了对浅层的优先处理,当遇到一个无穷尽的深层分支时,不会导致陷进深层文档中出现出不来的情况发生;另一个是它能在两个 HTML 文件之间找到最短路径。
宽度优先搜索策略通常是实现爬虫的最佳策略,因为它容易实现,而且具备大多数期望的功能。但是如果要遍历一个指定的站点或者深层嵌套的 HTML 文件集,用宽度优先搜索策略则需要花费比较长的时间才能到达深层的 HTML 文件。
爬虫面临的问题
截止到 2007 年底,Internet 上网页数量超出 160 亿个,研究表明接近 30%的页面是重复的;动态页面的存在:客户端、服务器端脚本语言的应用使得指向相同 Web 信息的 URL 数量呈指数级增长。 上述特征使得网络爬虫面临一定的困难,主要体现在 Web 信息的巨大容量使得爬虫在给定时间内只能下载少量网页。 Lawrence 和 Giles 的研究表明没有哪个搜索引擎能够索引超出 16%的 Internet 上 Web 页面,即使能够提取全部页面,也没有足够的空间来存储。
为提高爬行效率,爬虫需要在单位时间内尽可能多的获取高质量页面,这也是是它面临的难题之一。 当前有五种表示页面质量高低的方式:Similarity(页面与爬行主题之间的相似度)、Backlink(页面在 Web 图中的入度大小)、PageRank(指向它的所有页面平均权值之和)、Forwardlink(页面在 Web 图中的出度大小)、Location(页面的信息位置)。
Parallel(并行性问题):为了提高爬行速度,网络通常会采取并行爬行的工作方式,随之引入了新的问题:
重复性:并行运行的爬虫或爬行线程同时运行时增加了重复页面
质量问题:并行运行时,每个爬虫或爬行线程只能获取部分页面,导致页面质量下降
通信带宽代价:并行运行时,各个爬虫或爬行线程之间不可避免要进行一些通信
并行运行时,网络爬虫通常采用三种方式:独立方式(各个爬虫独立爬行页面,互不通信)、动态分配方式(由一个中央协调器动态协调分配 URL 给各个爬虫)、静态分配方式(URL 事先划分给各个爬虫)。