使用JAVA语言来提取网站内部URL的算法

1、引言
20世纪末是万维网开始膨胀的时期,它的发展速度是十分惊人的。据统计,万维网已经 连通了世界上几乎全部的国家,而且万维网正在急速发展。目前,万维网已经成为世界上最大的信息源,成为全球范围内科研、教育、商业和社会、新闻、学校和专 业机构介绍、图书及娱乐等信息的集大成者。近年来对万维网的研究的两大热点是网络搜索引擎的研究和网络拓扑结构的研究。对于网络信息挖掘的首先要面对的问 题就是如何提取出网站内部的URL,只有得到了网站的全部URL才能够网站的所有内容。基于此本文给出了一种实用有效的提取网站内部URL的方法。
2、JAVA基础
Java语言方便灵活,是如今开发网络程序的主要语言。本文采用了Java语言来开发。在Java的提供的java.util.*和 java.net.* 工具包中提供了大量简单易用的API。此外,在网络上还有大量的开放源码。
HTMLParser v 1.3是一套优秀的开放源代码的提供HTML文件分析的工具包。它能够提供快速的、实事的文本分析的功能。HTMLParser最大的成功之处是它设计简 单、速度快、应用方便。能够从[url]http://htmlparser.sourceforge.net[/url]下载此工具包和了解其用法。
对于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的工做环境中。
3、具体设计
首先新建一个静态全局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);     //递归调用
}
}

}



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