工作小驛

          Ninja!

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            103 Posts :: 0 Stories :: 36 Comments :: 0 Trackbacks
          一、引言

          20世紀(jì)末是萬(wàn)維網(wǎng)開(kāi)始膨脹的時(shí)期,它的發(fā)展速度是十分驚人的。據(jù)統(tǒng)計(jì),萬(wàn)維網(wǎng)已經(jīng)連通了世界上幾乎所有的國(guó)家,并且萬(wàn)維網(wǎng)正在急速發(fā)展。目前,萬(wàn)維網(wǎng)已經(jīng)成為世界上最大的信息源,成為全球范圍內(nèi)科研、教育、商業(yè)和社會(huì)、新聞、學(xué)校和專業(yè)機(jī)構(gòu)介紹、圖書(shū)及娛樂(lè)等信息的集大成者。近年來(lái)對(duì)萬(wàn)維網(wǎng)的研究的兩大熱點(diǎn)是網(wǎng)絡(luò)搜索引擎的研究和網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)的研究。對(duì)于網(wǎng)絡(luò)信息挖掘的首先要面對(duì)的問(wèn)題就是如何提取出網(wǎng)站內(nèi)部的URL,只有獲得了網(wǎng)站的所有URL才可以網(wǎng)站的全部?jī)?nèi)容?;诖吮疚慕o出了一種實(shí)用有效的提取網(wǎng)站內(nèi)部URL的方法。

          二、JAVA基礎(chǔ)

          Java語(yǔ)言方便靈活,是現(xiàn)在開(kāi)發(fā)網(wǎng)絡(luò)程序的主要語(yǔ)言。本文采用了Java語(yǔ)言來(lái)開(kāi)發(fā)。在Java的提供的java.util.*和 java.net.* 工具包中提供了大量簡(jiǎn)單易用的API。此外,在網(wǎng)絡(luò)上還有大量的開(kāi)放源碼。

          HTMLParser v 1.3是一套優(yōu)秀的開(kāi)放源代碼的提供HTML文件分析的工具包。它可以提供快速的、實(shí)事的文本分析的功能。HTMLParser最大的成功之處是它設(shè)計(jì)簡(jiǎn)單、速度快、應(yīng)用方便。可以從http://htmlparser.sourceforge.net下載此工具包和了解其用法。

          對(duì)于HTMLParser 工具包我們需要修改其中的htmlparser.java文件使其適用中文的html文件分析。htmlparser.java文件中具體實(shí)現(xiàn)細(xì)節(jié)就不再介紹。這里主要是把protected static final String DEFAULT_CHARSET = "ISO-8859-1";修改成protected static final String DEFAULT_CHARSET = "gb2312";因?yàn)椴捎媚J(rèn)的字符集"ISO-8859-1"對(duì)含有中文的html文件進(jìn)行分析的時(shí)候就會(huì)出現(xiàn)亂碼。必須進(jìn)行new String(str.getBytes("ISO-8859-1"),"GB2312")的轉(zhuǎn)換工作。

          對(duì)于修改好的htmlparser工具包,需要重新壓縮成.jar文件,放到j(luò)dk的工作環(huán)境中。

          三、具體設(shè)計(jì)

          首先新建一個(gè)靜態(tài)全局Vector變量L,在算法的遞歸調(diào)用中往L中不斷添加新發(fā)現(xiàn)的URL。公式(1)是一個(gè)遍歷網(wǎng)站內(nèi)部URL的數(shù)學(xué)表達(dá)式。

          S=T(ui) (1)

          s.t. ui O(ui)

          ui Ui-1 i=1,2…m

          其中T(u)是遍歷一個(gè)站點(diǎn)的所有URL的函數(shù),為了保證該遍歷方法收斂這里我給出了兩個(gè)限制條件,ui為一網(wǎng)站中的URL,O(ui)是判斷ui是否為該網(wǎng)站內(nèi)部的URL。

          算法是:

          1) 定義全局靜態(tài)變量public static Vector svecLink;

          2) 開(kāi)始搜索網(wǎng)站W(wǎng)的主URL;

          3) 解析出第一頁(yè)面的所有URL;

          4) 剔除無(wú)效的URL和非本站點(diǎn)的URL同時(shí)記錄所獲的URL的個(gè)數(shù)為a;

          5) 把URL添加到svecLink中;

          6) 從svecLink中取出最后a個(gè)URL分別遞歸調(diào)用此函數(shù)

          為了能保證遍歷的收斂,程序必須對(duì)URL進(jìn)行嚴(yán)格限制。下面是一些具體實(shí)現(xiàn):

          1) 定義的全局變量

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

          public static Vector svecLink, svecOutlink; //存放內(nèi)部URL和外部URL

          public static String hostName; //主機(jī)名稱

          public static boolean bl; //判斷標(biāo)志

          private String location;

          private Parser parser; //對(duì)超文本進(jìn)行分析

          2) 獲取主機(jī)名稱GetHostName()函數(shù)

          通過(guò)該函數(shù)來(lái)判斷所得URL是否是本網(wǎng)站的URL,如果不是就不需要添加svecLink中如果是并且以前沒(méi)有提取過(guò)就添加到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) 遞歸遍歷方法

          由于網(wǎng)站中URL之間的連接構(gòu)成了圖,所以對(duì)圖的遍歷這里采用深度優(yōu)先的方法。


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

          Vector vecTemp=new Vector();
          try {
          this.parser = new Parser(loc); //原理見(jiàn)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);
          //獲取一個(gè)頁(yè)面中//所有的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 {
          strNew=(String)vecTemp.get(i);
          System.out.println("this is "+strNew);
          extractLinks(strNew); //遞歸調(diào)用
          }
          }

          }


          四、結(jié)論

          本文介紹給出了一種提取網(wǎng)站內(nèi)部URL的實(shí)現(xiàn)方法,本文的方法對(duì)網(wǎng)絡(luò)機(jī)器人的研究和WEB文本挖掘提供了方便的工具。在程序的實(shí)現(xiàn)中還有許多實(shí)際的困難,需要在實(shí)驗(yàn)中不斷完善和改進(jìn)
          posted on 2007-09-20 15:54 王君 閱讀(655) 評(píng)論(0)  編輯  收藏 所屬分類: J2SE
          主站蜘蛛池模板: 友谊县| 辰溪县| 平顶山市| 尚义县| 呼图壁县| 台东市| 三台县| 闵行区| 大足县| 图木舒克市| 高要市| 万山特区| 绥化市| 南充市| 黎平县| 宜州市| 武定县| 同德县| 阿勒泰市| 丹寨县| 龙州县| 商洛市| 新密市| 琼海市| 海丰县| 安庆市| 宿迁市| 台南市| 曲沃县| 会泽县| 抚州市| 泽库县| 彭泽县| 卢龙县| 章丘市| 炎陵县| 陆良县| 连山| 深圳市| 抚宁县| 互助|