西南交通大学Java课程设计网络爬虫设计java简单画图程序设计图书销售管理系统设计.docx
- 文档编号:8607412
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:65
- 大小:1.84MB
西南交通大学Java课程设计网络爬虫设计java简单画图程序设计图书销售管理系统设计.docx
《西南交通大学Java课程设计网络爬虫设计java简单画图程序设计图书销售管理系统设计.docx》由会员分享,可在线阅读,更多相关《西南交通大学Java课程设计网络爬虫设计java简单画图程序设计图书销售管理系统设计.docx(65页珍藏版)》请在冰豆网上搜索。
西南交通大学Java课程设计网络爬虫设计java简单画图程序设计图书销售管理系统设计
信息科学与技术学院
2014—2015第二学期
《Java面向对象程序设计》
——课程设计报告
课程设计题目:
1、网络爬虫设计
2、java简单画图程序设计
3、基于SQLserver2008图书销售管理系统设计
学号:
20122617
姓名:
徐玉松
专业:
软件工程
教师:
陈帆
2015-06
网络爬虫设计
第1部分设计的内容要求
1.1设计内容
设计一款基于互联网的网络爬虫,要求使用java语言,并且使用其中的awt或者是swing包设计一款具有可视化的爬虫软件,其界面要十分友好,能满足一般爬虫的要求,要实现基本的爬取互联网上的资源的能力,能根据用户的自己需求爬取不同的网站,并能将网站对应源代码提取出来。
1.2设计要求
爬虫需要实现的功能有:
1、能对用户手动输入的链接执行爬取功能,并能对用户非法输入进行检测。
2、能实现开始、暂停、结束功能
3、能对正在爬取,爬取完成、正确链接、错误链接、邮件地址、未能识别的链接以及日志进行提取并时刻更新GUI让爬取的进度能实时的显示出来。
4、能对正确链接实现网页源代码的提取,并将其保存。
5、有非常友好的界面设计,有良好的用户体验。
第2部分设计思想
2.1使用经典MVC模式
使用经典MVC模式设计,实现数据访问和对界面更新的分离,我使用底层spider类从网络抓取对应的数据,控制层将对应的数据进行处理,使用实体类进行对应的数据共享传输,并在显示层使用容器机制对底层传来的对象进行绑定,实现了GUI的实时更新。
2.2使用多线程技术
由于涉及对多个GUI界面进行跟新,而且数据实时在底层网上传输,怎样才能使GUI得更新不会阻塞UI主线程呢,根据对java多线程的了解后,我使用了多线程技术将数据更新放在了线程中,这样实现数据对象更新后才将其发送给UI主线程对界面进行更新。
2.3java接口灵活使用
在底层的数据要怎样才能准确的返回给UI应用层呢,如果这两个层次分别由不同的人进行开发那么我们应该怎么样进行合理的数据交互呢?
为此我定义了接口使底层数据的返回格式完全实现规范化,这样在设计UI和底层代码之间只需要都遵守这个数据交换的接口,无需知道各个层次里面的具体实现是什么样,这对大型项目的开发也是十分重要的,降低了各个模块之间的耦合度。
我具体接口的设计如下:
/**
*
*@author徐玉松
*
*/
publicinterfaceISpiderReportable{
/**
*用于报告发现的链接
*@parambase跟链接
*@paramurl当前链接
*@return是否发现
*/
publicbooleanspiderFoundURL(URLbase,URLurl);
/**
*用于报告错误链接
*@paramurl错误链接
*/
publicvoidspiderURLError(URLurl);
/**
*用于报告错误邮件地址
*@paramemail邮件地址对象
*/
publicvoidspiderFoundEMail(EmailURLemail);
/**
*用于报告爬取完成的链接
*@paramcomleteURL爬取完成对象
*/
publicvoidspiderComlereURL(ComleteURLcomleteURL);
/**
*用于报告好的爬取地址
*@paramgoodLINK好的爬取地址对象
*/
publicvoidspiderGoodURL(GoodLINKgoodLINK);
/**
*用于报告坏的爬取地址
*@paramerrorURL坏的爬取地址对象
*/
publicvoidspiderErrorURL(ErrorURLerrorURL);
/**
*用于报告爬取到未知的链接地址
*@paramunknowURL未知链接地址对象
*/
publicvoidspiderUnknowURL(UnknowURLunknowURL);
}
2.4自定义JPanel
由于javaswing自带的jpanel十分简单而且满足不了相应数据绑定的需求,我自主学习了javaswing里面的自定义组件,将jpanel里面放了一个jtable并在其中添加了数据源。
如下便是我其中一个自定义控件设计。
publicclassGoodLinkPaneextendsJPanel{
privateGoodLinkContainergoodLinkContainer;
privateintindex;
privateList
privateJScrollPaneplayerScrollPane;
publicGoodLinkPane(){
//init(columnNames,comleteURL);
this.setLayout(newBorderLayout());
goodLinkContainer=newGoodLinkContainer();
JTablejTable=newJTable(goodLinkContainer);
jTable.setGridColor(Color.BLACK);
jTable.setShowGrid(true);
jTable.setShowHorizontalLines(true);
jTable.setShowVerticalLines(true);
jTable.setFillsViewportHeight(true);
playerScrollPane=newJScrollPane(jTable);
playerScrollPane.setPreferredSize(newDimension(200,400));
add(playerScrollPane,BorderLayout.CENTER);
index=0;
list=newArrayList
this.setVisible(true);
}
publicvoidsetTable(GoodLINKgoodLINK){
index++;
goodLINK.setIndex(index);
list.add(goodLINK);
goodLinkContainer.setData(list);
}
}
第3部分详细设计
3.1爬取正确链接并获取网页源代码或错误链接
1、主要算法
使用HttpURLConnection类打开相应网络链接,如果打开相应的网络抛出异常则此链接为错误链接,并使用类中对应的httpURLConnection.getResponseCode()方法获取链接的返回码,如果返回码小于400则判断链接能够联通,否则则为错误链接,我们将两种不同的链接分别记录在GoodLINK、ErrorURL实体类中,并将其链接的基本属性一并写入。
如果是正确链接我们还将其网页内容爬取出来放到D:
//spiderHtml+爬取网站名(比如D:
//spiderHtml/httpdeanswjtueducn)中,具体实现:
checkLink()函数实现。
protectedbooleancheckLink(URLurl){
try{
BufferedReaderreader;
Stringline;
StringBufferstringBuffer=newStringBuffer();
URLConnectionconnection=url.openConnection();
connection.connect();
HttpURLConnectionhttpURLConnection=(HttpURLConnection)connection;
if(httpURLConnection.getResponseCode()>=400){
ErrorURLerrorURL=newErrorURL();
errorURL.setResponsCode(String.valueOf(httpURLConnection
.getResponseCode()));
errorURL.setTime((newDate())+"");
errorURL.setUrl(url+"");
this.spiderErrorURL(errorURL);
returnfalse;
}else{
GoodLINKgoodLINK=newGoodLINK();
goodLINK.setContentType(connection.getContentType());
goodLINK.setResponsCode(String.valueOf(httpURLConnection
.getResponseCode()));
goodLINK.setTime((newDate())+"");
goodLINK.setUrl(url+"");
System.out.println(goodLINK.toString());
this.spiderGoodURL(goodLINK);
reader=newBufferedReader(newInputStreamReader(
httpURLConnection.getInputStream(),"utf-8"));
while((line=reader.readLine())!
=null){
stringBuffer.append(line+"\n");
}
Stringgenfilename=startURL.getText();
genfilename=genfilename.replace(":
","");
genfilename=genfilename.replace(".","");
genfilename=genfilename.replace("/","");
genfilename=genfilename.replace(",","");
genfilename=genfilename.replace("?
","");
genfilename=genfilename.replace("&","");
Filefile=newFile("D:
//spiderHtml"+"//"+genfilename.trim());
if(file.exists()){
}else{
file.mkdirs();
}
//System.out.println(file);
try{
Stringfilename=url.toString();
filename=filename.replace(":
","");
filename=filename.replace(".","");
filename=filename.replace("/","");
filename=filename.replace(",","");
filename=filename.replace("?
","");
filename=filename.replace("&","");
System.out.println(")))"+file.getAbsolutePath());
FilenewFile=newFile(file.getAbsolutePath()+"\\"+filename+".html");
if(newFile.exists())//存在,则删除
if(!
newFile.delete())//删除成功则创建
{
System.err.println("删除文件"+newFile+"失败");
}
if(newFile.createNewFile()){//创建成功,则写入文件内容
PrintWriterp=newPrintWriter(newFileOutputStream(
newFile.getAbsolutePath()));
p.write(stringBuffer.toString());
p.close();
}else{
System.err.println("创建文件:
"+newFile+"失败");
}
}catch(Exceptione){
e.printStackTrace();
}
returntrue;
}
}catch(IOExceptione){
ErrorURLerrorURL=newErrorURL();
errorURL.setResponsCode("requsttimeout");
errorURL.setTime((newDate())+"");
errorURL.setUrl(url+"");
this.spiderErrorURL(errorURL);
returnfalse;
}
}
2、对应流程图
3.2解析地址类型
1、算法设计
我将传入的链接作为跟链接,在此链接的基础上寻找该链接下网页中的所有链接,并将可用的链接装入ArrayList,针对每一个ArrayList中的URL又递归调用解析函数直到所有的链接都被解析完成则终止解析,我使用的解析类如下所示:
protectedclassParserextendsHTMLEditorKit.ParserCallback{
protectedURLbase;
publicParser(URLbase){
this.base=base;
}
publicvoidhandleSimpleTag(HTML.Tagt,MutableAttributeSeta,intpos){
Stringhref=(String)a.getAttribute(HTML.Attribute.HREF);
if((href==null)&&(t==HTML.Tag.FRAME))
href=(String)a.getAttribute(HTML.Attribute.SRC);
if(href==null)
return;
inti=href.indexOf('#');
if(i!
=-1)
href=href.substring(0,i);
if(href.toLowerCase().startsWith("mailto:
")){
EmailURLemailURL=newEmailURL();
emailURL.setUrl(href);
emailURL.setTime((newDate())+"");
report.spiderFoundEMail(emailURL);
return;
}
handleLink(base,href);
}
publicvoidhandleStartTag(HTML.Tagt,MutableAttributeSeta,intpos){
handleSimpleTag(t,a,pos);//handlethesameway
}
protectedvoidhandleLink(URLbase,Stringstr){
try{
URLurl=newURL(base,str);
if(report.spiderFoundURL(base,url))
addURL(url);
}catch(MalformedURLExceptione){
UnknowURLunknowURL=newUnknowURL();
unknowURL.setUrl(str);
unknowURL.setTime((newDate())+"");
report.spiderUnknowURL(unknowURL);}}}
2、流程图
3.3GUI表格数据跟新
1、算法设计
我使用了java中的容器来装载数据,并且自定义了表格的属性,我自定义的容器,它继承了AbstractTableModel这个抽象类,并将我要显示的数据绑定到对应的表格中,这样我只需跟新绑定在对应表格上的对象数据,自然可以实现对应数据的更新,应该注意的是更新数据时必须放在一个线程里面,这也是难点所在。
2、流程图
第4部分运行效果图
4.1界面截图
爬取目标地址为:
正确链接:
错误链接:
邮件地址:
未能识别
已完成:
日志:
解析后网页源代码:
4.2运行环境
系统:
程序可运行在运行在win7操作系统,xp系统,win8系统,Linux系统
硬件:
内存4G及其以上,Interi5处理器及以上,硬盘500G。
第5部分心得与体会
对于java我大二时便开始接触,一直以来都在学习Android方面的知识,做过一些项目,也学习过javaweb开发,深知java作为一门能跨平台的语言有着独特的优势,而且java中的各种机制有着独特的魅力,让我一直不懈的想去学习其中的一些非常好的设计思想,经过这学期的学习,我有增长了不少java方面的知识,尤其是对javaswing的学习,弥补了我在java这方面的一些缺点,而且在学习过程中,我发现swing中组件的设计与Android中的设计非常相似,因为对Android还算熟练,学javaswing的时候便十分得心应手,但是也遇到一些困难。
通过这个课程设计的学习我又将以前学习的设计模式套用进去,感觉其中的实现机制和Android开发十分相似,不管是从多线程GUI的跟新,还是数据源的绑定都是十分好的设计,让我不知不觉的感受到了Android控件设计很多机制都是参考了javaswing设计方法,但是又做了很大的改进,真是有异曲同工之妙。
最后,在这个设计中,我有更深刻的理解到了java接口使用的方法,这个设计使用起来非常方便,不仅让模块之间耦合度降低,而且可以再开发不同模块之前就可以将接口定义。
打个比方,接口就像类与类之间的协议,任何类实现接口的类都必须遵守这个协议。
第6部分附录
Window类
publicclasswindowimplementsISpiderReportable,ActionListener{
privateSpiderspider=null;
privateMyDetailPanepane1;
TogPanepane6;
UnknowPanepane5;
EmailPanepane4;
ErrorLinkPanepane2;
GoodLinkPanepane3;
ComleteURLcomleteURL=newComleteURL();
JTabbedPanemyTabPane;
privateJButtonbegin;
privateJButtonpause;
privateJButtonstop;
JFramejFrame;
privateJTextAreastartURL;
privateJTextAreacurrentURL;
privateThreadthread=null;
publicwindow(){
}
publicJFrameInitiWindow(){
jFrame=newJFrame("网络爬虫");
jFrame.setBounds(800,500,800,500);
ImageIconicon=newImageIcon("images/spider.jpg");
jFrame.setIconImage(icon.getImage());
jFrame.setLayout(newBorderLayout());
JPaneljPanel=newJPanel(newFlowLayout(FlowLayout.LEFT));
ImageIconicon_start=newImageIcon("images/start.png");
icon_start.setImage(icon_start.getImage().getScaledInstance(20,20,
Image.SCALE_DEFAULT));
begin=newJButton(icon_start);
begin.setBounds(20,20,20,20);
ImageIconicon_pause=newImageIcon("images/pause.png");
icon_pause.setImage(icon_pause.getImage().getScaledInstance(20,20,
Image.SCALE_DEFAULT));
pause=newJButton(icon_pause);
pause.setBounds(20,20,20,20);
startURL=newJTextArea("在此输入链接",1,50);
ImageIconicon_stop=newImageIcon("images/stop.png");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西南交通大学 Java 课程设计 网络 爬虫 设计 简单 画图 程序设计 图书 销售 管理 系统