小曹谈技术之网络爬虫

来源:互联网 发布:java错误代码1618 编辑:程序博客网 时间:2024/05/01 19:47

网络爬虫,主要作用是信息采集。自己最初接触信息检索系统就是接触的这一块。当时借助于开源的Nutch,构建了一个自己的垂直搜索引擎(中英文词检索)。Nutch中提供了构建一个自己的垂直搜索的所有必需的所有功能:网页爬取,分布式平台,分布式存储(Hadoop implemention of Mapreduce),网页正文提取(HtmlParser),倒排索引建立(Lucene),检索接口提供。当时在半个月的时间里读了Nutch的源代码,收益匪浅。

 

目前网络爬虫技术已经比较成熟了,更多的研究集中在分布式的网络爬虫以及深层网络的挖掘。一个简单的爬虫,用python或者perl等脚本语言,可能几行代码就可以搞定了。但是要构建一个稳定,能处理各种异常情况,速度快,各种类型的网页都能爬取(静态网页、动态网页、需要认证的网页、网站封了robots协议的网站)的爬虫,就不是那么简单了。

 

首先说说分布式网络爬虫,自己这个博客中之前访问量最大的是一篇“分布式网络爬虫陋见”,这是我没想到的。自己不是研究分布式系统的,唯一接触过的分布式平台是Nutch中的Hadoop平台,其是Mapreduce平台的Java实现,主要思想是将数据分为key,value两个部分,不同的机器协作来共同更新这些(key,value)对的值。之所以使用分布式网络爬虫,原因是很明显的:当前网络上信息增长的速度已经远非一个单机的网络爬虫所能够处理的。单机的网络爬虫提高自己爬网页的速度无非是频繁抓取、多线程、多进程等。频繁抓取容易被网站封掉,不宜恢复。不管是多线程、多进程,单机爬虫所能使用的系统资源总是有限的:I/O读取速度上限,网络速度上限,打开文件个数上限,单机存储空间上限等等。

分布式网络爬虫需要解决的问题包括任务的分配:如何将不同的url分配给不同的机器去爬取,同时保证不重复的爬取,在网络资源紧缺的情况下,这点尤为重要。任务的分配可以包括两种策略:一种是使用一台机器作为中央控制器来协调所有子节点的爬取任务分配和调度。所有的url爬取需求汇总到中央控制器上,然后由中央控制器来指派子节点分别抓取。这样的好处是负载更均衡一些,由于任务都是汇总在中央控制器的,所以在子节点上平均分配任务是可行的。另外,对于子节点的退出(由于各种异常情况,例如网络通讯故障、磁盘满)可以及时的发现并做出相应的对策:例如,下次分配任务时,就不向该机器分配了,原来是任务平均分配给5个子节点,一个节点坏掉之后,余下来的任务平均分配给剩下来的4个节点。但是这个方法也有缺点:中央控制器坏掉之后整个系统可能会陷入瘫痪。可以采取备份替代的方法,当中央控制器坏掉时,启用备份控制节点。另一种方法是不使用中央控制器,而是让各个节点按照一点策略自己管理自己的爬取任务。一个可能的策略是,假设有N个节点,对于所有url的字母取和之后对N求余,第i台机器处理余数为i-1url。这种方法的缺点是各个子节点的任务分配难以均衡,而且无法避免一些重复的工作。

 

再说说深层网络挖掘,在网上,除了静态的内容,还有很多内容是动态生成的,存在于数据库的,而在普通的网页上可能无法找到这样动态网页的入口,而只能通过输入查询才能访问。关于深层网络挖掘,Google有一篇论文,主要是通过生成特征模板和启发式地列举可能的字段值和字段组合,达到高效挖掘深层网络的目的。

 

自己曾用过的开源的爬虫:

NutchJava语言编写,大部分功能是通过整合其他插件实现的,架构灵活,方便加入自己的代码。实现了构建一个搜索引擎的所有步骤。

http://lucene.apache.org/nutch

 

LarbinC++语言编写。支持网站的整个镜像下载,按原服务器的目录保存为本地目录。

http://larbin.sourceforge.net/index-eng.html

 

       关于深层网络挖掘:

       GoogleVLDB 2008上发表的论文

       http://www.cs.cornell.edu/~lucja/Publications/I03.pdf

      

(To be continue)

 

 

本人原创,转载请注明!谢谢。

 

原创粉丝点击