搜索引擎研究---网络蜘蛛程序算法相关资料 Part V (共5部分)

来源:互联网 发布:流星网络电视怎么注册 编辑:程序博客网 时间:2024/06/18 11:28

搜索引擎研究---网络蜘蛛程序算法相关资料


2、处理和补全URL

当遇到相关页面的链接,你必须在它们基础URL上创建完整的链接。基础URL可能通过BASE标签在页面中明确的定义,或者暗含在当前页面的链接中。Java的URL对象为你解决这个问题提供了构造器,提供了根据它的链接结构创建相似的。
URL(URL context, String spec)接受spec参数的链接和context参数的基础链接。如果spec是一个相关链接,构建器将使用context来创建一个完整引用的URL 对象。URL它推荐URL遵循严格的(Unix)格式。使用反斜线,在Microsoft Windows中,而不是斜线,将是错误的引用。如果spec或者context指向一个目录(包含index.html或default.html), 而不是一个HTML文件,它必须有一个结束斜线。fixHref()方法检查这些引用并且修正它们:


public static String fixHref(String href)
{

String newhref = href.replace('//', '/'); // Fix sloppy Web references

int lastdot = newhref.lastIndexOf('.');

int lastslash = newhref.lastIndexOf('/');
if(lastslash > lastdot)
{
if(newhref.charAt(newhref.length()-1) != '/')
newhref = newhref+"/"; // Add missing /

}
return newhref;

}


3、 控制递归

searchWeb ()开始是为了搜索用户指定的起始Web地址而被调用的。它接着在遇到HTML链接时调用自身。这形成了深度优先搜索的基础,也 带来了两种问题。首先非常危险的内存/堆栈溢出问题将因为太多的递归调用而产生。如果出现环形的引用,这个问题就将发生,也就是说,一个页面链接另外一个 链接回来的连接,这是WWW中常见的事情。为了预防这种现象,searchWeb()检查搜索树(通过urlHasBeenVisited()方法)来确 定是否引用的页面已经存在。如果已经存在,这个链接将被忽略。如果你选择实现一个没有搜索树的蜘蛛,你仍然必须维护一个以访问站点的列表(在Vector 或数组中)以便你可以判断是否你正在重复访问站点。

递归的第二 个问题来自深度优先的搜索和WWW的结构。根据选择的入口,深度优先的搜索在初始页面的初始链接在完成处理以前造成大量的递归调用。这就 造成了两种不需要的结果:首先内存/堆栈溢出可能发生,第二被搜索过的页面可能很久才被从初始入口众多的结果中删除。为了控制这些,我为蜘蛛添加了最大搜 索深度设置。用户可以选择可以达到的深度等级(链接到链接到链接),当遇到每个链接时,当前深度通过调用depthLimitExceeded()方法进 行检查。如果达到限制,链接就被忽略。测试仅仅检查JTree中节点的级别。

示例程序也增加了站点限制,用户来指定,可以在特定数目的URL被检查以后停止搜索,这样确保程序可以最后停止!站点限制通过一个简单的数字计数器sitesSearched来控制,这个数字每次调用searchWeb()后都被更新和检查。

4、UrlTreeNode和UrlNodeRenderer

UrlTreeNode 和UrlNodeRenderer是用来在SpiderControl用户界面中创建JTree中个性化的树节点的类。 UrlTreeNode包含每个搜索过的站点钟的URL信息和统计数据。UrlTreeNode以作为用户对象属性的标准 DefaultMutableTreeNode对象形式存储在JTree中。数据包括节点中跟踪关键字出现的能力,节点的URL,节点的基础URL,链接 的数量,图片的数量和字符的个数,以及节点是否符合搜索规则。

UrlTreeNodeRenderer 是DefaultTreeCellRenderer界面的实现。UrlTreeNodeRenderer使 节点包含匹配关键字显示为蓝色。UrlTreeNodeRenderer也为JtreeNodes加入了个性化的图标。个性化的显示通过覆盖 getTreeCellRendererComponent()方法(如下)实现。这个方法在树中创建了一个Component对象。大部分的 Component属性通过子类来进行设置,UrlTreeNodeRenderer改变了文字的颜色(前景色)和图标:


public Component getTreeCellRendererComponent(
JTree tree,
Object value,
boolean sel,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {

super.getTreeCellRendererComponent(

tree, value, sel,
expanded, leaf, row,
hasFocus);
UrlTreeNode node = (UrlTreeNode)(((DefaultMutableTreeNode)value).getUserObject());
if (node.isMatch()) // Set color
setForeground(Color.blue);
else 
setForeground(Color.black);

if(icon != null) // Set a custom icon
{
setOpenIcon(icon);
setClosedIcon(icon);
setLeafIcon(icon);
}
return this;
}

5、 总结

这篇文章向 你展示了如何创建网络蜘蛛和控制它的用户界面。用户界面使用JTree来跟踪蜘蛛的进展和记录访问过的站点。当然,你也可以使用 Vector来记录访问过的站点和使用一个简单的计数器来显示进展。其他增强可以包含通过数据库记录关键字和站点的接口,增加通过多个入口搜索的能力,用 大量或者很少的文字内容来显现站点,以及为搜索引擎提供同义搜索的能力。

这篇文章中 展示的Spider类使用递归调用搜索程序,当然,一个新蜘蛛的独立线程可以在遇到每个链接时开始。这样的好处是允许链接远程URL并发 执行,提高速度。然而记住那些叫做DefaultMutableTreeNode的JTree对象,不是线程安全的,所以程序员必须自己实现同步。

0 0