使用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文本挖掘提供了方便的工具。在程序的實現中還有許多實際的困難,須要在實驗中不斷完善和改進。
相關文章
相關標籤/搜索