从第三方网站上抓取一张页面,分析其中的内容,然后转换为自己的格式并持久化,这就是网络爬虫的操作步骤。目前,对网页的抓取及解析也在互联网项目中有较为广泛的应用,下面简单谈谈一些网页解析工具的使用方法。
网页的爬取及解析,应该利用一现有的工具或框架去实现,而这些框架的选择,至少要考虑下面的一些因素:
1、应该具有一定的兼容性,比如:原始页面中的一些语法错误、未关闭标签等,应该能够被正确解析;
2、应该可以方便地查找、过滤页面元素;
3、应该要以对找到的元素进行操作,比如:修改,删除等,当然也可以加入新的元素。
我主要说两个常用的网页解析工具,一个是htmlParser,这个框架出来得比较早,并且有比较广泛的应用,官方站点在http://htmlparser.sourceforge.net/,下面是一段示例代码:
Parser parser = new Parser(str_url);
parser.setEncoding("utf-8");
NodeList imageNodeList = contentNodeList.extractAllNodesThatMatch(new TagNameFilter("img"), true);
上面将得到页面中的所有图片链接。其中的extractAllNodes方法有很多种实现,可以按元素类型、包含的属性等等条件进行过滤,我以前的一些项目中就曾使用这种方法来做,也用得十分的恼火,让人头疼的地方主要是:
1、容错性差,目标页面有错误,解析起来就得不到正确的结果,为此,当时都研究过firefox的解析包,但发现十分复杂,放弃了(注:如果每个页面都通过xhtml标准检查,那么用dom4j中的xpath就可以解决网页解析的问题了,呵呵)。
2、要仔细分析目标网页,针对目标网页的页面元素层级关系,编写相应的解析代码,写出的代码非常冗长(主要是元素查询、过滤很麻烦),可维护性不高。一旦目标网站页面格式调整,再次调整代码,修改解析代码非常痛苦。
3、页面的修改、重组都不方便。
用HtmlParser的经历可以说是比较痛苦,但在当时的情况下,HtmlParser是最好的一个java开源网页解析器,也只有将应着用了。同时也期待着新的框架问世。
直到有一天,发现了jsoup,以前困扰过我的问题终于得到了解决,并且解决得很彻底,是到了跟HtmlParser说再见的时候了。jsoup官网地址在http://jsoup.org/,整个jar包135kb,非常小巧,而且不依赖其它包,够强悍。下面贴出一段示例代码(具体使用官网上有Cookbook,另外chinaos版主也写了一篇jsoup的使用文档,自己去google一下吧):
Document doc = Jsoup.connect(str_url).get();
Elements es = doc.select("#results .trans-wrapper h2 span");
System.out.println(es.text());
jsoup具有页面纠错功能,对于一般的标签未封闭,未结束等错误可以智能纠正,这点对网页解析来说意义重大。其次,页面元素查找、定位十分的方便,它完全支持jQuery的元素查找方式,并且几乎所有的api方法,都和jQuery api中的方法一模一样,我们知道,jQuery之所以可以被如此广泛使用,和它简洁强大的页面元素定位及简单的api是分不开的,jsoup的这种做法可以说是非常明智的。
我对jQuery非常的熟悉,jsoup和jQuery又如此的相似,因此jsoup后可以说是拿来即用,感觉十分的亲切、自然。用了jsoup后,你会发现,实现同样功能的代码,jsoup代码量会比Htmlparser少很多很多,并且可读性非常的强,可维护性自然提高。