Java爬虫入门(六)——课程设计报告

Java高级程序设计课程设计任务书
一 题目
Java并发爬取静态小说系统
二 目的与要求:
2.1目的:
JAVA爬虫并发爬取静态小说网站的全部小说:
https://www.bookbao8.com/BookList-c_0-t_2-o_1.html

2.2要求:
(1)掌握Java高级程序设计的基础知识,爬虫知识,线程池连接池和正则表达式匹配以及相关多线程内容进行Java爬虫.
(2)将Java和爬虫的理论知识和实际项目结合起来,熟练掌握Eclipse等开发工具,锻炼应用开发能力.
要求:
(1):要求利用软件工程的方法来完成系统的设计
(2):要求学生掌握Java爬虫的方法,熟练使用正则表达式
(3):能够进行基本的多线程操作
(4):能够完成基本的网络通信
最终实现目标:使用JAVA爬虫并发爬取静态小说网站的全部小说

三 主要内容及技术要求
3.1 运行环境:

  1. Eclipse
    3.2所需知识:
  2. HttpClient请求
  3. 连接池并发
  4. 线程池并发
  5. 多线程并发
  6. 正则表达式
  7. IO流保存本地文件
  8. 需要的jar包管理:

四 主要参考资料

  1. Effective Java(第2版),(美)Joshua Bloch(约书亚•布洛赫), 电子工业出版社, 2016.3.

2.自己动手写网络爬虫, 罗刚 / 王振东 , 清华大学出版社, 2010.10
3.Java编程思想, (第4版) [美] Bruce Eckel, 机械工业出版社, 2007-6

概述:

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动得抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。搜索引擎(Search Engine),例如传统的通用搜索引擎如AltaVista,Yahoo!和Google等,作为一个辅助人们检索信息的工具成为用户访问万维网的入口和指南。但是,这些通用性搜索引擎也存在着一定的局限性,为了解决上述问题,定向抓取相关网页资源的聚焦爬虫应运而生。

同学一:
五 需求分析:
5.1系统业务分析
爬取指定页面小说的小说信息是本系统的业务主线.业务目标是访问指定页面小说并且下载点击率最多板块的所有小说信息以及章节目录.本系统设计时访问静态页面并且爬取小说信息不需要会员登录,直接在浏览器输入网站地址即可.一个页面内有多本小说,而且分页.综合分析核心业务如图2-1所示。

图2-1系统核心业务主线图

六 系统分析:
6.1 分析系统功能:
6.1.1并发处理分页功能:
并发处理分页线程类AddBookUrlThread调用run方法,创建GetContent类,调用GetContent类的getCOntent方法获得分页信息.根据分页信息将爬取分页信息的URL地址传入到线程池中Pool的静态方法execute中,可以实现多并发处理分页小说信息.如图2-5所示 图2-5并发处理分页时序图

七 系统设计
7.1 类属性和方法的命名规则

7.1.1 类属性命名规则:

对于属性的命名,要求属性的名称简单易懂,做到见名知意。具体例子如下所示:

public class Book {
private String book_name; // 书本名字
private String author; // 作者
private String type; // 类型
private String status; // 连载状态
private String update_time; // 更新时间
private String book_Introduction; // 书本简介
private String url; // 书本链接
}

7.1.2 方法请求的命名规则:
public class AdBookChaptersThread implements Runnable {
public boolean getBookInformation(Book book) {}
}

7.2 系统类设计
7.2.1 实体类相关设计:

与小说相关的实体类是小说类,应该设置为Book,包含如下属性:
book_name; // 书本名字
author; // 作者
type; // 类型
status; // 连载状态
update_time; // 更新时间
book_Introduction; // 书本简介
url; // 书本链接
以上信息都可以通过String字符串存储信息,
为了满足面向对象编程的操作,应该将实体类属性设置为private访问属性,通过set和get方法获取和设置属性值.这样子有利于封装属性,外部无法轻易修改实体类的属性,保证了安全性和标准性.

7.2.2 并发处理分页信息类相关设计:

AddBookUrlThread类实现Runnable接口,是一个线程类,设计为线程类的目的是为了并发操作.包含url使用String字符串存储,保存传递的分页URL地址.包含GetContent类可以获取分页中的小说息.AddBookUrlThread的构造器接收String的地址参数,保存传入的分页地址.重写run方法,其中调用content类的getContent方法获取分页信息,使用正则表达式获取该分页信息上的所有小说信息,如书名以及章节链接,通过循环将爬取具体小说信息的线程加入到线程池.
八 系统实现:
8.1 爬取指定url的html源码和总页数:

  1. 包含 BufferedReader缓冲流属性提取爬取的html内容.
  2. 包含 StringBuilder可修改的字符串动态追加提取到的html内容.
  3. getContent()方法通过 URI和HttpGet 链接指定网络,将连接HttpGet加入到连接池中以便下次使用.创建缓冲流 BufferedReader按行读取内容,循环读取内容并且 使用StringBuilder动态字符串追加,并返回指定url的html源码.
  4. PageAll()方法通过正则表达式:"/共(\d+?)页"返回指定url中html内容中的总页数.

public class GetContent {
private BufferedReader bufferedReader = null;
private StringBuilder conTent = null;
/**
* 爬取指定网页的全部内容
*
* @param urlin
* 传入地址
* @return 爬取指定网页的全部内容
* @throws URISyntaxException
* @throws IOException
/
public String getContent(String urlin) throws URISyntaxException, IOException {
// 获取爬取网络的地址
URI url = new URIBuilder().setScheme(“https”).setHost(urlin).build();
conTent = new StringBuilder();
HttpGet httpGet = new HttpGet(url);
/

* httpGet.setHeader(“User-Agent”,
* “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36”
* );
/
CloseableHttpResponse httpResponse = null;
try {
httpResponse = Pool.httpClient.execute(httpGet);
HttpEntity entity = httpResponse.getEntity();
// 获取编码信息
InputStream is = entity.getContent();
String line = “”;
// 转换为缓冲流,提高效率,可以按行读取
bufferedReader = new BufferedReader(new InputStreamReader(is, “utf-8”));
while ((line = bufferedReader.readLine()) != null) {
conTent.append(line);
}
is.close();
return conTent.toString();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
if (httpResponse != null) {
httpResponse.close();
}
}
}
/
*
* 爬取指定内容中的总分页数
*
* @param text
* 指定网页源码内容
* @return 总分页数
*/
public String PageAll(String text) {
String regex = “/共(\d+?)页”;
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
boolean is = matcher.find();
if (is) {
return matcher.group(1);
} else {
return null;
}
}
}

8.2 系统入口类:Main
Main类包含 GetAll方法()下载传入地址的全部书籍,GetAll方法()创建 GetContent实体类调用其 getContent()方法,再加入到并发爬取分页线程池.main()方法是系统入口,需要解决异常,抛出Exception,设置爬取的网页地址"www.bookbao8.com/BookList-c_0-t_2-o_1.html",通过 GetAll()方法将爬取小说的线程加入到线程池中,创建分页线程池和小说线程池,调用Pool.executorServicePage的shutdown()方法//等待加入线程全部执行完毕.通过每10秒判断是否全部结束,如果成功结束即显示”获取小说书名信息和链接成功!”反之则报错.

public class Main {

/** 下载urlFirst网页中的全部书籍
* @param urlFirst
* @throws URISyntaxException
* @throws IOException
* @throws InterruptedException
*/
public static void GetAll(String urlFirst) throws Exception {
GetContent content = new GetContent();
String text = content.getContent(urlFirst);
String pageTotalString = content.PageAll(text);<

  • 2
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值