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

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

摘要
你是否想过创建自己的符合特定标准的网站数据库呢?网络蜘蛛,有时也称为网络爬虫,是一些根据网络链接从一个网站到另外一个网站,检查内容和记录位置的程 序。商业搜索站点使用网络蜘蛛丰富它们的数据库,研究人员可以使用蜘蛛获得相关的信息。创建自己的蜘蛛搜索的内容、主机和网页特征,比如文字密度和内置的 多媒体内容。这篇文章将告诉你如何使用Java的HTML和网络类来创建你自己的功能强大的网络蜘蛛。

这篇文章将介绍如何在标准Java网络对象的基础上创建一个智能的网络蜘蛛。蜘蛛的核心是一个基于关键字/短语标准和网页特征进行深入网络搜索的递 归程序。搜索过程在图形上类似于JTree结构。我主要介绍的问题,例如处理相关的URL,防止循环引用和监视内存/堆栈使用。另外,我将介绍再访问和分 解远程网页中如何正确是用Java网络对象。

● 蜘蛛示例程序

示例程序包括用户界面类SpiderControl、网络搜索类Spider,两个用作创建JTree显示结果的类UrlTreeNode和 UrlNodeRenderer,和两个帮助验证用户界面中数字输入的类IntegerVerifier和VerifierListener。文章末尾的 资源中有完整代码和文档的琏接。

SpiderControl界面由三个属性页组成,一个用来设置搜索参数,另一个显示结果搜索树(JTree),第三个显示错误和状态信息,如图1

 

图1 搜索参数属性页


搜索参数包括访问网站的最大数量,搜索的最大深度(链接到链接到链接),关键字/短语列表,搜索的顶级主机,起始网站或者门户。一旦用户输入了搜索参数,并按下开始按钮,网络搜索将开始,第二个属性页将显示搜索的进度。


图2 搜索树

一个Spider类的实例以独立进程的方式执行网络搜索。独立进程的使用是为了SpiderControl模块可以不断更新搜索树显示和处理停止搜 索按钮。当Spider运行时,它不断在第二个属性页中为JTree增加节点(UrlTreeNode)。包含关键字和短语的搜索树节点以蓝色显示 (UrlNodeRenderer)。

当搜索完成以后,用户可以查看站点的统计,还可以用外部浏览器(默认是位于Program Files目录的Internet Explorer)查看站点。统计包括关键字出现次数,总字符数,总图片数和总链接数。

● Spider类

Spider类负责搜索给出起点(入口)的网络,一系列的关键字和主机,和搜索深度和大小的限制。Spider继承了Thread,所以可以以独立线程运行。这允许SpiderControl模块不断更新搜索树显示和处理停止搜索按钮。

构造方法接受包含对一个空的JTree和一个空的JtextArea引用的搜索参数。JTree被用作创建一个搜索过程中的分类站点记录。这样为用户提供了可见的反馈,帮助跟踪Spdier循环搜索的位置。JtextArea显示错误和过程信息。

构造器将参数存放在类变量中,使用UrlNodeRenderer类初始化显示节点的JTree。直到SpiderControl调用run()方法搜索才开始。

run()方法以独立的线程开始执行。它首先判断入口站点是否是一个Web引用(以http,ftp或者www开始)或是一个本地文件引用。它接着确认入口站点是否具有正确的符号,重置运行统计,接着调用searchWeb()开始搜索:

public void run()
{
DefaultTreeModel treeModel = (DefaultTreeModel)searchTree.getModel(); // get our model
DefaultMutableTreeNode root = (DefaultMutableTreeNode)treeModel.getRoot();
String urllc = startSite.toLowerCase();
if(!urllc.startsWith("http://") && !urllc.startsWith("ftp://") &&
!urllc.startsWith("www."))

{
startSite = "file:///"+startSite; // Note you must have 3 slashes !

}
else // Http missing ?
if(urllc.startsWith("www."))
{
startSite = "http://"+startSite; // Tack on http:// 
}

startSite = startSite.replace('//', '/'); // Fix bad slashes
sitesFound = 0;
sitesSearched = 0;
updateStats();
searchWeb(root,startSite); // Search the Web
messageArea.append("Done!/n/n");
}

searchWeb()是一个接受搜索树父节点和搜索Web地址参数的递归方法。searchWeb()首先检查给出的站点是否已被访问和未被执行 的搜索深度和站点。SearchWeb()接着允许SpiderControl运行(更新界面和检查停止搜索按钮是否按下)。如果所有正常, searchWeb()继续,否则返回。

在searchWeb()开始读和解析站点以前,它首先检验基于站点创建的URL对象是否具有正确的类型和主机。URL协议被检查来确认它是一个 HTML地址或者一个文件地址(不必搜索mailt和其他协议)。接着检查文件扩展名(如果当前有)来确认它是一个HTML文件(不必解析pdf或者 gif文件)。一旦这些工作完成,通过isDomainOk()方法检查根据用户指定的列表检查主机:

...URL url = new URL(urlstr); // Create the URL object from a string.
String protocol = url.getProtocol(); // Ask the URL for its protocol
if(!protocol.equalsIgnoreCase("http") && !protocol.equalsIgnoreCase("file"))
{
messageArea.append(" Skipping : "+urlstr+" not a http site/n/n");
return;
}

String path = url.getPath(); // Ask the URL for its path
int lastdot = path.lastIndexOf("."); // Check for file extension
if(lastdot > 0)
{
String extension = path.substring(lastdot); // Just the file extension
if(!extension.equalsIgnoreCase(".html") && !extension.equalsIgnoreCase(".htm"))
return; // Skip everything but html files
}

if(!isDomainOk(url))

{

messageArea.append(" Skipping : "+urlstr+" not in domain list/n/n");
return;
}

这里,searchWeb()公平的确定它是否有值得搜索的URL,接着它为搜索树创建一个新节点,添加到树中,打开一个输入流解析文件。下面的章节涉及很多关于解析HTML文件,处理相关URL和控制递归的细节。

你可能感兴趣的:(Other)