摘 要:
关键词:
网络蜘蛛(Web Spider)是一个形象的名字,它把因特网比喻成一个蜘蛛网,那么Spider就是在网上觅食的蜘蛛。网络蜘蛛通过WEB文档中的链接地址来寻找WEB文档,从网站某一个页面开始读取文档的内容,找到在WEB文档中的下一级链接地址,然后通过这些链接地址寻找更下一层的WEB文档,这样循环直到将此网站的WEB文档资源都搜寻完为止。
1 网络蜘蛛的抓取策略
在抓取WEB文档的时候,网络蜘蛛一般有两种策略:广度优先和深度优先。在实际应用中通常并非要抓取全部的WEB文档,对一些不太重要的网站,可以设置访问的层数,对于超过一定层数的WEB文档不再抓取。
2 WEB文档的种类及在信息提取中的价值
基于内容文本的WEB数据挖掘的处理对象是文本文件。对于WEB文档内容的提取,一直是网络蜘蛛中重要的技术。整个系统一般采用基于插件的可扩展模式,通过一个插件程序,对各格式的WEB文档采用相应的插件处理。这种模式的优点在于扩充性好,以后每新增一种新的类型,就可以把其处理方式做成一个插件补充到插件管理服务程序之中。
3 HTML结构化解析
在网络蜘蛛的实现时,我们采用广度优先链接跟踪法解析HTML。要提取WEB文档中的链接和文本,首要对HTML进行解析,将HTML字符流变为由HTML标签系列组成的结构化文档。Sun公司开发的HTML解析器能够处理绝大部分HTML解析任务。下面是Sun的HTML解析器的主要功能部件。
(1) HTMLEditorKit.Parser类
它是最重要的一个HTML解析类,是一个内部类,声明如下:
javax.swing.html.HTMLEditorKit.Parser:
public abstract static class HTMLEditorKit.Parser extends Object
由于它是一个抽象类,因此真正的解析工作是由它具体的子类的实例来完成,这个子类是javax.swing.text.html.parser.ParserDelegator:
public class ParserDelegator extends HTMLEditorKit.Parser
当解析一个HTML文件时,需要实现一个HTMLEditorKit.ParserCallback的子类,由它来按照要求对文本和标签做出处理。然后将它的实例传给HTMLEditorKit.Parser的parse()方法。parse()是HTMLEditorKit.Parser类的唯一public方法。所有的工作是由HTMLEdtitorKit.ParserCallback子类的回调方法来完成。在进行这项工作之前,必须获得一个HTMLEditorKit.Parser类的实例,但是它是一个抽象类,其子类javax.swing.text.html.parser.ParserDelegator是一个具体类,在能够取用它之前,必须给它配置一个DTD,使用protected static方法。因此创建一个ParserDelegator,需要DTD的一个实例。DTD类有一个protected型的构造器和许多protected方法,这里直接使用I-ITMLEditorKit.Parser,getParser()方法。它是一个protected方法,只需要创建HTMLEditorKit的子类,并用一个public型的getParser()来覆写它。
现在就可以用它来解析中文WEB文档。这是通过HTMLEditorKit.Parser类的parse()方法来完成的。
(2)HTMLEditorKit.ParserCallback类
ParserCallback是一个public型的内部类,也就是javax.swing.text.html.HTMLEditorKit的内部类。其声明如下:
public static calss HTMLEditorKit.PraserCallback extends Objects DTD。它有一个简单的无参数构造器:public HTMLEditorKit.ParserCallback()
但是,要真正执行解析动作,需要实现其子类,并重载6个空的回调方法,执行具体的任务。
解析器并不是多线程安全的,通常在一个单独的线程中解析。因此,当parse()方法返回时,并不意味着文档被解析了。若使用同一个HTMLEditorKit.ParserCallback对象来完成两个独立的解析过程,必须用线程同步机制,保证所有的回调方法都是线程安全的。
(3) HTML.Tag类
Tag是一个javax.swing.text.html.HTML类的一个public型的内部类。public static class HTML.Tag extends Object它含有四个方法:breaksFlow()方法当标签应该产生一个单行分隔时返回true。isBlock()方法当标签应该产生一个双行分隔时返回true。isPreformatted()方法当标签中的空白应该被保留时返回true。有了HTML.Tag类,可以根据不同的标签类别,执行不同的操作。
(4)属性
处理HTML文件时,经常需要查看标签和属性。HandleStartTag()和handleSimpleTag()回调方法的第二个参数是javax.swing.text.MutableAttributeSet类,这个对象允许查看某个标签附属了哪些属性。MutableAttributeSet是javax.swing.text.AttributeSet接口的子接口。
AttributeSet和MutableAttributeSet都代表着HTML标签的属性集。不同的是后者接口增加了添加删除属性方法和属性集的视图。属性本身代表着java.lang.Object对,一个代表属性名,另一个代表属性值。
与HTML.Tag一样,属性值是字符串,属性名是HTML.Attribute对象。在提取链接地址时,就需要调用这些方法。在WEB文档所包含的链接信息通常都含有大量的相对URL地址,在进一步访问这些链接地址时则需要绝对地址,因此需要进行转换。
小结
本文介绍了实现网络蜘蛛所涉及到的详细算法,并以SUN公司的HTML解析器为例说明了HTML代码解析的整个过程。可以看到整个HTML代码的解析过程是庞大而复杂的。