java课程设计网络爬虫搜索引擎.docx

上传人:b****5 文档编号:6538268 上传时间:2023-01-07 格式:DOCX 页数:25 大小:279.96KB
下载 相关 举报
java课程设计网络爬虫搜索引擎.docx_第1页
第1页 / 共25页
java课程设计网络爬虫搜索引擎.docx_第2页
第2页 / 共25页
java课程设计网络爬虫搜索引擎.docx_第3页
第3页 / 共25页
java课程设计网络爬虫搜索引擎.docx_第4页
第4页 / 共25页
java课程设计网络爬虫搜索引擎.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

java课程设计网络爬虫搜索引擎.docx

《java课程设计网络爬虫搜索引擎.docx》由会员分享,可在线阅读,更多相关《java课程设计网络爬虫搜索引擎.docx(25页珍藏版)》请在冰豆网上搜索。

java课程设计网络爬虫搜索引擎.docx

java课程设计网络爬虫搜索引擎

学号:

课程设计

 

题目

网络爬虫搜索引擎

学院

管理学院

专业

信息管理与信息系统

班级

姓名

指导教师

王新

 

201

7

4

课程设计任务书

学生姓名:

指导教师:

王新工作单位:

信息管理与信息系统系

题目:

网络爬虫搜索引擎

初始条件:

合理应用Java相关知识与编程技能,结合UML面向对象设计,解决信息管理领域的实际问题,如学生成绩管理、学籍管理、图书借阅管理、自动存取款机、通信录管理、商品销售管理、医院门诊管理、火车订票管理、影院自动售票、世界杯足球比赛管理、人力资源管理、酒店前台管理、房产中介管理、停车收费管理等。

要求完成的主要任务:

(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)

1.进行需求分析,撰写需求文档,绘制用例图。

2.识别需求文档中的类,建模类,初步绘制类图(之后逐渐完善)。

3.确定、建模类的实例变量。

4.确定、建模类的方法。

5.若有需要,在系统中加入继承与多态。

6.将UML图转换成Java代码框架。

7.设计算法,若有复杂的数据结构需求,使用相应集合框架。

8.设计数据访问层,若有数据持久化需求,使用数据库/文件。

9.添加表示层,若程序运行在桌面,使用图形用户界面。

10.实现完整的系统,最终Java源代码至少在300行以上。

11.进行测试,并给出相应结果。

课程设计报告中要求详细描述思路、步骤、方法、实现、问题及解决过程、操作说明、测试及结果。

时间安排:

1.2014年6月23日课程设计选题、查阅资料

2.2014年6月24日~25日UML面向对象设计

3.2014年6月26日~7月1日Java程序设计与代码调试

4.2014年7月2日改进、完善、测试系统

5.2014年7月3日~7月4日上午撰写、提交课程设计报告

6.2014年7月4日下午课程设计答辩

指导教师签名:

年月日

系主任(或责任教师)签名:

年月日

网络爬虫搜索引擎

1项目介绍

1.1开发背景

该项目软件开发的意图是开发出一款网络爬虫软件。

应用目标为搜集网络信息,便于查询使用。

在如今的BIGDATA时代,网络信息庞大而又复杂,用户很难直接从中获得需要的信息。

网络爬虫软件就是将这些信息收集并整理,当用户发起搜索请求时,该系统可将用户最需要的信息反馈给用户。

1.2用户的特点

本软件为免费软件,可供所有可使用互联网的用户使用。

最终用户只需掌握基本的上网技术即可,操作人员的主要工作是启动和关闭服务器,只需掌握基本的电脑使用方法即可。

维护人员需要专业的程序员,懂得Java的网络编程以及计算机网络基础,教育水平在专科以上。

软件的预期工作时间为24h/日。

组织结构图及用户角色如图表1-1所示:

1.3需求分析

1.3.1各子模块功能的描述

本系统共分为三大模块:

爬虫模块、数据库模块和搜索模块,也就是后台、前台和数据库。

每一个模块有各自的分工,最后三大模块集合在一起构成一个完整的网络爬虫系统。

各个子模块的详细功能如下:

1.3.2爬虫模块

第一个模块为爬虫模块。

爬虫模块的主要任务是负责寻找网页,并将网页内的URL和关键字提取出来。

此模块又详细分为两大模块:

服务器模块和正则引擎模块,这两个模块分别负责上述的两个功能。

服务器模块向某个种子URL发送请求,或得其页面内容;正则引擎模块将服务器获取的页面用正则表达式对其进行分析,截取其中的URL和关键字,然后再将URL传递给服务器模块。

系统按照这样的方式不断的抓取网页并进行分析,最后将结果存进数据库。

1.3.3搜索模块

第二个模块是搜索模块,用户在搜索界面输入关键字,然后系统在数据库中搜索对应的关键字,最后将结果返回给用户。

此模块又分为搜索界面和结果界面。

搜索界面是首页,用户在此界面中输入想要搜索的关键词,这些关键词将被此页面记录下来传递到数据中进行搜素。

结果页面是数据库结果的接受者,当数据库完成搜素后会将结果传递给次页面,然后结果页面会将结果呈现给用户。

1.3.4数据库模块

数据库模块在整个系统中起到存储和桥梁作用。

爬虫模块将搜索的结果整理完成后存入数据库,搜索模块从数据库中获取需要的信息并呈现给用户。

1.4对非功能性的需求

1.4.1精度

该系统的输入为一个字符串,里面包含了一个或多个关键字,长度在38个汉字以内,超过的部分将被直接舍弃。

输出的数据要求包括网站的URL和页面简介,按照页面内容与搜索内容的匹配程度来排序。

1.4.2时间特性要求

a)响应时间≤0.01s

b)更新处理时间≤0.1

c)数据的转换和传送时间≤0.1s

1.4.3灵活性

该系统运用的主要语言是Java,由于Java是一门跨平台的语言,所以本系统的兼容性比较强,只要配置了Java环境就可以运行。

当该系统与数据库MySQL的接口发生变化时,系统在重新加载了新的驱动后要能够正常运行。

1.4.4输人输出要求

输入:

由用户输入搜索关键字,关键字类型为合法字符。

输出:

显示结果列表或提示信息,包含页面地址、页面标题、页面描述的条目列表或字符串提示信息。

1.4.5故障处理要求

出错输出信息:

根据不同的错误提供不同的错误提示信息。

例如无网络连接、无法检索到结果。

出错处理对策:

1)一般错误:

显示错误信息,提示用户重新操作

2)严重错误:

重新启动,必要时启用备份恢复数据

1.4.6其他专门要求

如用户单位对安全保密的要求,对使用方便的要求,对可维护性、可补充性、易读性、可靠性、运行环境可转换性的特殊要求等。

1)健壮性:

如果用户在发送搜索请求后与服务器连接中断,在用户重新连接后并重新请求时,系统应快速将信息反馈给用户。

2)可维护性:

新的管理员应该可以在10分钟以内掌握关闭和开启服务器等基本操作。

3)运行环境可转换行:

任何装有浏览器的系统都应该可以访问服务器。

当服务器更换操作系统时,在部署好Java环境后应可以马上运行。

2程序设计

2.1总体设计思想

本软件通过客户端浏览器,用户设置自己的爱好,并通过http传给服务器,服务器接收信息执行响应操作。

2.3程序设计总体框图

系统功能层次模块图如图1-2所示

图表1-2系统层次模块图

2.4程序详细设计

(1)RecordDAOProxy类UML设计

 

(2)IRecordDAO类设计说明

 

(3)DatabaseConnection类设计说明

 

(4)RecordDAOImpl类设计说明

(5)Record类设计说明

 

(6)HtmlHelper类设计说明

 

(7)SpiderThread类设计说明

 

(8)DAOFactory类设计说明

 

(9)Page类UML设计

 

(10)测试类UML设计

 

(7)主体程序UML类图

源代码部分:

1RecordDAOProxy.java代码

importjava.util.ArrayList;

importcom.engine.dao.impl.RecordDAOProxy;

importcom.engine.po.Record;

importcom.engine.util.HtmlHelper;

/**

*@author

*/

publicclassResultController{

privateResultController(){}

privatestaticResultControllerresultController;

/**

*@returnResultController

*/

PublicstaticsynchronizedResultControllergetResultController(){

if(resultController==null){

resultController=newResultController();

}

returnresultController;

}

/**

*@paramkeyWord

*@returnRecord

*@throwsException

*/

publicArrayListqueryResult(StringkeyWord)throwsException{

String[]keyWords=keyWord.split("\\s");

ArrayListlist=newArrayList();

RecordDAOProxyrecordDao=null;

for(inti=0;i

keyWord=keyWords[i];

recordDao=newRecordDAOProxy();

list.addAll(recordDao.getRecord("WHERErecordTitleLIKE\'%"+keyWord+"%\'"));

recordDao=newRecordDAOProxy();

list.addAll(recordDao.getRecord("WHERErecordContentLIKE\'%"+keyWord+"%\'"));

}

returnlist;

}

}

②User.java代码

importjava.io.Serializable;

publicclassUserimplementsSerializable{

privatestaticfinallongserialVersionUID=5612649006026227700L;

privateStringno;

privateStringname;

privateIntegerage;

privateStringsex;

privateStringphone;

privateStringimagePath;

publicStringgetNo(){

returnno;

}

publicvoidsetNo(Stringno){

this.no=no;

}

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

publicIntegergetAge(){

returnage;

}

publicvoidsetAge(Integerage){

this.age=age;

}

publicStringgetSex(){

returnsex;

}

publicvoidsetSex(Stringsex){

this.sex=sex;

}

publicStringgetPhone(){

returnphone;

}

publicvoidsetPhone(Stringphone){

this.phone=phone;

}

publicStringgetImagePath(){

returnimagePath;

}

publicvoidsetImagePath(StringimagePath){

this.imagePath=imagePath;

}

}

③BusinessObject.java代码

importjava.util.List;

 

publicclassBusinessObject{

intcurrentPos;

User[]users;

PropertiesUtilproutil;

publicBusinessObject(){

currentPos=0;

proutil=newPropertiesUtil("config/telephone.dat");

users=getAllUsers();

}

publicUser[]getAllUsers(){

Listlist=proutil.getUsers();

User[]users2=newUser[list.size()];

for(inti=0;i

users2[i]=list.get(i);

}

returnusers2;

}

publicUserfirst(){

currentPos=0;

returnusers[currentPos];

}

 

publicUserprevious(){

if(currentPos>0){

currentPos--;

}

returnusers[currentPos];

}

 

publicUsernext(){

if(currentPos

currentPos++;

}

returnusers[currentPos];

}

 

publicUserlast(){

currentPos=users.length-1;

returnusers[currentPos];

}

 

publicvoidsaveUser(Useruser){

proutil.save(user);

users=getAllUsers();

currentPos=Integer.parseInt(user.getNo())-1;

}

}

④PropertiesUtil.java代码

importjava.io.File;

importjava.io.FileInputStream;

importjava.io.FileNotFoundException;

importjava.io.FileOutputStream;

importjava.io.IOException;

importjava.io.ObjectInputStream;

importjava.io.ObjectOutputStream;

importjava.util.ArrayList;

importjava.util.List;

importjavax.swing.JOptionPane;

publicclassPropertiesUtil{

privateObjectInputStreamois=null;

privateObjectOutputStreamoos=null;

privateListlstUsers=newArrayList();

privateStringfileName=null;

publicPropertiesUtil(StringfileName){

this.fileName=fileName;

}

@SuppressWarnings("unchecked")

publicListgetUsers(){

try{

ois=newObjectInputStream(newFileInputStream(fileName));

lstUsers=(ArrayList)ois.readObject();

ois.close();

}catch(FileNotFoundExceptione){

intRecord();

}catch(ClassNotFoundExceptione){

e.printStackTrace();

}catch(IOExceptione){

e.printStackTrace();

}

returnlstUsers;

}

publicvoidsave(Useruser){

try{

oos=newObjectOutputStream(newFileOutputStream("config/telephone.dat"));

inti;

for(i=0;i

if(user.getNo().equals(lstUsers.get(i).getNo())){

lstUsers.set(i,user);//修改

break;

}

}

if(i>=lstUsers.size()){

lstUsers.add(user);//新增

}

oos.writeObject(lstUsers);

oos.flush();

oos.close();

}catch(IOExceptione){

e.printStackTrace();

}

}

/**

*若记录文件不存在,则初始化记录文件

*/

privatevoidintRecord(){

//创建文件

Filef=newFile("config/telephone.dat");

try{

f.createNewFile();

}catch(IOExceptione1){

e1.printStackTrace();

}

//新建一条记录

Useru=newUser();

u.setNo("1");

u.setName("");

u.setAge(0);

u.setSex("F");

u.setPhone("");

u.setImagePath("");

try{

oos=newObjectOutputStream(newFileOutputStream("config/telephone.dat"));

lstUsers.add(u);

oos.writeObject(lstUsers);

oos.close();

JOptionPane.showMessageDialog(null,"请重启本程序");

System.exit(0);

}catch(FileNotFoundExceptione1){

e1.printStackTrace();

}catch(IOExceptione1){

e1.printStackTrace();

}

}

}

⑤Test.java代码

importjava.io.FileNotFoundException;

importjava.io.FileOutputStream;

importjava.io.IOException;

importjava.io.ObjectOutputStream;

importjava.util.ArrayList;

importjava.util.List;

 

publicclassTest{

privateObjectOutputStreamoos=null;

privateListlstUsers=newArrayList();

Useru1=null;

Useru2=null;

Useru3=null;

publicTest(){

try{

oos=newObjectOutputStream(newFileOutputStream("config/telephone.dat"));

u1=newUser();

u1.setNo("1");

u1.setName("人物1");

u1.setSex("M");

u1.setAge(11);

u1.setPhone("111");

u1.setImagePath("config/demo8.jpg");

lstUsers.add(u1);

u2=newUser();

u2.setNo("2");

u2.setName("人物2");

u2.setSex("F");

u2.setAge(22);

u2.setPhone("222");

u2.setImagePath("config/demo4.jpg");

lstUsers.add(u2);

u3=newUser();

u3.setNo("3");

u3.setName("人物3");

u3.setSex("F");

u3.setAge(33);

u3.setPhone("333");

u3.setImagePath("config/demo2.jpg");

lstUsers.add(u3);

}catch(FileNotFoundExceptione){

e.printStackTrace();

}catch(IOExceptione){

e.printStackTrace();

}

}

publicstaticvoidmain(String[]args){

Testt=newTest();

try{

t.oos.writeObject(t.lstUsers);

t.oos.close();

}catch(IOExceptione){

e.printStackTrace();

}

}

}

⑥publicclassResult{

privateStringrecordLink;

privateStringrecordTitle;

privateStringrecordAbstractContent;

privateStringkeywordTimes;

publicStringgetRecordLink(){

returnrecordLink;

}

publicvoidse

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 教育学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1