用户登陆|用户注册|建站服务|广告合作
您现在的位置: 首页 >> 建站实务 >> 网络编程 >> JSP篇 >> 正文
站内搜索:
使用JAVA语言来提取网站内部URL的算法
[作者:dxaw|来源:赛迪网技术社区|时间:2007-06-15| 收藏 投稿 ]【

一、引言

20世纪末是万维网开始膨胀的时期,它的发展速度是十分惊人的。据统计,万维网已经连通了世界上几乎所有的国家,并且万维网正在急速发展。目前,万维网已经成为世界上最大的信息源,成为全球范围内科研、教育、商业和社会、新闻、学校和专业机构介绍、图书及娱乐等信息的集大成者。近年来对万维网的研究的两大热点是网络搜索引擎的研究和网络拓扑结构的研究。对于网络信息挖掘的首先要面对的问题就是如何提取出网站内部的URL,只有获得了网站的所有URL才可以网站的全部内容。基于此本文给出了一种实用有效的提取网站内部URL的方法。

二、JAVA基础

Java语言方便灵活,是现在开发网络程序的主要语言。本文采用了Java语言来开发。在Java的提供的java.util.*和 java.net.* 工具包中提供了大量简单易用的API。此外,在网络上还有大量的开放源码。

HTMLParser v 1.3是一套优秀的开放源代码的提供HTML文件分析的工具包。它可以提供快速的、实事的文本分析的功能。HTMLParser最大的成功之处是它设计简单、速度快、应用方便。可以从http://htmlparser.sourceforge.net下载此工具包和了解其用法。

对于HTMLParser 工具包我们需要修改其中的htmlparser.java文件使其适用中文的html文件分析。htmlparser.java文件中具体实现细节就不再介绍。这里主要是把protected static final String DEFAULT_CHARSET = "ISO-8859-1";修改成protected static final String DEFAULT_CHARSET = "gb2312";因为采用默认的字符集"ISO-8859-1"对含有中文的html文件进行分析的时候就会出现乱码。必须进行new String(str.getBytes("ISO-8859-1"),"GB2312")的转换工作。

对于修改好的htmlparser工具包,需要重新压缩成.jar文件,放到jdk的工作环境中。

三、具体设计

首先新建一个静态全局Vector变量L,在算法的递归调用中往L中不断添加新发现的URL。公式(1)是一个遍历网站内部URL的数学表达式。

S=T(ui) (1)

s.t. ui O(ui)

ui Ui-1 i=1,2…m

其中T(u)是遍历一个站点的所有URL的函数,为了保证该遍历方法收敛这里我给出了两个限制条件,ui为一网站中的URL,O(ui)是判断ui是否为该网站内部的URL。

算法是:

1) 定义全局静态变量public static Vector svecLink;

2) 开始搜索网站W的主URL;

3) 解析出第一页面的所有URL;

4) 剔除无效的URL和非本站点的URL同时记录所获的URL的个数为a;

5) 把URL添加到svecLink中;

6) 从svecLink中取出最后a个URL分别递归调用此函数

为了能保证遍历的收敛,程序必须对URL进行严格限制。下面是一些具体实现:

1) 定义的全局变量

public final int DEEP=3; //遍历的深度

public static Vector svecLink, svecOutlink; //存放内部URL和外部URL

public static String hostName; //主机名称

public static boolean bl; //判断标志

private String location;

private Parser parser; //对超文本进行分析

2) 获取主机名称GetHostName()函数

通过该函数来判断所得URL是否是本网站的URL,如果不是就不需要添加svecLink中如果是并且以前没有提取过就添加到svecLink中。

public  String  GetHostName(String  hostname)
{
URL  aurl;
String  ss="  ";
try
{
aurl=new  URL(hostname);
ss=aurl.getHost();
}
catch(MalformedURLException  e)
{
e.printStackTrace();
}
return  ss;
}

3) 递归遍历方法

由于网站中URL之间的连接构成了图,所以对图的遍历这里采用深度优先的方法。

public  void  extractLinks(String  loc)  throws  ParserException  {
System.out.println("Parsing  "+loc+"  for  links...");

Vector  vecTemp=new  Vector();
try  {
this.parser  =  new  Parser(loc);  //原理见HTMLParser
parser.registerScanners();  
bl=true;
}
catch  (ParserException  e)  {
bl=false;  
e.printStackTrace();
}

String  ss,str1;
URL  wwwurl;
boolean  byes;

int  a=0;
b++;
Node  []  links  =  parser.extractAllNodesThatAre(LinkTag.class); 
//获取一个页面中//所有的URL
for  (int  i  =  0;i  <  links.length;i++)  {
if(bl)
{
byes=true;
System.out.println("Total  url  is  "+links.length+"This  page  has  url  "+i);
LinkTag  linkTag  =  (LinkTag)links[i];
str1=linkTag.getLink();  
if(str1.equals(""))  continue;
if(str1.charAt(str1.length()-1)=="/"
||str1.charAt(str1.length()-1)=="\")  
str1=str1.substring(0,str1.length()-1);  
if(!svecLink.contains(str1))  
{  
try
{
wwwurl=new  URL(str1);
wwwurl.getContent();
}
catch(MalformedURLException  e)
{
byes=false;
}
catch(IOException  e)
{
byes=false;
}
if(GetHostName(str1).equals(hostName)  &&  byes)
{
a++;
tID++;
svecLink.add(str1);
vecTemp.add(str1);
System.out.println("the  url  is  "+str1);
}
else
{

svecOutlink.add(str1);
}
}  
}  
}

String  strNew;
if(a>0&&b<=DEEP)
{  

for(int  i=0;i<vecTemp.size();i++)
{
strNew=(String)vecTemp.get(i);
System.out.println("this  is  "+strNew);
extractLinks(strNew);  //递归调用
}
}

}

四、结论

本文介绍给出了一种提取网站内部URL的实现方法,本文的方法对网络机器人的研究和WEB文本挖掘提供了方便的工具。在程序的实现中还有许多实际的困难,需要在实验中不断完善和改进。


Tags:
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
快速注册通道
赛酷网·中国西部第一建站门户
关于我们 | 投稿指南 | 广告服务 | 建站服务 | 联系我们 | 网站地图 | 友情连接 | 诚征英才
地址:中国·昆明盘龙区丽水天锦A栋15楼A06 服务热线:0871-5610002 5732371联系我55693344 联系我80796509
建站交流群:17577271 下载交流群:11885804 22003060 35468519 交流论坛
© CopyRight 2005-2007, Syku.Net, Inc. All Rights Reserved
赛酷网络版权所有 滇ICP备05000398号