严大旺 070430148 网络spider程序.docx
- 文档编号:14717731
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:26
- 大小:556.99KB
严大旺 070430148 网络spider程序.docx
《严大旺 070430148 网络spider程序.docx》由会员分享,可在线阅读,更多相关《严大旺 070430148 网络spider程序.docx(26页珍藏版)》请在冰点文库上搜索。
严大旺070430148网络spider程序
合肥学院
计算机科学与技术系
课程设计报告
2009~2010学年第二学期
课程
Java课程设计
课程设计名称
网络Spider程序
专业班级
07网工
(1)班
姓名
严大旺
指导教师
许强张贯虹
2010年9月
一、需求分析
随着网络上海量信息的爆炸式增长,通用搜索引擎面临着索引规模、更新速度和个性化需求等多方面的挑战。
面对这些挑战,适应特定主题和个性化搜索的主题网络爬虫(focusedcrawlerortopicalcrawler)应运而生。
基于主题网络爬虫的搜索引擎(即第四代搜索引擎)已经成为当前搜索引擎和Web信息挖掘中的一个研究热点和难点。
搜索引擎一直专注于提升用户的体验度,其用户体验度则反映在三个方面:
准、全、快。
用专业术语讲是:
查准率、查全率和搜索速度(即搜索耗时)。
其中最易达到的是搜索速度,因为对于搜索耗时在1秒以下的系统来说,访问者很难辨别其快慢了,所以不做讨论。
对于中文搜索引擎的“准”,救市要保证搜索结果前几十项就要给出用户想要的信息,这个涉及到“网页排序”也不在本文的讨论范围;对于中文搜索引擎的“全”则需保证不遗漏某些重要的结果,而且能找到最新的网页,这需要搜索引擎有一个强大的网页收集器,一般称为“网络爬虫”,或是“网络蜘蛛”。
当今的主流搜索引擎比如XX()、谷歌()对某个站内(如学校网站、公司内部网站)的信息搜索存在如下两个问题:
1:
对于站内信息的搜索根本就没有对应的结果,或是对应的结果在搜索显示的很多页之后,用户有很小的概率有耐心的去看。
2:
对于站内各种格式的网页,包括html、图片、doc、pdf、多媒体、动态网页及其它格式等,很少有对应的解析信息。
以上第一个问题主要是由于当今互联网络的资源的增长猛烈,要抓取互联网上所有的网页几乎是不可能的,从目前公布的数据来看,容量最大的搜索引擎也不过是抓取了整个网页数量的百分之四十左右。
因此解决办法就是爬虫的更新,本文的第三部分介绍了爬虫更新的设计与实现。
以上第二个问题主要因为对于doc、pdf等文档,这都是由各种专业厂商制作的,没有一个统一的解析接口标准,而且这些格式的文档与HTML内容语法完全不同,因此这就涉及到爬虫的内容解析问题,本文的第二部分介绍了解析器的设计与实现。
(以上内容摘自于《站内网络爬虫的设计与实现》马栋等著)
本程序相比于baidu,google搜索引擎的程序是小程序,其是通过网页的链接地址来寻找网页,从网站某一个页面开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把整个网站所有的网页都抓取完为止。
随着信息时代的到来,网络已成为我们生活中不可缺少的一部分。
我们经常需要在网上查找资料,也就是用到搜索引擎,而网络蜘蛛又为它的核心,决定了搜索引擎数据容量的大小。
二.设计
1.设计思想:
网络蜘蛛即WebSpider。
是一个很形象的名字。
把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。
网络蜘蛛是通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始。
读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个阿站所有的网页都抓取完为止。
如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的喇页都抓取下来。
网络蜘蛛实现的流程图如下图所示。
2.功能设计
1).系统的主要功能包括:
根据网络蜘蛛的基本原理设计并实现了web网站下载系统。
系统能根据用户输入的URL地址进行整个网站的下载并保存到本地硬盘,通过设置最大链接访问深度来限制访问层数。
采用非递归的方式进行web网站的下载,并通过多线程机制来提高系统的运行效率,实现了基于内存的队列管理和网页数据的存储。
2).功能祥细介绍
Web网站系统下载:
当用户输入Url地址,系统会根据其进行整个网站的下载,对于各个网站会有相应的文件夹进行存放,当搜索完毕,我们会发现在程序文件盘中会产生多个文件夹,而每个文件夹的文件名都是根据站点的网址来命名的,例如我们搜索的是XX网站,我们可能会出现不仅仅是XX网站这一个文件夹,可能还有其他网站的文件夹,这是因为在XX页面里可能还有引用网页,即一个网页里面的文件可能是一个别的网站的链接文件。
这就说明了为何会出现多个文件夹。
就其原因是在本程序中没有对其他网站的过滤,这种过滤是一个复杂的过程,在程序中如果要去实现,那就需要做更大的工作量,例如对于XX网站,有XX贴吧,有XX照片,XX新闻等,虽然Url不是相同,但都属于XX网站的子网站,根据Url的字符串字段进行删选很难去实现,当然确实有方法。
我们可以对url字段进行相应方式的比较,如果在这个url中含有baidu这个字段,我们就认定为XX的网站的一部分,这样做只是过滤了一部分,但是并不能完全过滤,因为也有可能别的网站会有如此的网站名如baiduci等这种类似的。
我在这里做一个引申的解决方法,本程序中没有考虑。
设置最大链接访问深度来限制访问层数:
本程序只能够我们采用了树这种数据结构,对于为何采用树的结构,是根据程序的设计理念来决定的。
本程序因为是在一个网站的主页面中去搜寻可链接Url,在根据这些Url做一样的工作。
这就跟树的结构有很大的类似,主页面url作为根节点,而其中的url作为其子节点,同样把那些子节点(url)作为母节点,搜索到的url作为其的子节点,这样反复进行。
而这种深度的限制恰好与我们所要求的访问深度本质是一样的。
一个url对应多过url,在其中的一个url对应多个url…这样的深度就是我们所用树结构的深度一样。
多线程技术提高系统的运行效率:
一个url对应多个url,那我们是采用对那种顺序对url进行搜索,如果是一个url搜索完毕再进行对另外一个url搜索,这样势必影响系统的运行效率,并且对系统的内存的利用率不高。
采用多线程的技术,使得多个搜索线程同时进行。
提高了系统的运行效率和设备的利用率。
3.详细设计
在这里我们详细介绍本程序的核心即网络搜索程序模块。
publicvoidsearchWeb()是这个程序的主要的方法。
首先我们是对通过参数方法传递过来的url进行判定和一定的修改,判定和修改的方法如下:
if(DW.hasUrl(urlstr)){//辨别此URL是否访问过
return;}
if(depthLimitExceeded(parentnode))//判断是否超过设定深度
return;
if(sitesSearched>siteLimit)//判断是否超过设定的网页总数
return;
if(!
protocol.equalsIgnoreCase("http")&&!
protocol.equalsIgnoreCase("file")){
messageArea.append("跳跃:
"+urlstr+"非Http网站\n\n");
return;}
Stringpath=url.getPath();//获取url路径
intlastdot=path.lastIndexOf(".");
if(lastdot>0){
Stringextension=path.substring(lastdot);//获取最后小数点的后面的字符串
if(!
extension.equalsIgnoreCase(".html")&&!
extension.equalsIgnoreCase(".htm"))
//判别是否为html/htm文件
return;//跳跃任何东西除了html文件}
if(!
isDomainOk(url)){
messageArea.append("跳跃:
"+urlstr+"不包含选中的后缀域\n\n");
return;}
对url的判定和修改完毕,我们就新建树节点,读取文件的内容,提取其中的子节点(url),增加新的节点。
代码如下:
UrlTreeNodenewnode=newUrlTreeNode(url);//创建节点
InputStreamin=url.openStream();//创建对url输入流
InputStreamReaderisr=newInputStreamReader(in);
saveUrl(url);//存储网页
DefaultMutableTreeNodetreenode=addNode(parentnode,newnode);
SpiderParserCallbackcb=newSpiderParserCallback(treenode);、
ParserDelegatorpd=newParserDelegator();
pd.parse(isr,cb,true);
isr.close();//关闭流
三.调试及测试
1、调试过程中遇到的主要问题及解决方法
1)在程序初做好调试过程中,只能下载一个网页,而不是对整个网站进行下载,主要遇到一个问题:
Url路径的问题不能作为网页保存名,因为文件名不能包含“/”等字符。
而Url中含有这些字符,最关键的问题是:
Url路径,例如:
在这里我们需要新建一个文件夹,还要再建立其中的文件夹ns,最后再建其中的index.html。
但在Java中不能重复建立文件夹。
因此我们建立一个方法PublicvoidsaveUrl(URLurl),再此方法中对其中的url以“/”进行分割,建立相应的文件夹或文件。
2)还有由于采用了多线程的手法,程序中运用了多线程,但是对Url是否访问过判定不准确,即能够出现多次访问的情况,因此本程序中我们单独建立了一个共享的同步的静态表,这个设定的对象是互斥使用的,当程序访问新的网站就与其中的网址进行判断是否相等,若有就返回false,否则返回True。
2、对设计和编码的回顾讨论和分析;
程序搜索完毕,会出现多个文件夹。
就其原因是在本程序中没有对其他网站的过滤,这种过滤是一个复杂的过程,在程序中如果要去实现,那就需要做更大的工作量,例如对于XX网站,有XX贴吧,有XX照片,XX新闻等,虽然Url不是相同,但都属于XX网站的子网站,根据Url的字符串字段进行删选很难去实现,当然确实有方法。
我们可以对url字段进行相应方式的比较,如果在这个url中含有baidu这个字段,我们就认定为XX的网站的一部分,这样做只是过滤了一部分,但是并不能完全过滤,因为也有可能别的网站会有如此的网站名如baiduci等这种类似的。
在本程序中关键字段设置搜索我们是通过读取网页文件的源代码,进行搜索,但是在运行的实际情况请不是很理想,因为在网页的源代码中可能其中还有注释的内容,这与我们设置的关键字段也比较了,所以我们这样的做法有一定的纰漏。
3、程序运行的时空效率分析
在本程序中我们采用了多线程的技术,使得搜索这样一个操作可以多个在一起同时进行。
当然这样也产生了一定的问题,在一开始我们也设置了一个数组来存放已经访问过的url,这是判断一个url访问过的数据比较对象,但是程序运行时我们还是出现了重复的搜索一个网站的问题,最后我们单独建了一个互斥共享的表,这样解决了多线程或产生的同时访问数据比较对象的问题。
通过采用了多线程的技术,明显提高了程序的运行效率,如果把访问的深度和网页访问的数量趋于无限大的情况下,这与没有采用多线程技术的系统运行效率的效果更加明显。
而且采用了多线程,设备的利用率也更加大了。
4、测试数据集
1)开始测试数据的时候在网址一栏输入点击“开始搜索”的按钮,即可进行搜索,并且在网站访问最大的数量是100,搜索最大深度默认是10,都可以进行设置,深度就是搜索树有10层,最大网站数量就是搜索的网站最大数目为100,但是在访问的网站最大数量统计时候,会有101个网站,因为我们开始输入的这个源网站也计算在内了。
如:
2)点击开始搜索之后,会搜索一系列的网站,之后点击搜索树形,即可出现下面的页面,可以查看到已经搜索到的网站,网络爬虫所“爬过”的网址:
3)这个下面的图是测试中的消息栏,显示的是网络Spider所搜索到的网站的URL等信息,可以通过消息栏对这个程序有更进一步的理解:
4)在搜索树形中选中一个网址,如
选中图中的“XX一下,你就知道-”这个网址,再点击按钮
,即可通过IE打开一个网页,就是平时我们经常上的网页:
XX的首页。
效果如下图:
这个就是按钮
所实现的功能。
并且在程序的下方会出现
这样的一个提示信息,说明的是你所选中的网页中的具体信息。
这些都是需要注意的小的细节,可以利用到程序中,使其更加完美。
5)另外,在搜索过网站之后,点击一排按钮中的
,即可将消息栏中的所有的信息都清除掉,清除后的效果如下图:
6)如下图中所示,这个是在开始界面中的选项,是一个关于所要输入的网站的后缀名的选择,如果输入错误,会有相关提示,并且,如果不在网址输入一栏输入任何网址,也会出现相应的提示信息,如图:
7)最后一步,点击
按钮,即可结束程序运行。
四、经验和体会。
我花费了近两个多星期的时间,查阅了许多相关的资料,并且和同组成员很好的讨论了此程序的相关问题,并上网查询了很多不懂得问题,终于完成了网络Spider程序。
程序已经基本实现了该课程设计的基本要求。
在本次课程设计的过程中了解到自己的知识还是比较有限,这也更肯定了自己再以后学习编程的道路上的坚定不移,同时也让我懂得同组合作的重要性。
但由于只学习了一个学期的Java语言,自己水平有限,使得程序还是有些不完善的地方。
回顾起此次Java课程设计,至今我仍感慨颇多,的确,从拿到题目的开始,从理论到实践,在整整两个星期的日子里,可以说是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实践相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正掌握这门技术,也提高了自己的独立思考的能力。
在设计的过程遇到问题,可以说得上是困难重重,这毕竟第一次做的,难免会遇到各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学的知识重新温故。
通过此次课程设计,将我我本学期所学的Java知识得到巩固和应用,在设计的过程中,我遇到了很多问题,不过在朋友和同学的帮助和自己的思考下还是很好的完成了。
这次课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开拓视野,拓宽思维。
它还让我学会了在网上查阅那些无限的资料。
让我不仅学会了书本上的知识,还让自己能够面对困难并且克服它。
更重要的的是如何通过组的合作,来完成一份作业,它更需要彼此的耐心,容忍力,遇到难题不会迁怒别人,而是很好的与他人沟通,认真的来完成。
附录:
主要源程序
/*
*Spider.java
*
*/
importjava.util.*;
importjava.io.*;
import.*;
importjavax.swing.*;
importjavax.swing.tree.*;
importjavax.swing.text.html.parser.*;
importjavax.swing.text.html.HTMLEditorKit.*;
importjavax.swing.text.html.*;
importjavax.swing.text.*;
publicclassSpiderextendsThread{
privateintsiteLimit=100;
privateintdepthLimit=100;
privateStringkeywordList[];
privateStringipDomainList[];
privateJTreesearchTree=null;
privateJTextAreamessageArea;
privateJLabelstatsLabel;
privateintsitesSearched=0;
privateintsitesFound=0;
privateStringstartSite;
privatebooleanstopSearch=false;
privateFilefile;
publicSpider(JTreeatree,JTextAreaamessagearea,JLabelastatlabel,
Stringastartsite,String[]akeywordlist,String[]aipdomainlist,
intasitelimit,intadepthlimit){
searchTree=atree;
messageArea=amessagearea;
statsLabel=astatlabel;
startSite=fixHref(astartsite);
keywordList=newString[akeywordlist.length];
for(inti=0;i keywordList[i]=akeywordlist[i].toUpperCase();//使用给定Locale的规则将此 //String //中的所有字符都转换为大写。 ipDomainList=newString[aipdomainlist.length]; for(inti=0;i ipDomainList[i]=aipdomainlist[i].toUpperCase(); siteLimit=asitelimit; depthLimit=adepthlimit; DefaultMutableTreeNoderoot=newDefaultMutableTreeNode( newUrlTreeNode("Root")); DefaultTreeModeltreeModel=newDefaultTreeModel(root); searchTree.setModel(treeModel); searchTree.setCellRenderer(newUrlNodeRenderer()); } publicvoidrun(){ DefaultTreeModeltreeModel=(DefaultTreeModel)searchTree.getModel(); DefaultMutableTreeNoderoot=(DefaultMutableTreeNode)treeModel .getRoot(); Stringurllc=startSite.toLowerCase(); if(! urllc.startsWith("http: //")&&! urllc.startsWith("ftp: //") &&! urllc.startsWith("www.")){ startSite="file: ///"+startSite;//前加File: /// }else//http丢失 if(urllc.startsWith("www.")){ startSite="http: //"+startSite;//自动添加http: // } startSite=startSite.replace('\\','/');//修改\\为/ sitesFound=0; sitesSearched=0; updateStats(); searchWeb(root,startSite);//搜索网络 messageArea.append("完成! \n\n"); } /** *检测搜索的深度 */ publicbooleandepthLimitExceeded(DefaultMutableTreeNodenode){ if(node.getLevel()>=depthLimit) returntrue; else returnfalse; } /** *增加一个节点给搜索树上 * */ privateDefaultMutableTreeNodeaddNode(DefaultMutableTreeNodeparentnode, UrlTreeNodenewnode){ DefaultMutableTreeNodenode=newDefaultMutableTreeNode(newnode); DefaultTreeModeltreeModel=(DefaultTreeModel)searchTree.getModel(); intindex=treeModel.getChildCount(parentnode); treeModel.insertNodeInto(node,parentnode,index);//把这个节点作为最后的子节点 TreePathtp=newTreePath(parentnode.getPath()); searchTree.expandPath(tp);//确保用户能够看到增加的节点 returnnode; } /** *判断搜索域 */ privatebooleanisDomainOk(URLurl){ if(url.getProtocol().equals("file")) returntrue;//若是file文件都可以 Stringhost=url.getHost();//获取URL的主机名 intlastdot=host.lastIndexOf("."); if(lastdot<=0) returntrue; Stringdomain=host.substring(lastdot); if(ipDomainList.length==0) returntrue; for(inti=0;i if(ipDomainL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 严大旺 070430148 网络spider程序 网络 spider 程序