java小说目录提取_完整Java爬取起点小说网小说目录以及对应链接

2023-11-05

完整Java爬取起点小说网小说目录以及对应链接

完整Java爬取起点小说网小说目录以及对应链接

(第一次使用markdown写,其中的排版很不好,望大家理解)

?? 因为最近有一个比赛的事情,故前期看了看黄大神的webmagic框架,无奈之时用时不会正则表达式的使用,临近交作品时间节点,突击看了看Java自带的一个框架,JSOUP框架,大概是三天就写好了这个小爬虫。具体如下:

?时间的安排:

周六看了一天jsoup文档

周日用Java的三大框架敲了一天打代码

周一课余时间内改了改其中的bug,周一晚上完美运行了

?下面说说具体的思路安排

采用传统项目的三大框架,层层相扣,具有很高的扩展性,对后期项目的改进很好,这三层分别是:

Entity层(实体层)

Dao层(数据访问层)

Service层(业务逻辑层)

?用到的工具分别是:

eclipse

Maven

Mysql

? Entity层定义需要爬到的一些属性,比如小说中的id、小说的章节以及章节名、小说各个章节的链接等等。

package xuf.entity;

public class NovelAttribute {

private String id; // id

private String FictionName; // 小说名

private String FictionChapter; // 小说章节以及章节名

private String FictionUrl; // 章节链接

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getFictionName() {

return FictionName;

}

public void setFictionName(String fictionName) {

FictionName = fictionName;

}

public String getFictionChapter() {

return FictionChapter;

}

public void setFictionChapter(String fictionChapter) {

FictionChapter = fictionChapter;

}

public String getFictionUrl() {

return FictionUrl;

}

public void setFictionUrl(String fictionUrl) {

FictionUrl = fictionUrl;

}

public String toString() {

return "NovelAttribute [id=" + id + ",FictionName=" + FictionName + ", FictionChapter=" + FictionChapter + ","

+ " FictionUrl=" + FictionUrl + "]";

}

}

? dao层则是一些数据处理的内容,通过dao层将数据持久化到mysql数据库中.

package xuf.dao;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.List;

//封装数据持久化类

public class NovelDao {

public static final String driver_class = "com.mysql.jdbc.Driver";

public static final String driver_url = "jdbc:mysql://127.0.0.1/tarantula?useunicode=true&characterEncoding=utf8";

public static final String user = "root";

public static final String password = "root";

private static Connection conn = null;

private PreparedStatement pst = null;

private ResultSet rst = null;

/**

* Connection

*/

public NovelDao() {

try {

conn = NovelDao.getConnInstance();

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 单例模式 线程同步

*/

private static synchronized Connection getConnInstance() {

if (conn == null) {

try {

Class.forName(driver_class);

conn = DriverManager.getConnection(driver_url, user, password);

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

}

System.out.println("连接数据库成功");

}

return conn;

}

/**

* close

*/

public void close() {

try {

if (conn != null) {

NovelDao.conn.close();

}

if (pst != null) {

this.pst.close();

}

if (rst != null) {

this.rst.close();

}

System.out.println("关闭数据库成功");

} catch (SQLException e) {

e.printStackTrace();

}

}

/**

* query

*/

public ResultSet executeQuery(String sql, List sqlValues) {

try {

pst = conn.prepareStatement(sql);

if (sqlValues != null && sqlValues.size() > 0) {

setSqlValues(pst, sqlValues);

}

rst = pst.executeQuery();

} catch (SQLException e) {

e.printStackTrace();

}

return rst;

}

/**

* update

*/

public int executeUpdate(String sql, List sqlValues) {

int result = -1;

try {

pst = conn.prepareStatement(sql);

if (sqlValues != null && sqlValues.size() > 0) {

setSqlValues(pst, sqlValues);

}

result = pst.executeUpdate();

} catch (SQLException e) {

e.printStackTrace();

}

return result;

}

/**

* sql set value

*/

private void setSqlValues(PreparedStatement pst, List sqlValues) {

for (int i = 0; i < sqlValues.size(); i++) {

try {

pst.setObject(i + 1, sqlValues.get(i));

} catch (SQLException e) {

e.printStackTrace();

}

}

}

}

?Service层则是对涉及到的业务逻辑的封装。保存以及处理爬取到的需要的内容。service层包括两个类,分别是:

INovel类:

package xuf.service;

import xuf.entity.NovelAttribute;

public interface INovel {

public int SaveAttribute(NovelAttribute attribute);

}

NovelImpl类:

package xuf.service;

import java.util.ArrayList;

import java.util.List;

import xuf.dao.NovelDao;

import xuf.entity.NovelAttribute;

public class NovelImpl implements INovel {

public int SaveAttribute(NovelAttribute attribute) {

NovelDao novelDao = new NovelDao();

StringBuffer sql = new StringBuffer();

sql.append("insert into novel (`id`,`FictionName`,`FictionChapter`,`FictionUrl`)")

.append("VALUES (? , ? , ? , ?)");

List sqlValues = new ArrayList();

sqlValues.add(attribute.getId());

sqlValues.add("" + attribute.getFictionName());

sqlValues.add("" + attribute.getFictionChapter());

sqlValues.add("" + attribute.getFictionUrl());

int result = novelDao.executeUpdate(sql.toString(), sqlValues);

return result;

}

}

? 最后还得有一个主函数来启动整个爬虫。

package xuf.main;

import java.util.Date;

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.select.Elements;

import xuf.entity.NovelAttribute;

import xuf.service.INovel;

import xuf.service.NovelImpl;

public class SpiderNovel {

public static void main(String[] args) {

// 数据持久化对象,用于将信息存入数据库

INovel iNovel = new NovelImpl();

Long startTime, endTime;

System.out.println("小爬虫开始了。。。。。。。。。。。");

startTime = new Date().getTime();

Document document;

try {

document = Jsoup.connect("http://book.qidian.com/info/1006141474#Catalog").get();

//document = Jsoup.connect("http://book.qidian.com/info/1006693964#Catalog").get();

NovelAttribute novelAttribute = new NovelAttribute();

String fictionName = document.select("h1>em").text();

novelAttribute.setFictionName(fictionName);

Elements results = document.select("a[data-cid]");

for (Element e : results) {

String fictionChapter = e.text();

String fictionUrl = e.attr("abs:href");

novelAttribute.setFictionUrl(fictionUrl);

novelAttribute.setFictionChapter(fictionChapter);

iNovel.SaveAttribute(novelAttribute);

}

} catch (Exception e) {

e.printStackTrace();

}

endTime = new Date().getTime();

System.out.println("小爬虫结束了,用时" + (endTime - startTime) + "ms");

}

}

?最后给出爬到的数据库截图:

5608b0b8ba4e6839e2877f7c88d9e453.png

?完美的一次项目。最短时间,从接触到写出来,只要了三天时间,事实证明,一件事情,只要你想去做,完全是可以做出来的。这个项目还有一个不足的就是爬取的目标网址被写在代码里面写死了,不具有灵活性。最好是将这个部分的代码写在页面里面,然后通过dao层来处理页面输入的url。

完整Java爬取起点小说网小说目录以及对应链接相关教程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java小说目录提取_完整Java爬取起点小说网小说目录以及对应链接 的相关文章

  • cmake安装更新(解决cmake报错:CMake 3.8 or higher is required. You are running version 3.5.1)

    ubuntu16 04在安装libfreenect过程中 出现cmake报错 CMake 3 8 or higher is required You are running version 3 5 1 cmake3 5 1是在安装ubunt
  • Linux查看用户UID和所属组

    使用以下命令查看 id 用户名 如省略用户名代表查看当前用户的
  • SQL注入1——显注(重学)

    SQL注入 学习自 文章 201 A3 SQL注入 上 视频 农夫安全201 A3 sql注入技巧上2 SQL注入 SQL注入 前言 一 显注 1 判断 2 判断字段数量 3 获取数据库信息 4 获取表信息 5 获取列信息 6 获取表信息
  • 配置虚拟机,查看主机cpu个数

    打开 任务管理器 性能 资源监视器 CPU 即可查看 根据自身cpu个数不同分配虚拟机处理器个数 我这里是有8个cpu
  • LeetCode 高级 - 矩阵中的最长递增路径

    矩阵中的最长递增路径 给定一个整数矩阵 找出最长递增路径的长度 对于每个单元格 你可以往上 下 左 右四个方向移动 你不能在对角线方向上移动或移动到边界外 即不允许环绕 示例 1 输入 nums 9 9 4 6 6 8 2 1 1 输出 4
  • Idea+git push时候出现HTTP 413 错误

    Delta compression using up to 4 threads Compressing objects 100 2364 2364 done Writing objects 100 4329 4329 1 15 MiB 11
  • 【java】计算员工工资

    案例介绍 任务描述 某公司有多个部门 员工信息包含姓名 name 类型 type 部门 department 和底薪 basicSalary 其中员工的类型有三种 管理员 销售员和工人 公司财务部门工作人员每月要计算员工的实发工资 实发工资
  • Windows端高仿超级逼真Mac系统方法

    简介 MyDock是一款完全免费的高仿Mac桌面的主题软件 软件仿造Mac系统桌面高达95 以上的相似度 不管是主题样式 界面 功能 操作方式 都达到了仿造Mac系统的效果 Mac系统有的功能 这里基本上都有 如Dock图标的鱼眼放大效果
  • idea显示连接https://start.spring.io连接问题

    表示尴尬 jar包没有打出来 还给我弄了个错误 用spring initializr方式创建一个spring boot项目给我来个 当时就懵逼了 在网上看到说吧https改成http 看了好几种方式 但对我有用的是在idea里的settin
  • flex写Java词法分析_如何用flex+bison写语法分析器

    背景 这个星期 项目中要使用C 或C语言解析JSON格式的数据 把解析的结果放到一个通用的数据结构 这个通用的数据结构 实际上是作为web服务层 这一层大家可以认为是类似于PHP服务器或webpy的服务器容器 到web页面层 这一层是语法类
  • Java使用list集合remove需要注意的事项

    在实际开发中有时候会碰到这样的场景 需要将一个list集合中的某些特定的元素给删除掉 这个时候用可以用List提供的remove方法来实现需求 List中的remove方法传入的参数可以是集合的下标 也可以是集合中一个元素 也可以是一个集合
  • 我的专业我做主ppt计算机,我的专业我做主(会计专业入门知识).ppt

    我的专业我做主 会计专业入门知识 ppt 由会员分享 可在线阅读 更多相关 我的专业我做主 会计专业入门知识 ppt 13页珍藏版 请在装配图网上搜索 1 会计学原理 姓名 池泽周 学院 经济管理学院 班级 会计092班 会计学原理是会计学
  • 对于制造业来说,MES上线前后有哪些变化?

    对于制造业来说 MES软件系统未上线前的现状 具体如下 1 目前 制造业产品的批次记录仍然是手工录入 并且每批都需要去打印 除此之外 生产过程中的投料量计算结果 产品测试的申请单 月生产计划表 产品所需浓度的计算都需要人工填写 不仅需要耗费
  • python包管理-pip

    镜像列表 官方 已默认添加 豆瓣 清华大学 中国科技大学 阿里 网易镜像 腾讯镜像 华为镜像 北京外国语大学 哈尔滨工业大学 百度 https pypi python org simple http pypi doubanio com si
  • 基于爱奇艺HCDN视频分发网络的开放缓存

    为通过Internet向海量用户传输高清晰度 高码率的视频节目 爱奇艺融合CDN和P2P技术 开发出一套适合多终端的混合分发传输网络 HCDN 本文来自爱奇艺高级技术总监庹虎在LiveVideoStackCon 2018大会中的演讲 由Li
  • CTF-8 靶场夺旗

    兵无常势 水无常形 能因敌而致胜者 谓之神 环境准备 VMware Workstation Pro12 Kali Linux IP 10 10 16 128 CTF 8 虚拟机 NAT 网络连接 1 主机发现 fping asg 10 10
  • ubuntu10上安装万能五笔

    我听同事说ubuntu上运行eclipse会比window上快 我抱着好奇就安装了ubuntu来试玩玩 安装完毕 上网找资料的时候 发现我需要中文输入 尤其是五笔 后来返回到window上上网搜索 找到了些资料 知道如何通过ibus来使用拼
  • java泛型里能放多个类吗,具有多个类的Java泛型通配符

    小编典典 实际上 你可以做你想做的事 如果要提供多个接口或一个类加接口 则必须使通配符看起来像这样 请参见sun com上的泛型教程 特别是页面底部的 绑定类型参数 部分 实际上 如果需要 你可以列出多个接口 并 InterfaceName
  • Spring Boot 3.0学习笔记

    什么是Spring Boot Spring Boot是一个基于Spring Framework的快速开发Web应用的工具 它使用了约定优于配置的方式来快速构建应用 使得开发人员能够专注于业务逻辑的实现 而不用过多关注配置和框架集成问题 Sp

随机推荐