程序员用jfinal一言不合撸出小说网站,从此看小说无烦恼


故事背景:
因为平时上班摸鱼用手机看小说,那些小说网站总是会挂载各种yellow广告,要是被同时看到就不好了,而且有时候点击下一章加载超级慢(我网络是正常的),于是乎就有了下面事情。

开始干饭:
首先要有自己云主机和域名,然后有一定java开发基础,推荐使用jfinal极速开发,真的很快。

项目架构:jfinal4.9+layui+mysql8


我的想法
爬取小说网站上面想要的书籍,存入到mysql数据库里面,然后把这一个java项目打包部署到云虚拟机上面,这样以后我用手机就可以随时随地愉快的看小说了,从根源上杜绝各种广告等等。个人后期测试使用,速度超级流畅,网络请求没有一丁点卡顿,可能我数据量比较少,并发数就我一个人,所以服务器压力也小。

下面只贴出核心代码。

1、找一个小说网站
要爬取数据:该书籍的所有目录和章节内容
查看要爬取的书籍目录,如下图,
在这里插入图片描述
根据该目录html结构,我们java代码就可以这样子写:

public Document getDocument(String url){
		//获取请求链接
		Connection conn=Jsoup.connect(url).timeout(5000);
		//请求头设置
		conn.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
		conn.header("Accept-Encoding", "gzip, deflate, sdch");
		conn.header("Accept-Language", "zh-CN,zh;q=0.8");
		conn.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36");

		try {
			return conn.get();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}
	//获取所有章节标题和链接//url为该小说目录网址
		public void getAllTitle(String url) {
		    int i=0;
			Document doc=util1.getDocument(url);//获取document对象
			Element ml=doc.getElementById("list");//获取目录列表
			Elements allA=ml.select("a");//获取a标签
			for(Element e:allA) {
				System.out.println("该章节的标题:"+e.html());
				System.out.println("该章节的url:"+e.attr("href"));
				++i;
			}
			System.out.println("一共采集到:"+i);
		}

java项目采用jsoup爬取网页内容,相关语法请自行查看官网,jsoup官方文档

下面给出maven依赖

<dependency>
		    <groupId>org.jsoup</groupId>
		    <artifactId>jsoup</artifactId>
		    <version>1.13.1</version>
		</dependency>


采集结果:可以看到已经成功了,那你就可以把数据存入数据库中
在这里插入图片描述

接下来采集文章正文:
分析正文html结构,
在这里插入图片描述

然后编写采集代码

public void getAllContent(String url) {
		Document doc=util1.getDocument(url);//获取document对象,url为该正文链接
		Element ml=doc.getElementById("content");//获取正文
		System.out.println("当前文章内容:"+ml.toString());
	}


采集结果:
在这里插入图片描述
可以看到已经采集成功,这只是采集一条文章正文,自行修改代码,采集所有文章正文


出现问题:
因为循环大量采集所有文章内容,有时候会出现503错误,频繁错误,导致采集效率低下。采集方法加入代码 Thread.sleep(1 * 1000);
让采集方法一秒执行一次,经测试,没有再出现过503错误。
但是又有新的问题:
1、如果并行执行2个采集文章正文方法,503错误会出现。
2、如果只执行一个采集方法,一秒一篇正文,一部小说3000篇章节就需要50分钟,时间开销大,采集效率低,要知道3000篇章节以上的小说都是普遍存在的。我上面采集那部小说目录章节就已经是3369章,所有正文采集就需要56分钟。

3、后来测试,设置代理ip,更换浏览器标识都没有用。

4、当数据库一个表里面有1万条以上数据时,发现点击文章上下条,出现5秒响应,后期得优化一下代码。


最后看看效果:

PC端:
小说目录:
在这里插入图片描述

正文:
正文
移动端:
小说目录:
1.jpg


正文:
在这里插入图片描述


评论区

山东小木

2021-11-08 16:08

爬虫一时爽,牢饭吃得香 谨慎爬虫哈 如果是付费资源

yuwen01

2021-11-08 16:13

@山东小木 小说网站说明: 本站所有小说为转载作品,所有章节均由网友上传,转载至本站只是为了宣传本书让更多读者欣赏。

yuwen01

2021-11-08 16:14

@山东小木 应该不会被请吃牢饭吧,

yuwen01

2021-11-08 17:03

关于数据库查询慢的问题,通过创建对应索引轻松解决。

山东小木

2021-11-08 18:02

慎重就行

ward

2021-11-25 14:48

java搞爬虫不多,我用python爬取mzt等网站上的图片,用的也是mysql,单单是用来保存url的表里都好几千万行记录了, 最后爬取到的图片也有三四千万张, 中间为了解决数据库的瓶颈做了好多的优化调整, 最高峰时同时对三十多个网站启动了差不多200个线程去爬, 而且数据库还挺住了

yuwen01

2021-11-26 17:37

热门分享

扫码入社