不知不觉,2011已经过去了,这一年中的大多时间,都花在了舆情监控系统的探索和研发上。尤其是作为舆情监控系统的基础子系统——网络爬虫系统,更是消耗了不少的时间和精力。下面简单分享一下在网络爬虫系统设计开发中的一些经验和不足。
首次接触爬虫,是在前年的时候,一次偶然的机会,从图书馆带回一本书中,夹带了一个网络爬虫的demo源码,当时只觉得非常敬仰那些能够写出爬虫程 序的人,认为倘若有一天自己也能写一个网络爬虫出来,该是一件多么让人兴奋的事。后来工作之后,参与的第一个项目,就是网络舆情监控系统的开发,不过当时 因为只是应届毕业生,且公司的这套产品已趋向成熟,正在推广期间,所以工作内容主要是该系统下网络爬虫子系统的配置和维护,以及爬虫日志的分析。也正是从 这里开始,真正踏上了网络爬虫的探索之路。
期间,我的毕业设计作品就是一个小型的搜索引擎系统,做这个东西的目的也很明确,就是为了探索网络爬虫系统在实际应用中的一些核心技术,并积累一些 经验。后来来了上海,没想到公司又是搞搜索、搞网络舆情的,所以又继续沿着之前的路走:设计开发爬虫,数据分析,和海量数据的全文检索。
这样的日子,不知不觉已经有一年了,在这一年里,采用不同的技术、不同的设计理念和不同的目的,主要做了三个版本的爬虫系统,最满意的要数现在这个 了。个人认为最主要的原因还是因为有了之前的经验积累和沉淀,使得在爬虫设计之初就注意到了并避开了之前爬虫遇到的各种各样的问题。现在的爬虫系统,主要 是作为一个定向数据采集和网页文本挖掘软件为网络舆情监控系统服务的,除了常规爬虫的网页采集、链接跟踪等功能外,还带有网页主题识别和价值文本抽取等稍 微有点“特色”的功能。在笔者看来,这样的网络爬虫稍显“另类”,因为它与常规的网络爬虫相比,人工依赖更多,但是数据抽取更精准,更高效。不同于公司版 本的网络爬虫是以命令行方式控制,笔者个人探索研究之用的UI版,整合了一个简单的界面,以使用户可以更方便、更直观的控制和配置爬虫。界面在设计之初, 参考了国内某著名信息采集系统的UI,所以看起来爬虫更像是一个网页数据采集系统。但事实上,舆情监控使用的爬虫跟普通的网页信息采集系统,并没有很大的 区别。以下是该系统的部分截图:
该系统目前采用的技术架构是:Quartz + HtmlUnit + HttpClient + DBCP,采用XPath来精确抽取网页文本,最低内存消耗5M,最长运行时间15天,最快抓取速度10208网页/小时,最高宽带占用38M/s
测试环境为:Windows Server2003 SP3 32位Hotspot 1536M内存 100M光纤 MySql5.1
其实对于网络爬虫工作模式,以及网络爬虫的模块设计,应该说很多人即便是没有做过爬虫的人,也能说出来个大概。事实上,虽然网络爬虫系统是技术密集型的软件系统,但是如果一个基础扎实的程序员要做一个像模像样的“简化版”爬虫,也不是什么十分困难的事情。
为什么这么说呢?笔者认为,爬虫的核心,无非就是网页获取、链接抽取、文本抽取,稍微高级一点即是权重分析、网页去重、更新策略,再高级就是人工智 能和分布式集群了。抛开人工智能和分布式,要做一个单机版的爬虫,还是很容易的:java世界中,网页获取技术可谓多如繁星,如HttpClient等, 链接抽取自然也不在话下,对于单机版的爬虫,权重分析、网页去重和更新策略可以暂时不去做,那么就剩下一个文本抽取了,过滤HTML标签就是最简单的文本 抽取(当然实际上很少有这么简单处理的),而这对HtmlParser来讲,简直是小菜一碟。
在笔者看来,一套完善的网络爬虫系统,应该具备以下特点:
1、良好的框架结构
2、合适的网页获取技术
3、高度优化的代码
4、易于配置和管理
第一点:因为爬虫系统一旦运行起来,可能好几周甚至更长时间都不会停下来,良好的框架结构可以保证爬虫在这个漫长的作战过程中尽量少的犯错误,和较低资源占用;同时,良好的框架结构也为扩展和增强爬虫的功能奠定良好的基础;
第二点:在 一年多的网络爬虫开发过程中,笔者接触了众多的网页获取技术,如Watij、JRex、JSoup再到后来的HtppClient和目前的 HtmlUnit,总的来讲,各有优劣,所谓“优劣”,主要的判断标准有同一网页的获取时间、解析时间、是否支持脚本以及对内存和CPU的占用,爬虫要面 对不同的页面类型,何时采用何种页面获取技术,以使爬虫消耗的资源和时间最少,是爬虫设计者不得不考虑的问题;据笔者了解,HttpClient应该是 Java开源爬虫中用的最多的技术,也确实应该是爬虫的首选网页获取技术;
第三点:正如第一点所说,在爬虫长时间运行过程中,如果不对代码做高度优化,那么万一出现内存泄露,对爬虫而言,将会是致命的打击;另外,经过高度优化的代码,可以使CPU占用处于低位,如此,便可保证同样的服务器硬件上,爬虫的效率、速度和稳定性都会有质的提高;
第四点:爬虫系统不是智能的,很多情况不能够自己判断并作出决定,但是为了让爬虫变得聪明,往往需要配置大量的参数来“指导”和管理爬虫工作
正是基于上述四点保证,现有爬虫才能在最低5M内存时稳定运行,才能在两周的连续运行时间内不出现任何内存泄露等问题。不过这不能掩饰爬虫的“内伤”,而这些“内伤”也正是2012所要解决的问题:
1、虽然爬虫能够精确抽取论坛主题和回帖,以及点击量和回复数,但爬虫严重依赖XPath,不能够自主识别链接重要程度,不能够自主识别网页价值数据;
2、爬虫采用插件模式,每个站点都有一个插件,以此来保证抽取数据的准确性,但是缺乏大规模全网爬取的能力;
3、不支持robots协议,像个“流氓”;
4、不支持集群;
5、采用关系型数据库,而没有使用NOSQL数据库;
这些内伤有的影响了爬虫的性能,有的限制了爬虫的成长,有的则使爬虫看起来像个“流氓”,所以在未来的2012上半年,需要解决这些问题。目前的打算如下:
爬虫改定向爬取为定向爬取与全网爬取共存后,爬虫需要自动跟踪链接、抽取文本,所以要用到主题识别技术、网页切片技术和网页权重分析技术;
系统应该提供一个默认的插件,来兼容绝大部分网页,但要保留现有的插件模式;
为爬虫加入robots协议的支持,使其变成“正规军”;
好的爬虫当然是要支持集群的,目前考虑采用apache的hadoop来做分布式的爬虫;
URL数据存储在关系型数据库中对爬虫性能的影响十分明显,稍后要用MongoDB来取代关系型数据库来管理URL数据
网上已有很多开源爬虫,笔者也研究过好几款,只能说良莠不齐吧,且笔者觉得大多爬虫采用的技术都比较老,而且普遍存在一个问题,就是对网页权重分析 和URL链接管理做得很不到位,或者干脆就没有做,不明白为什么。不过作为开源软件的一名贡献者,其作者的精神和勇气还是值得钦佩的,在此向所有开源事业 的先驱们致敬!
原创文章,转载请注明出处:http://yshjava.iteye.com/blog/1338896
posted on 2012-01-10 22:44
todayx.org 阅读(7212)
评论(6) 编辑 收藏