吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 15853|回复: 95
收起左侧

[Java 原创] 用爬虫写的小说漫画网站(多线程,已上线)

    [复制链接]
三木猿 发表于 2020-9-4 09:58
本帖最后由 三木猿 于 2020-9-10 12:34 编辑

jar包版:https://wws.lanzouj.com/ilcdzght3yj密码:4vmx
只是想用的直接拿jar包吧java -jar SanMuYuanBook-1.0-SNAPSHOT.jar 运行就行,然后在浏览器localhost:80访问
exe版:https://wws.lanzouj.com/ioi0qghw26d密码:b3z1
之前发的帖子沉了,这次希望别沉了,好歹写了很久的,嘤嘤嘤~项目放在了码云上,需要请自行下载(随便霍霍)https://gitee.com/sen_yang/SanMuYuanBook
1.首先是java目录,
com\aaa\config\SSLHelper.java这个是用来忽略网站安全证书的,不加他的话,就没次都需要下载要爬取的网站的安全证书,很麻烦,所以就干脆全部忽略。
com\aaa\config\ThreadExecutorConfig.java用来配置线程池
com\aaa\controller\BookController.java关于小说的各种操作
com\aaa\controller\CartoonController.java关于漫画的各种操作
com\aaa\data这个包获取数据的操作,项目核心都在这
com\aaa\util\DataProcessing.java用来数据处理,里面只有个分割list的方法
com\aaa\util\Download.java用来调用浏览器下载
com\aaa\util\GetDocument.java传入网址获取document对象
com\aaa\util\ZipUtils.java用来将漫画打包为zip
image.png
2.然后是前端
index是小说主界面
cartoonIndex是漫画主界面
Catalogue结尾的是目录界面
read开头的是阅读界面
image.png
代码都在项目里面自己看吧,另附运行截图
漫画模块截图
image.png
image.png
image.png

小说模块截图
image.png
image.png

image.png
2.我电脑上运行时所有页面加载速度平均为3s,网速好不到一秒,很多地方用到了线程池,不过只用了定长的线程池
3.项目已经部署在腾讯云服务器,http://49.235.253.131,部署在云上的加载速度慢,这个也是没办法的,咱只是个穷逼程序员,买云服务器都是学生优惠价
项目部分代码
[Java] 纯文本查看 复制代码
package com.aaa.data;

import com.aaa.config.SSLHelper;
import com.aaa.dto.BookCatalogueDto;
import com.aaa.entity.BookCatalogue;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static com.aaa.util.DataProcessing.splitList;

/**
 * [url=home.php?mod=space&uid=686208]@AuThor[/url] 杨森
 * [url=home.php?mod=space&uid=1248337]@version[/url] 1.0
 * @Title: BookCatalogue
 * [url=home.php?mod=space&uid=686237]@date[/url] 2020/8/7 15:39
 */
public class BookCatalogueDB {

    private static ExecutorService executorService;

    public static List<BookCatalogueDto> setDataSource(String dataSource, String bookCod,ExecutorService executorService) {
        BookCatalogueDB.executorService =executorService;
        SSLHelper.init();
        if ("biquge5200".equals(dataSource)) {
            return biquge5200(bookCod);
        } else if ("biquge".equals(dataSource)) {
            return biquge(bookCod);
        }
        return null;
    }

    private static List<BookCatalogueDto> biquge5200(String bookCod) {
        try {
            Map<Integer,List<BookCatalogueDto>> bookCatalogueDtoMaps = new HashMap<>(3);
            Pattern pattern = Pattern.compile("<a\\s*href=\"?([\\w\\W]*?)\"?[\\s]*?[^>]>([\\s\\S]*?)(?=</a>)");
            Document document = Jsoup.connect("https://www.biquge5200.com/" + bookCod + "/").get();
            Elements dd = document.getElementsByTag("dd");
            Map<Integer, List<Element>> integerListMap = splitList(dd, 3);
            CountDownLatch latch=new CountDownLatch(3);
            for (int i = 0; i < 3; i++) {
                final int ins=i;
                executorService.execute(() -> {
                    bookCatalogueDtoMaps.put(ins,get(integerListMap.get(ins), bookCod, document, pattern));
                    latch.countDown();
                });
            }
            latch.await();
            List<BookCatalogueDto> bookCatalogueDtos=new ArrayList<>(dd.size());
            for (int i = 0; i < 3; i++) {
                bookCatalogueDtos.addAll(bookCatalogueDtoMaps.get(i));
            }
            return bookCatalogueDtos;
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            executorService.shutdown();
        }
        return null;
    }

    public static List<BookCatalogueDto> get(List<Element> dd, String bookCod, Document document, Pattern pattern) {
        List<BookCatalogueDto> bookCatalogueDtos = new ArrayList<>(dd.size());
        Element imgurl = document.getElementById("fmimg");
        Element intro = document.getElementById("intro");
        Element info = document.getElementById("info");
        Element child = info.child(1);
        String h1 = info.select("h1").text();
        for (int i = 0; i < dd.size(); i++) {
            Element element = dd.get(i);
            BookCatalogueDto bookCatalogueDto = new BookCatalogueDto();
            BookCatalogue bookCatalogue = new BookCatalogue();
            Node node = element.childNode(0);
            for (Node e : element.childNodes()) {
                if (!"".equals(e.toString())) {
                    node = e;
                }
            }
            bookCatalogueDto.setCatalogueName(node.childNode(0).toString());
            String s1 = node.toString();
            Matcher matcher = pattern.matcher(s1);
            if (matcher.find()) {
                String nameCodeUrl = matcher.group(1);
                String insStr = nameCodeUrl.substring(nameCodeUrl.lastIndexOf("/") + 1, nameCodeUrl.lastIndexOf("."));
                bookCatalogueDto.setCatalogueCod(Integer.parseInt(insStr));
            }
            bookCatalogueDto.setBookName(h1);
            bookCatalogueDto.setBookIntro(intro.text());
            for(Node n :imgurl.childNodes()){
                if(n.toString().matches("(.*)img(.*)")){
                    bookCatalogueDto.setBookImage(imgurl.childNode(0).toString());
                }
            }
            bookCatalogueDto.setBookCod(bookCod);
            bookCatalogueDto.setBookAuthor(child.text().replace("作 者:",""));

            bookCatalogueDtos.add(bookCatalogueDto);
            if (i + 1 < dd.size()) {
                Node node1 = dd.get(i + 1).childNode(0);
                Matcher matcher1 = pattern.matcher(node1.toString());
                if (matcher1.find()) {
                    String nameCodeUrl = matcher.group(1);
                    String insStr = nameCodeUrl.substring(nameCodeUrl.lastIndexOf("/") + 1, nameCodeUrl.lastIndexOf("."));
                    bookCatalogue.setNextCode(Integer.parseInt(insStr));
                }
            }

        }
        return bookCatalogueDtos;
    }

    private static List<BookCatalogueDto> biquge(String bookCod) {
        try {
            Pattern pattern = Pattern.compile("<a\\s*href=\"?([\\w\\W]*?)\"?[\\s]*?[^>]>([\\s\\S]*?)(?=</a>)");
            Document document = Jsoup.connect("https://www.biquge.com/" + bookCod + "/").get();

            Map<Integer,List<BookCatalogueDto>> bookCatalogueDtoMaps = new HashMap<>(3);
            Elements dd = document.getElementsByTag("dd");
            Map<Integer, List<Element>> integerListMap = splitList(dd, 3);
            CountDownLatch latch=new CountDownLatch(3);

            for (int i = 0; i <3; i++) {
                final int ins=i;
                executorService.execute(()->{
                    bookCatalogueDtoMaps.put(ins,get(integerListMap.get(ins), bookCod, document, pattern)) ;
                    latch.countDown();
                });
            }
            latch.await();
            List<BookCatalogueDto> bookCatalogueDtos=new ArrayList<>(dd.size());
            for (int i = 0; i < 3; i++) {
                bookCatalogueDtos.addAll(bookCatalogueDtoMaps.get(i));
            }
            return bookCatalogueDtos;
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            executorService.shutdown();
        }
        return null;
    }
}

免费评分

参与人数 38威望 +1 吾爱币 +42 热心值 +34 收起 理由
dingfeifei + 1 + 1 鼓励转贴优秀软件安全工具和文档!
d111 + 1 我很赞同!
13563655291 + 1 + 1 求大佬根据可以单机自动更新的吧
zhuhaodong + 1 + 1 可以的,学习学习
克劳德格林蓝多 + 1 我很赞同!
joe077 + 1 + 1 谢谢@Thanks!
未来丨 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Tiger丶Z + 1 + 1 热心回复!
狂笑一君 + 1 + 1 用心讨论,共获提升!
dongdongmian + 1 谢谢@Thanks!
bhqt + 1 我很赞同!
WAlitudealiy + 1 + 1 谢谢@谢谢
DX1186 + 1 用心讨论,共获提升!
nixingge + 1 + 1 用心讨论,共获提升!
skjl128 + 1 + 1 谢谢@Thanks!
丨架构师丨 + 1 + 1 谢谢@Thanks!
汐故辞 + 1 谢谢@Thanks!
MrScreamer + 1 + 1 热心回复!
ibook + 1 + 1 用心讨论,共获提升!
AsuraK0701 + 1 + 1 用心讨论,共获提升!
18269055653 + 1 + 1 谢谢@Thanks!
hyzwxdy + 1 + 1 用心讨论,共获提升!
volcanst + 1 + 1 谢谢@Thanks!
djdjup + 1 + 1 用心讨论,共获提升!
梦里余杭 + 1 + 1 用心讨论,共获提升!
hnnw113300 + 1 + 1 热心回复!
xxjackiexx + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
默君 + 1 我很赞同!
我是一个外星人 + 1 热心回复!
苏紫方璇 + 1 + 10 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
hunterking + 1 + 1 谢谢@Thanks!
老司机微风恋 + 1 谢谢@Thanks!
涛行 + 1 我很赞同!
duduuuuu + 1 + 1 谢谢@Thanks!
Aleshaaaa + 1 + 1 谢谢@Thanks!
一块玻璃 + 1 + 1 我很赞同!
wkfy + 2 + 1 希望有python代码,java还没接触过,哈哈
大山的子孙 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 三木猿 发表于 2020-9-4 10:13
不会java的小伙纸,我之前的帖子有python版爬虫的教学
 楼主| 三木猿 发表于 2020-9-4 10:02
我就不信了,我随便写的python爬虫能火,咋个认真写的java网站不能火,java的弟兄们可比python多多了吧,满意的记得点赞评论
 楼主| 三木猿 发表于 2020-9-17 15:34
xxjackiexx 发表于 2020-9-17 15:26
楼主,有个建议,不知道是否过分,就是可不可以把小说源地址,写到配置文件里面,然后后续直接维护配置文件 ...

这样是比较规范点,当前项目写的不是特别完美,不能兼容很多的数据源,每新增一个数据源都挺麻烦的,所以就只有两个
平常芯 发表于 2020-9-4 10:09
JAVA是世界上最好的语言
aaa6668 发表于 2020-9-4 10:05
感谢楼主分享
simdabo 发表于 2020-9-4 10:07
感谢楼主分享。。
年轻的旅途 发表于 2020-9-4 10:08
这个能自动采集吗
 楼主| 三木猿 发表于 2020-9-4 10:09

现看现爬,实时的,没保存到服务器
方小云 发表于 2020-9-4 10:10
太复杂了,看不懂啊,还是爬虫好
 楼主| 三木猿 发表于 2020-9-4 10:12
三木猿 发表于 2020-9-4 10:09
现看现爬,实时的,没保存到服务器

数据源固定不能自己设置爬取的网站,之后可能会继续改成自己设置数据源
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-22 16:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表