Ihttp://localhost:8080/index,jsp
链接
AdminConsole
Statusasof??17,200809:0810GMTAleits:3CRAWLINGJOBSRUNNINGjob:mysearch0jobspending,2gpmpletej1019URIsin6m49s(2.35/sec)JobsProfilesLogsReportsSetupHelp
CrawlerStatus:CRAWLINGJOBS|HoldJobsRunning:mysearch0pending,2completed

Alerts:3
JobStatus:RUIWING|Psuss|Checkpoint|Terminate+Rates2.35URIs/sec(2.49avg)
KB/scc

Time
m49selapsed
ml8sremaining
Totals
downloaded10If
Memory
KBused28400KBcurrentheap:65088KBmaxhe^pLoad

activeof100threads1.0congestionratio752deepestqueue273averagedepthijhttp://localKost:8080/index,jsp
^/o
totaldownloadedandqueued19MBuncompresseddatareceived12732queued
M本*In.tr
图8-67Heritrix运行界面

待抓取完毕后,在Heritrix下会生成一个jobs文件夹,打开后有一个11178631’(:112008****的文件夹,这就是刚才设置的抓取任务,它的命名方式为设置的抓取任务名加上启动任务的时间,打开后可以看到如图8-68所示的目录结构。
图8-68抓取任务目录结构
Mirror文件夹下保存的是抓取的网页,如图8-69所示。
图8-69抓取结果
路径名为网页所对应的URL,了解这点对于进行网页预处理工作有很重要的意义。接下来进人下一部分——预处理。
O囫冠彌领画
Heritrix将网页抓取下来后,并没有对网页进行任何的修改,因此网页源码中还包含着大量的HTML标签,这些都是没有价值的信息,网页预处理的功能就是要从网页源码中提取出有用的信息,保存起来,并为将来建立索引所用。
原始网页的处理

网页中信息的重要性要视具体需要而定,一般来说,简单的捜索引擎会将网页中的文本部分全部提取出来作为信息,一些髙级的搜索引擎还会过滤掉这些信息中的广吿内容。原始网页的处理目的是将网页中的无关的HTML标签过滤,只取出有用的信息,过滤广告,按照某一格式重新存储网页的内容。现在只是将HTML标签进行过滤。
网页中的文本内容一般会在<DIV〉、<TD>等标签当中,另外超链接标签<A〉中也会包含一些重要的信息,因此,在过滤的时候要首先识别是哪一?类的标签,然后再有选择地进行过滤。Htmlparser是一个开源的标签过滤包,利用Htmlparser提供的一些方法,可以将网页中的各种标签以结点的方式表现出来,并能从中获取结点的各项属性和信息。
首先,构造一个用来表示处理后的网页模型类Page,代码如下:
packagecn.edu.bj£u.search.page;*
publicclassPage{
privateStringurl;privateStringtitle;privateStringsummary;privateStringcontext;privateintscore;publicPage(){url=*null;titlesnull;summary=null;context=null;score=10;}
publicStringgetUrl(){returnthis.url;publicvoidsetUrl{
,thia.url*url;
}
publicStringgetTitle(){returnthis.title;}
publicvoidsetTitle{this.title=title;}
publicStringgetSummary(){cetumthis.summary;}
publicvoidsetSttfnmary(Stringsummary“this.sinwary=?summary;
publicStringgetContext(){cetuxnthis.context;}
publicvoidSetContext{this,context^context;}
publicJLntgetScore(){cetucnthis.score;}
publicvoidsetScore{this.score=score;}
}
各个属性的意义已在注释中表明,具体的代码实现参照附带的示例程序。Page类要做的事情就是保存处理后的网页,
宁波seo优化并被其他控制类来调用,例如负责存储的类。
接下来看解析器类。解析器类的作用是解析原始网页,提取有用的信息。由于HTML没有像XML那样严格的语法限定,所以简单地用Java中的Pattern和Match类来过滤标签会有一些困难,因此本实例采用了第三方的开源包htmlparse来作为解析工具。
在eclipse下新建一个JavaProject,取名叫Preprocess,如图8-70所示。
图8-70新建工程Preprocess
建立好后,单击Preprocess前边的+号图标,展开文件夹,看到一个,JRESystemLibrary,如图8-71所示。
将鼠标移动到图8-71所示的运行库上,右键单击并在弹出菜单下选择BuildPathlConfigureBuildPath…,如图8-72所示。
Java-EclipsePlatform
El回gi
£ile£ditSourceRefactorHavigateSearchProjectRunVindow}{elp门,帑,O,;忐锴级,房JgEE1fep,I*>,。
JBESystemLibrary[jrel.6.0]-Pr?proc?ss图8-71所需要的运行库
图8-72配置BuildPath

右键单击Preprocess,在弹出的菜单中选择BuildPath|ConfigureBuildPath,弹出PropertiesofPreprocess窗口,选择Libraries选项卡,单击右边的AddExternalJARs…按钮,添加htmlparser.jar到项目工程Preprocess下,如图8-73所示。
单击OK按钮。现在就可以使用htmlparser中提供的解析网页的类了。
新建一个类,名字叫做Page,package名取为cn.edu.bjfu.search,page(这个名字可以自定义,具体格式参照Java包命名规则),如图8-74所示。
PropertiesforPreprocess
BE
图8-73添加htmlparser
图8-74新建Page类
在图8-74中单击Finish按钮,出现图8-75所示的画面。在Page,java类中输入如下的代码:
packagecn.edu.bjfu.search.page;publicclassPage{privateStringurl;privateStringtitle;privateStringsummary;pcivateStringcontext;privateintscore;pdblicPage(){图8-75Page,java类输人窗口
url=null;title-null;summary^null;context=null;score=10;}
publicStringgetUrl(){returnthis.url;}
publicvoidsetUrl{thia.url=url;}
publicStringgetTitle(){returnthis.title;}
publicvoidsetTitle{Stringtitle)。{this,title-title;}
publicStringgetSummary(){returnthis.smranary;}
publicvoidsetSummary{this.summary=summary;}

publicStringgetContext(){returnthis,context;};publicvoidSetContext{this,context35context;
}
publicintgetScore(){returnthis.score;}
publicvoidsetScore{this.score=score;}
}
按照同样的步骤,再新建一个类Extractor,package敢名力cn.edu.bjfu.searchextractor,Extractor的全部代碍如下:
packagecn.edu.bjfu.search.extractor;inportorg.htmlparser.*;

uqpoctorg.htmlparser.util.*;
inportorg.htmlparser.visitors.*;
importorg.htmlparser.nodes.*;
ijqportorg.htmlparser.tags.*;
importcn.edu.bjfu.search.page.*;
iaporhcn.edu.bjfu.search.util.*;
publicclaa番ExtractoriiopleraantsRunnable{privateStringfilename;privateParserparser;pcivatePagepage;privateStringencode;publicvoidsetEncode{this.encode=encode;}
privateStringcornbineNodeText(Node[]nodes){StringBufferbuffer-newStringBuffer();for(Inti=0;i
Stringline=null;
if(anodeinstanoeofTextNodej{

TextNodetextnode=anode;line=textnode.getText();}
elseif{
LinkTaglinknode=anode;line?linknode.getLinkText();}
lseif{

If(anode.getChildren()-null){
line=coinbineNodeText(anode.getChildren().toNodeArray());}
elseif{if(anode.getChildren()!=nuXl){line-combineNodeText(anode.getChildren()。toNodeArray());}
}
elseif{
if(anode.getChildren{)!=nulX){
line-combineNodeText(anode.getChildren().toNodeArray());}
}?
elseif{if(anode.getChildren()!==null){line=combineNodeText(anode.getChildren().toNodeArray());}
}
elseif{if(anode.getChildren()!=null){line篇combineNodeText(anode.getChildren()-toNodeArray());}
}
elseif{if(anode.getChildren()!=mall){line:combineNodeText(anode.getChildren().toNodeArray());}
}
if(line!-null){buffer,append;}
}
cetuxnbuffer.toStringO;
}
privateStringgetUrl{Stringurl=filename;
url=url.replace(ProperConfig.getValue(”mirror.path“)+”/mirror“,;if(url.lastIndexOf”)==url.length()-1){url=url.substring(0,url.length()-1);}‘ur1=url.substring⑴;
returnurl;
}
privateintgetScore(Stringurl,Intscore){String[]sxibStr=url.split(“/”);score=score-(subStr.length-1);mtuznscore;}
privateStringgetSummary{if(context==null){context-“”;
}
cetuxnMD5tMD5Encode;
}
publicvoidextract{System,out.printIn(“Message:Nowextracting”+filename);this.filename番filename.replace(“\”,run();
if(this.page!^null){
PageLib.store(this.page);
}
}
publicvoidrun(){try{
parser=n?rParser(this.filename);parser.setEncoding;HtmlPagevisitor=iwwHtmlPage;parser.visitAHNodesWith;page=mtntPage();//获取网页的URL
this.page.setUrl(getUrl(this.filename));
//获取网页的标题
this,page.setTitle(visitor.getTitleO);//验证网页<body>标签内是否为空,郎果是空则不用进行内容提取if(visitor.getBodyO^-null){this.page.SetContext;
}
elM{

//如果不为空,则提取内容
thia.page.SetContext(combineNodeText(visitor.getBody()?toNodeArray0));}
//计算网页的得分
this.page.setScore(getScore(this.page.getUrl(),this.page.getScore()));//计#网页的摘要thia.page.setSummary(getSummary(thi?.page.getContext0));}
catch{
this,page篇null;
printStackTrace();
System,out.printingContinue…“
这里对Extractoi?做一个简要的解释。Extractor类中的第一属性filename是用来保存当前要解析的网页的路径;parser是一个Parser类的对象,Parser包含在htmlparser当中,它的作用就是解析;Page是之前定义的Page类的对象;encode是一个String对象,用来保存网页的编码,方便parser进行解析。Extractor继承了Runnable接口,因此,要重载run()方法,其中combineNodeTextO方法是自己定义的。
parser对象可以将网页划分成不同层次的元素集合,有点类似于XML,而combineNodeTexK)方法通过递归来解析网页中的各个层次的元素,而网页的内容会出现在parser划分的文本结点,用TextNode对象来表示一个文本结点。当解析到的是文本结点,则读取其内容;再有,如果是链接结点,其中也会包含一些有用的内容,因此,当遇到结点为链接结点也要提取内容。如果遇到的是层结点或者类似的标结点则需要递归,因为这一类的结点会包含子结点,而子结点很可能是个文本结点。在反复不断的递归后,就能将网页的文本内容提取出来了。
当然,这种算法的效率不高,本实例测试了约19OpO个网页的解析,耗时超过了10分钟,算法效率可提髙的空间很大,本实例只是对原理进行讲解,如何提髙算法效率请读者自行研究。
每处理一个网页后,可获得一个保存了网页信息的对象page,但page对象是在内存中的,因此还要将它保存到文件中,这里定义了一个PageLib类,它有一个静态方法,用来保存page对象到文件中。
在Eclipse中生成一个PageLib类,package名为cn.edu.bjfu.search,page,如图8-76所示。

图8-76PageLib类生成窗口
这个包名同Page所在包,里面只有一个方法,如下所示。
packagecn.edu.bjfu.search.page;

importjava.io.BufferedWriter;
inportjava.io.FileWriter;
importjava.io.File;
importjava.io.IOException;
inportcn.edu.bjfu.search.util.*;
publicclassPageLib{-
publicstaticvoidstore(£?agepage){Stringstorepath=FroperConfig.getValue(”files.path“)+”/“+page.getSuimmary();if(netrFile.exists()==trua){System.out.println(”Message:n+storepath+“isexisted!”);cetum;
}
try{
BufferedWriterwriter=newBufferedWriter(newFileWriter);//第一行为URL
本文转载自
宁波seo优化www.leseo.net
补充词条:宁波seo推广公司
宁波seo优化公司
宁波谷歌优化
宁波网络seo公司
宁波网站排名优化