简介:本项目采用了基本的springboot+vue设计的在线小说系统。详情请看截图。经测试,本项目正常运行。本项目适用于Java毕业设计、课程设计学习参考等用途。
特别说明:本系统设计网络爬虫,遵循爬虫规则,此项目用于学习,参考,借鉴等用途,如有侵权,请联系站长删除此部分功能。
项目描述
项目名称 | SpringBoot+Vue在线小说系统 |
---|---|
源码作者 | LHL |
项目类型 | Java EE项目 (前后分离) |
当前版本 | 1.0 |
系统角色 | 多角色 |
项目架构 | B/S架构 |
主要技术 | Java、servlet、springboot、mysql、maven、vue+elementui |
运行环境 | win10/win7/JDK1.8/ |
开发工具 | MyEclipse/IDEA ,默认IDEA |
数据库 | MySQL5.5/5.7/8.0+ |
数据库表 | 4+ |
构建工具 | maven |
是否有注释 | 有 |
是否有演示视频 | 有 |
是否有文档论文相关 | 有 |
主要功能如下
- 管理员维护系统信息
- 客户端小说首页,分类,检索,章节,小说详情,上一章下一章目录等功能
博小说首页
小说列表
章节列表
章节详情
后台登录
后台主页
管理小说列表
小说章节列表
章节编辑
小说同步
小说同步
* 小说同步
* @param obj
* @return
*/
@PostMapping("/sync")
public ApiResp syncOtherBook(@RequestBody JSONObject obj){
String seed = obj.getString("seed");
if (!seed.startsWith("https://www.netprint101.com")){
return ApiResp.resp(false, "请输入笔趣阁小说外链", null);
}
Book b=new Book();
b.setCategoryId(9);
bookService.save(b);
System.out.println("================小说保存=============");
new Thread(() -> {
System.out.println("===============小说异步任务执行===============");
JSONObject object = Crawler4jController.crawlerGetData(seed, b.getId(),b.getCategoryId());
Book book = object.getObject("book", Book.class);
List<Chapter> list = object.getObject("infos", List.class);
bookService.updateById(book);
chapterService.saveBatch(list);
System.out.println(book);
System.out.println("===============小说同步完成==============");
System.out.println("\n\n\n\n");
}).start();
return ApiResp.resp(true, "同步任务异步执行中,稍后列表查看", null);
}
爬取解析
/**
* 当一个页面被提取并准备好被你的程序处理时,这个函数被调用。
*/
@Override
public void visit(Page page) {
String url = page.getWebURL().getURL();// 获取url
System.out.println("URL: " + url);
if (page.getParseData() instanceof HtmlParseData) {// 判断是否是html数据
HtmlParseData htmlParseData = (HtmlParseData) page.getParseData(); 强制类型转换,获取html数据对象
String text = htmlParseData.getText();//获取页面纯文本(无html标签)
String html = htmlParseData.getHtml();//获取页面Html
Set<WebURL> links = htmlParseData.getOutgoingUrls();// 获取页面输出链接
System.out.println("纯文本长度: " + text.length());
System.out.println("html长度: " + html.length());
System.out.println("链接个数 " + links.size());
String title = htmlParseData.getTitle();
System.out.println(title);
WebURL webURL = page.getWebURL();
Document document = Jsoup.parse(html, String.valueOf(Parser.xmlParser()));
Elements read_txt = document.getElementsByClass("read_txt");
//进入详情页面进行处理
if (read_txt.size()>0){
String anchor=webURL.getAnchor();
String content=read_txt.get(0).html();//文章内容
int i = url.lastIndexOf('/');
int i1 = url.lastIndexOf(".");
String s = url.substring(i+1, i1);
Chapter info=new Chapter();
info.setContent(content);
info.setTitle(anchor);
info.setSort(Integer.valueOf(s));
cmp.put(webURL.getURL(),info);
}else {
//书籍本身获取
Elements elementsByTag = document.getElementsByTag("meta");
for (Element e:elementsByTag){
if (e.attr("name").equals("description")){
String description = e.attr("content");
book.setDescription(description);
}
// <meta property="og:image" content="https://www.netprint101.com/image/newbq_11940.jpg"/>
if (e.attr("property").equals("og:image")){
String img = e.attr("content");
book.setIcon(img);
}
}
Elements select = document.select(".intro.img img");
Elements select2 = document.select(".intro img");
if (select2.size()>0){
Element element = select2.get(0);
String onerror = element.attr("onerror");
if (StringUtil.isNotEmpty(onerror)){
book.setIcon("https://www.netprint101.com/image/newbq_219352.jpg");
}else {
String src = element.attr("src");
book.setIcon("https://www.netprint101.com"+src);
}
}
Elements elements = document.select(".details.z h2");
Elements elements2 = document.select(".details.z .p");
String bookName = elements.get(0).text();
Elements byTag = elements2.get(0).getElementsByTag("i");
String author = byTag.get(0).text();
String updateTime = byTag.get(1).text();
author=author.substring(author.lastIndexOf(":")+1);
updateTime=updateTime.substring(updateTime.lastIndexOf(":")+1);
book.setBookName(bookName);
book.setAuthor(author);
// book.setIcon("https://www.netprint101.com/image/newbq_219352.jpg");
book.setOriginHref(url);
book.setUpdateTime(updateTime);
}
}
}
更多博客和源码请到微信公众号:源码plus
结尾
与其担心未来,不如现在好好努力。这条路上,只由奋斗才能给你安全感。不要轻易把梦想寄托在某个人身上,也不要太在乎身旁的耳语,因为未来是你自己的,只有你自己才能给你自己最大的安全感。