SpringBoot+Vue在线小说系统

简介:本项目采用了基本的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
是否有注释
是否有演示视频
是否有文档论文相关

主要功能如下

  1. 管理员维护系统信息
  2. 客户端小说首页,分类,检索,章节,小说详情,上一章下一章目录等功能

博小说首页

Description

小说列表

Description

章节列表

Description

章节详情

Description

后台登录

后台主页

Description

管理小说列表

Description

小说章节列表

Description

章节编辑

Description

小说同步

Description

小说同步

     * 小说同步
     * @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

结尾

与其担心未来,不如现在好好努力。这条路上,只由奋斗才能给你安全感。不要轻易把梦想寄托在某个人身上,也不要太在乎身旁的耳语,因为未来是你自己的,只有你自己才能给你自己最大的安全感。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值