学习笔记-spring-mybatis-jsoup-http-client小说站点爬虫(1)--获取小说站点章节列表
获取小说站点章节列表
第一次写博客,写得不好请见谅
目的是让自己印象更加深刻,锻炼自己表达能力,同时可以和大家一起交流学习,大神勿喷!
本次学习教程来自吾爱破解小说站点爬虫-spring-mybatis-jsoup-http-client
讲师:昕悦阁丶风雪
目录
- 获取小说站点章节列表
- 观察章节列表所用到的元素
- 创建maven项目及配置
- 创建maven项目
- 配置项目
- 编写代码
- 1编写章节实体类 Chapterjava
- 2编写章节接口 IChapterSpiderjava
- 3编写抽象类AbstractChapterSpiderjava
- 4编写实现类DefaultChapterSpiderjava
- 5编写测试工具类TestCase
- 测试
- 源码下载
观察章节列表所用到的元素
章节列表所用到的元素,如a标签、table标签等
打开笔趣阁-圣墟网页,查看所列的章节列表
查看源代码
可以发现每一个章节都使用了dd和a标签,且章节都在id=list下,所以不难理解为每个章节从#list到dd标签再到a标签。
大家可以去各大小说站点观察发现
以下是我所观察的小说站点及对应的章节所使用的元素
顶点小说23wx.com
#at td a笔下文学bxwx8.org
#TabCss dd a笔趣阁biquge.tw
#list dd a
创建maven项目及配置
本项目是eclipse创建的
创建maven项目
File–>new–>Maven Project
配置项目
右击项目选择Properties
选择Java Build Path–>Libraries
选中JER System Library 点击Edit
选择自己安装的jdk版本,这里我用的是jdk1.8.0_121
选择Java Compiler设置与jdk相应的Compiler compliance level
3.配置pom.xml文件,下载所需要的jar包
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>luohong</groupId><artifactId>novel.spider</artifactId><version>0.0.1-SNAPSHOT</version><!-- 依赖包 --><dependencies><!-- HTML解析器工具 --><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.9.2</version></dependency><!-- Http传输协议工具包 --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version></dependency><!-- 解析xml工具包 --><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency><!-- 单元测试工具包 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>
</project>
4.项目结构
编写代码
1、编写章节实体类 Chapter.java
package novel.spider.model;import java.io.Serializable;
/*** 小说的章节实体* @author luohong* @date 2017年2月12日*/
public class Chapter implements Serializable {private static final long serialVersionUID = 1L;private String title; // 标题名private String url; // 链接public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((title == null) ? 0 : title.hashCode());result = prime * result + ((url == null) ? 0 : url.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Chapter other = (Chapter) obj;if (title == null) {if (other.title != null)return false;} else if (!title.equals(other.title))return false;if (url == null) {if (other.url != null)return false;} else if (!url.equals(other.url))return false;return true;}@Overridepublic String toString() {return "Chapter [title=" + title + ", url=" + url + "]";}}
2、编写章节接口 IChapterSpider.java
package novel.spider.interfaces;import java.util.List;import novel.spider.model.Chapter;/*** 小说章节接口* @author luohong* @date 2017年2月12日*/
public interface IChapterSpider {/*** 获取章节列表方法* @param url 小说url* @return*/public List<Chapter> getChapter(String url);
}
3、编写抽象类AbstractChapterSpider.java
package novel.spider.impl;import java.util.ArrayList;
import java.util.List;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;import novel.spider.interfaces.IChapterSpider;
import novel.spider.model.Chapter;/*** 抽象类* * @author luohong* @date 2017年2月12日*/
public class AbstractChapterSpider implements IChapterSpider {/*** 抓取数据方法* * @param url 抓取链接* @return* @throws Exception*/protected String crawl(String url) throws Exception {// 通过HttpClientBuilder返回httpClient实体try (CloseableHttpClient httpClient = HttpClientBuilder.create().build();CloseableHttpResponse httpResponse = httpClient.execute(new HttpGet(url))) {// 获取抓取结果String result = EntityUtils.toString(httpResponse.getEntity());return result;} catch (Exception e) {throw new RuntimeException(e);}}@Overridepublic List<Chapter> getChapter(String url) {try {String result = crawl(url);//System.out.println(url);//System.out.println(result);/*** Jsoup解析、Document选择器*/Document document = Jsoup.parse(result,"utf-8");Elements elements = document.select("#list dd a");List<Chapter> chapters = new ArrayList<>();for(Element element:elements){Chapter chapter = new Chapter();/*** <a style="" href="/86_86745/4504833.html">第一章 沙漠中的彼岸花</a>*/chapter.setTitle(element.text());chapter.setUrl(url+element.attr("href"));chapters.add(chapter);}return chapters;} catch (Exception e) {throw new RuntimeException(e);}}}
4、编写实现类DefaultChapterSpider.java
package novel.spider.impl;/*** 实现类* @author luohong* @date 2017年2月12日*/
public class DefaultChapterSpider extends AbstractChapterSpider{}
5、编写测试工具类TestCase
package novel.spider.junit;import java.util.List;import org.junit.Test;import novel.spider.impl.DefaultChapterSpider;
import novel.spider.interfaces.IChapterSpider;
import novel.spider.model.Chapter;/*** 测试工具类* @author luohong* @date 2017年2月12日*/
public class TestCase {@Testpublic void test1() throws Exception{IChapterSpider spider = new DefaultChapterSpider();List<Chapter> chapters = spider.getChapter("http://www.biquge.tw/86_86745/");for(Chapter chapter:chapters){System.out.println(chapter);}}
}
测试
上面测试类用的地址是
http://www.biquge.tw/86_86745/
右击TestCase.java的test1()方法,选择Run As –>Junit Test 开始测试
控制台输出如下
看到能抓取数据粗来,好开心,就先到这吧。。。后面还会继续学习,再见!
源码下载
下载地址
学习笔记-spring-mybatis-jsoup-http-client小说站点爬虫(1)--获取小说站点章节列表相关推荐
- Spring学习笔记--spring+mybatis集成
前言: 技术的发展, 真的是日新月异. 作为javaer, 都不约而同地抛弃裸写jdbc代码, 而用各种持久化框架. 从hibernate, Spring的JDBCTemplate, 到ibatis, ...
- Spring学习笔记之MyBatis
系列文章目录 Spring学习笔记 之 Springhttps://blog.csdn.net/weixin_43985478/article/details/124411746?spm=1001.2 ...
- Spring 学习系列 -- Spring + Mybatis 从零开始配置多数据源访问
目的: 项目中以前有整合mybatis + spring操作数据库,但是以前都是单数据库,现需要实现mybatis访问多数据源,依旧使用spring调用mybatis. 通过注解的方式整合 sprin ...
- R语言学习笔记(八)--读写文件与网络爬虫
R语言学习笔记(八) 1 工作路径 2 保存R对象 3 Scan函数 3-1 从控制台读取数据 3-2 从txt文件读取数据 3-3 从url读取数据 4 按行读写文本文件 5 读取文本文件(txt. ...
- 学习笔记---Spring 5
Spring 5 1. 介绍 1.1 简介 历史:2002年,首次推出了 Spring 框架的雏形:interface 21.2004年3月24日,Spring诞生,发布了 1.0 正式版本. Rod ...
- Java学习笔记10-2——MyBatis
文章目录 MyBatis详细执行流程 使用注解开发 面向接口开发 使用注解开发 复杂查询 多对一问题 测试环境搭建 按照查询嵌套处理(子查询.嵌套查询) 按照结果查询(联表查询.联合查询) 一对多问题 ...
- 【学习笔记】Mybatis框架学习及个人感悟
文章目录 一.简介 1.1.什么是Mybatis 1.2.持久化 1.3.为什么需要Mybatis 二.第一个Mybatis程序 2.1.搭建环境 2.2.创建一个子模块 2.3.编写代码 2.4.测 ...
- 学习笔记:MyBatis
越学接触的越多,到了后面难免会混淆和不知所云.所以记下次笔记,能既多少是多好吧.还有每日学完一章就做好总结,因为回过头再做总结就又要复习一遍,我的记性太差了. 未觉池塘春草梦, 阶前梧叶已秋声. 第一 ...
- Java学习笔记之Mybatis
1. Mybatis 1.1 MyBatis介绍 MyBatis 是一款优秀的持久层框架 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程 MyBatis 可以使用简 ...
最新文章
- css文本居中的几种方式
- AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17
- java日常笔记、对象的创建完全是由构造方法实现的吗?this的本质
- android连接SQLite数据库-----增加改查+分页
- android侧边栏点击,侧边菜单栏 android-menudrawer
- android接口类命名规范_Android开发规范
- Linux系统启动流程和GRUB解释
- A Story of One Country (Hard) CodeForces - 1181E2 (分治)
- Java多线程之FutureTask
- Javac选项source和target的作用
- 如何识别服务器连接的偶发故障?
- 15个国外最好的电子商务建站程序
- 10个 安卓应用商店开发者公司账号注册(2022最新最全)
- 热烈祝贺“UTONMOS第一届公会会长圆桌会议”圆满举行
- 帅哥陈 Hololens开发笔记(1)
- 哪里​可以​找到​SPICE​仿真​模型(转)
- APP开发技术架构方案
- C++版本OpenCv教程(二十七)图像中添加高斯噪声
- 基于vue-element-ui的一款表格设计器table-making
- Oracle数据库静默模式小节(LINUX 11G)