大学计算机网络体系结构课程.docx
- 文档编号:9115658
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:10
- 大小:103.12KB
大学计算机网络体系结构课程.docx
《大学计算机网络体系结构课程.docx》由会员分享,可在线阅读,更多相关《大学计算机网络体系结构课程.docx(10页珍藏版)》请在冰豆网上搜索。
大学计算机网络体系结构课程
北京大学计算机网络体系结构课程
Heritrix研究报告
Heritrix安装使用代码分析及网站链接分析
北大深圳研究生院信息工程学院
组长:
闫应威
组员:
霍佳森胡钊王超
题目:
Heritrix研究试验报告
摘要:
Heritrix是一款开源的由Java写成的网络爬虫项目,通过对项目进行安装使用能够了解网络爬虫的一般结构并了解爬虫的各种机制的实现方法,通过对下载网站进行连接分析可以系统掌握pagerank算法并理解网络的一般结构。
研究报告主要介绍对Heritrix的研究方法,并对实验结果进行分析。
通过介绍Heritrix的使用方法以求用简便的方式加速抓取并输出抓取网站URL之间的图连接关系。
简介:
报告主要针对作业内容进行试验方法上的研究与实验结果上的分析,首先在方法中介绍爬虫安装使用上的技巧,然后介绍如何通过修改代码得到获取网站的连接关系图,最后在实验结果中回答连接关系的数据以及Heritrix的两种机制的实现方式。
在连接关系的分析上主要通过PageRank算法来实现对整个拓扑结构的分析。
在分析方法上面主要使用了五种方法来提高Heritrix的抓取速度。
分析代码的过程中主要参照了Heritrix的参考文档,查找到相应机制的实现类内容。
通过对Heritrix的研究与使用可以帮助我们更深入的了解爬虫的实现原理,对以后研究爬虫的各方面性质提供很有意义的参考。
通过对获取URL连接的分析有助于了解整个web图结构的性质。
试验使用方法:
1启动多线程更快
Heritrix采用HostnameQueueAssignmentPolicy来进行对URL处理。
url队列以hostname为key,所有相同key的url放置在同一个队列里面,也就是说同一个host下面的所有url都放在一个队列里面,当线程获取url时候,会将该队列放置到同步池中。
所以添加一个自己的类,并将其添加到运行项中:
首先添加public class ELFHashQueueAssignmentPolicy extends QueueAssignmentPolicy
然后在AbstractFrontiers中加入ELFHashQueueAssignmentPolicy.class.getName() 。
2修改order.xml更快
序号
配置名
理想值
说明
1
3
抓取一个网页的最大时间(秒),超过了该时间则不抓取,0表示没有这个限制
2
50
抓取的线程数,表示有多少个线程去抓取,一般50足够了
3
1.0
如果从某个队列抓取一个URL花费N秒,则下次从该队列获取URL去抓取则要延迟N*该值
4
2000
队列的最大延迟时间,单位为毫秒
5
0
队列的最小延迟时间,单位为毫秒
6
5
URL抓取失败可以重试的次数,重试次数越少越好
7
200
准备队列中待抓取的URL个数,这些URL无需经过队列等待可以立刻去抓取
3修改代码解决乱码
4只抓去文本文件
解决方法就是添加一个rule,过虑掉非文本类型的文件从而节省抓取时间。
5修改ExtractorHTML输出URL图
因为最终进行统计与PageRank算法迭代需要输入的数据为图的邻接表表示结构,因此在抓取过程中能过同时输出URL的图结构将有助于数据统计工作的完成。
首先,定义输出的格式为如下:
URL1URL2URL4URL7URLi*****
URL1为当前的页面URL地址,之后为当前页面解析出来的URL地址,以上面结构排列一行为一个邻接表的一项,将所有URL按照上述格式输出就得到了所需的URL图结构。
然后,对Heritrix中ExtractorHTML进行修改,具体修改如下:
函数:
publicvoidextract(CrawlURIcuri)
中添加:
在函数:
protectedvoidprocessLink(CrawlURIcuri,finalCharSequencevalue,CharSequencecontext)中加入:
6统计URL图中的连接信息:
当获得URL图的结构之后,可以通过编写算法对网络的图结构进行统计,并将最终结果输出,通过PageRank算法的迭代可以得到网页的重要性排名。
PageRank算法核心代码如下:
floatpageRank[]=newfloat[total+1];
//存放临时重要性
floatprTmp[]=newfloat[total+1];
for(inti=1;i<=total;++i)
{
pageRank[i]=1.0f/total;
prTmp[i]=0.0f;
}
//当前页面的PR值
floatfatherRank=1f;
floatalpha=0.85f;
//大体进行50次迭代,一中迭代的方法来求矩阵特征值
for(intiterator=0;iterator<50;iterator++)
{
longstartTime=System.currentTimeMillis();
linkinput=newBufferedReader(newFileReader(linkfile));
line=linkinput.readLine();
//一次迭代;对每一个元素,进行计算其贡献率
while(line!
=null)
{
//计算每个网页的出度
linesarr=line.split("");
if(linesarr.length>0)
{
outdegree=linesarr.length-1;
for(intj=1;j<=linesarr.length-1;++j)
{
if(linesarr[j].equals(linesarr[0]))
outdegree--;
}
}
if(outdegree>0)
{
father=(int)docIDandNum.get(linesarr[0]);
fatherRank=pageRank[father]/outdegree;
for(intk=1;k<=linesarr.length-1;++k)
{
if(linesarr[k].equals(linesarr[0]))
{
continue;
}
son=docIDandNum.get(linesarr[k]);
if(total>=son&&son>=0)
{
prTmp[son]+=fatherRank;
}
}
}
linesarr=null;
line=linkinput.readLine();
试验结果:
1抓取结果:
序号
类型名
抓取数目
1
文本类(.asp.html.htm.txt)
26893个
2
图片类(.gif.jpg.ico)
8762个
3
文档类(.pdf.doc)
105个
4
其他(.ccs.rar等等)
234个
5
总计
35994个
表1最终抓取结果统计
2连接分析结果:
序号
URL名称
出/入度
PageRank的权值
1
2/24055
0.0553333
2
47/24055
0.0533331
3
45/24054
0.0539478
4
76/24054
0.0528744
5
19/24052
0.0519876
6
13/24051
0.0497762
7
NewsID=1622&BigClassName=CN&SmallClassName=
%E6%88%91%E4%BB%AC%E7%9A%84%E8%81%94%E7%B3%B
B%E6%96%B9%E6%B3%95&SpecialID=0
0/24049
0.0139219
8
49/568
0.0122392
9
49/408
0.0121348
10
39/208
0.0121227
表2排名前十的URL的结果分析
3判重机制与礼貌机制的分析结果:
1)判重机制
在类BdbFrontier中实现类四种过滤器分别为:
BdbUriUniqFilter
BloomUriUniqFilter
MemFPMergeUriUniqFilter
DiskFPMergeUriUniqFilter
BdbUriUniqFilter主要通过调用sleepcat中的API来实现查看URL数据中是否存在URL,MemFPMergeUriUniqFilter与DiskFPMergeUriUniqFilter主要用来合并文件,下面主要分析BloomUriUniqFilter中实现的判断方法:
BloomUriUniqFilter主要通过类BloomFilter32bitSplit来实现对URL的过滤的:
privatelonghash(finalCharSequences,finalintl,finalintk){
finalint[]w=weight[k];
inth=0,i=l;
while(i--!
=0)h^=s.charAt(i)*w[i%NUMBER_OF_WEIGHTS];
return((long)h-Integer.MIN_VALUE)%m;
}
该函数对每一个URL进行Hash求值,以便对已访问的URL进行标记
publicbooleancontains(finalCharSequences)
{
inti=d,l=s.length();
while(i--!
=0)if(!
getBit(hash(s,l,i)))returnfalse;
returntrue;
}
判断一个URL是否存在,如果存在只能在概率上认为已经存在,不能完全否定,如果不存在则可以确定不存在,可以直接加入到数据库,节省运算量。
publicbooleanadd(finalCharSequences)
{
booleanresult=false;
inti=d,l=s.length();
longh;
while(i--!
=0){
h=hash(s,l,i);
if(!
setGetBit(h))result=true;
}
if(result)size++;
returnresult;
}
每加入一个URL对该数值进行标定。
2)礼貌机制:
Heritrix中的礼貌机制有许多,只分析较为简单的一个,在AbstractFrontier中函数:
protectedlongpolitenessDelayFor(CrawlURIcuri){
longdurationToWait=0;
if(curi.containsKey(A_FETCH_BEGAN_TIME)
&&curi.containsKey(A_FETCH_COMPLETED_TIME)){
longcompleteTime=curi.getLong(A_FETCH_COMPLETED_TIME);
longdurationTaken=(completeTime-curi
.getLong(A_FETCH_BEGAN_TIME));
durationToWait=(long)(((Float)getUncheckedAttribute(curi,
ATTR_DELAY_FACTOR)).floatValue()*durationTaken);
longminDelay=((Integer)getUncheckedAttribute(curi,
ATTR_MIN_DELAY)).longValue();
if(minDelay>durationToWait){
//waitatleasttheminimum
durationToWait=minDelay;
}
longmaxDelay=((Integer)getUncheckedAttribute(curi,
ATTR_MAX_DELAY)).longValue();
if(durationToWait>maxDelay){
//waitnomorethanthemaximum
durationToWait=maxDelay;
}
longnow=System.currentTimeMillis();
intmaxBandwidthKB=((Integer)getUncheckedAttribute(curi,
ATTR_MAX_HOST_BANDWIDTH_USAGE)).intValue();
if(maxBandwidthKB>0){
//Enforcebandwidthlimit
CrawlHosthost=controller.getServerCache().getHostFor(curi);
longminDurationToWait=host.getEarliestNextURIEmitTime()
-now;
floatmaxBandwidth=maxBandwidthKB*1.024F;//kilofactor
longprocessedBytes=curi.getContentSize();
host.setEarliestNextURIEmitTime((long)(processedBytes/maxBandwidth)
+now);
if(minDurationToWait>durationToWait){
durationToWait=minDurationToWait;
}
}
}
returndurationToWait;
}
先通过获取一次网页的时间计算要等待的时间durationToWait,然后与设定的最大延迟、最小延迟、带宽延迟进行比较,来判断合适的延迟时间,以免过于频繁的访问一个服务器造成过大压力。
胡钊闫应威王超:
网页抓取
霍佳森:
代码分析网页统计代码实现报告书写
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大学 计算机网络 体系结构 课程