Jsoup-基于Java实现网络爬虫-爬取笔趣阁小说
注意!仅供学习交流使用,请勿用在歪门邪道的地方!技术只是工具!关键在于用途!
今天接触了一款有意思的框架,作用是网络爬虫,他可以像操作JS一样对网页内容进行提取
初体验Jsoup
<!-- Maven坐标地址 -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
我们先来找到博客园的个人首页做一个简单的小练习:https://www.cnblogs.com/hanzhe
调用Jsoup的connect静态函数创建连接,将爬取的目标网站作为参数传递过去:
public class Demo {
public static void main(String[] args) {
Connection connect = Jsoup.connect("https://www.cnblogs.com/hanzhe");
}
}
为了防止爬虫受到限制,这里设置请求头来模仿浏览器客户端,可以参照请求进行修改,例如:
public class Demo {
public static void main(String[] args) {
Connection connect = Jsoup.connect("https://www.cnblogs.com/hanzhe")
// 我这里只设置了一个,如果爬取遇到问题随时添加头信息即可
.header("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56");
}
}

然后调用execute方法开始进行爬取,通过body取出爬取到的数据:
public class Demo {
public static void main(String[] args) throws IOException {
Connection connect = Jsoup.connect("https://www.cnblogs.com/hanzhe")
.header("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56");
String body = connect.execute().body();
System.out.println(body);
}
}
可以看到已经爬取到了首页的内容:

但是之前说Jsoup可以向操作JS一样对网页内容进行提取,所以我们在获取爬取内容之前要先对内容进行解析:
public class Demo {
public static void main(String[] args) throws IOException {
Connection connect = Jsoup.connect("https://www.cnblogs.com/hanzhe")
.header("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56");
// 使用parse函数对爬取到的内容进行解析
Element body = connect.execute().parse().body();
System.out.println(body);
}
}

明显看到解析后的HTML被格式化过,看着非常整齐,而且返回值也从字符串变成了ELement实例,可以通过操作实例实现内容筛选
测试爬取页面随笔
打开F12开发者工具,尝试获取到与随笔标题相关的信息:

观察发现每个随笔的标题都使用postTitle2 vertical-middle两个class进行修饰的,我们可以使用选择器来找到所有标题:

我们就用该选择器在Jsoup中爬取所有随笔标题:
public class Demo {
public static void main(String[] args) throws IOException {
Connection connect = Jsoup.connect("https://www.cnblogs.com/hanzhe")
.header("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56");
Element body = connect.execute().parse().body();
Elements elementsByClass = body.getElementsByClass("postTitle2 vertical-middle");
elementsByClass.forEach(item->{
System.out.println(item.text());
});
}
}

实战:爬取笔趣阁小说:
被选中的幸运儿:http://www.paoshuzw.com/26/26874/
具体Java代码:
public class 笔趣阁爬取小说 {
// 爬取目标网址:从第一章开始爬取,直至最后一章
private static String url = "http://www.paoshuzw.com/26/26874/13244872.html";
// 输出文件名称(一般为书名),如果仅仅是想拿来用改这两个参数就够了
private static String fileName = "仓元图";
// 空格,四格位置
private static String space = " ";
// 文件输出流
private static FileWriter writer;
// 计数器
private static int pageCount = 1;
// 启动类函数
public static void main(String[] args) throws Exception {
// 初始化程序
getWriter();
long l = System.currentTimeMillis();
// 循环爬取小说
do {
Element element = nextPage(url);
outputToFile(element);
url = hasNext(element);
} while (url != null);
writer.close();
long time = (System.currentTimeMillis() - l) / 1000;
System.out.println("\n\n 成功爬取所有章节!耗时" + time + "秒");
}
// 爬取页面
private static Element nextPage(String url) throws Exception{
// 获取连接实例,伪造浏览器身份
Connection conn = Jsoup.connect(url)
.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9")
.header("Accept-Encoding", "gzip, deflate")
.header("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6")
.header("Cache-Control", "max-age=0")
.header("Connection", "keep-alive")
.header("Host", url)
.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56");
return conn.execute().parse().body();
}
// 获取当前章节标题
private static String getTitle(Element element) {
return element.select(".bookname h1").text();
}
// 获取章节具体内容
private static String getContent(Element element) {
// 删除底部P标签的广告内容
element.getElementsByTag("p").remove();
// 获取到ID为content的所有HTML内容
String body = element.select("#content").html();
// 对body进行处理,返回正常格式的内容
body = body.replace(" ", space);
body = body.replace("<br>", "");
return body.replace(" \n \n", "\r\n");
}
// 是否有下一页?有返回下一页URL地址,没有就返回NULL
private static String hasNext(Element element) {
// 找到"下一章"的按钮,获取跳转的目标地址
Elements div = element.getElementsByClass("bottem2");
Element a = div.get(0).getElementsByTag("a").get(3);
String href = a.attr("href");
// 通过观察存在下一章的时候URL会以.html结尾,不存在时会跳转到首页,通过这个特点判断是否存在下一章
return href.endsWith(".html") ? "http://www.paoshuzw.com" + href : null;
}
// 获取输出流
private static void getWriter() throws IOException {
String path = "D:/" + fileName + ".txt";
File file = new File(path);
if (file.exists()) {
System.out.println("目标书籍已存在!请修改文件名称或删除原书籍:" + path);
System.exit(0);
}
writer = new FileWriter(file);
}
// 输出到文件
private static void outputToFile(Element element) throws IOException {
String title = getTitle(element);
String content = getContent(element);
String text = space + title + "\r\n\r\n" + content;
writer.write(text);
writer.flush();
System.out.println("==>>【" + title + "】爬取完成,正在爬取下一章(第" + pageCount++ + "次操作)");
}
}
Jsoup-基于Java实现网络爬虫-爬取笔趣阁小说的更多相关文章
- bs4爬取笔趣阁小说
参考链接:https://www.cnblogs.com/wt714/p/11963497.html 模块:requests,bs4,queue,sys,time 步骤:给出URL--> 访问U ...
- scrapycrawl 爬取笔趣阁小说
前言 第一次发到博客上..不太会排版见谅 最近在看一些爬虫教学的视频,有感而发,大学的时候看盗版小说网站觉得很能赚钱,心想自己也要搞个,正好想爬点小说能不能试试做个网站(网站搭建啥的都不会...) 站 ...
- Python爬取笔趣阁小说,有趣又实用
上班想摸鱼?为了摸鱼方便,今天自己写了个爬取笔阁小说的程序.好吧,其实就是找个目的学习python,分享一下. 1. 首先导入相关的模块 import os import requests from ...
- python应用:爬虫框架Scrapy系统学习第四篇——scrapy爬取笔趣阁小说
使用cmd创建一个scrapy项目: scrapy startproject project_name (project_name 必须以字母开头,只能包含字母.数字以及下划线<undersco ...
- scrapy框架爬取笔趣阁
笔趣阁是很好爬的网站了,这里简单爬取了全部小说链接和每本的全部章节链接,还想爬取章节内容在biquge.py里在加一个爬取循环,在pipelines.py添加保存函数即可 1 创建一个scrapy项目 ...
- HttpClients+Jsoup抓取笔趣阁小说,并保存到本地TXT文件
前言 首先先介绍一下Jsoup:(摘自官网) jsoup is a Java library for working with real-world HTML. It provides a very ...
- scrapy框架爬取笔趣阁完整版
继续上一篇,这一次的爬取了小说内容 pipelines.py import csv class ScrapytestPipeline(object): # 爬虫文件中提取数据的方法每yield一次it ...
- 爬虫入门实例:利用requests库爬取笔趣小说网
w3cschool上的来练练手,爬取笔趣看小说http://www.biqukan.com/, 爬取<凡人修仙传仙界篇>的所有章节 1.利用requests访问目标网址,使用了get方法 ...
- 如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)
前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...
随机推荐
- SpringBoot Test 多线程报错:dataSource already closed
1:前言 最近在项目中使用多线程对大任务拆分处理时,进行数据库操作的时候报错了. 业务代码大概是这样的: @Service public calss TestServiceImpl implement ...
- docker ssh秘钥免密登录
一.概述 有一台跳板机,已经实现了免密登录后端服务器.但是我写了一个django项目,它是运行在容器中的,也需要免密登录后端服务器. 虽然可以在容器中手动做一下免密登录,但是容器重启之后,之前做的设置 ...
- 重复代码的克星,高效工具 VSCode snippets 的使用指南
为什么要用 snippets(代码段)? 不管你使用何种编程语言,在我们日常的编码工作中,都会存在有大量的重复代码编写,例如: 日志打印: console.log,log.info('...') 输出 ...
- JS table排序
<html lang="en"> <head> <meta charset="UTF-8"> <meta http-e ...
- R绘图(3): 散点图添加文本注释
这里以火山图为例进行说明,在转录组分析中,火山图是很常见的一类图,纵轴表示p_value,横轴表示log (fold change).单一的散点图绘制很简单,火山图比较难处理的地方就是一些基因的注释, ...
- FreeBSD Fcitx 输入法框架设置
#FreeBSD# 在.cshrc和/etc/csh.cshrc中进行如下配置,此配置可以解决部分窗口fcitx无效的问题. setenv QT4_IM_MODULE fcitx setenv GTK ...
- NIO三大组件之Buffer
什么是Buffer Buffer(这里并不是特指Buffer类)是一个存储数据的容器,与数组类似(其实底层依旧是用数组的结构来存储数据),但不同的是,Buffer对象提供了一组更有效的方法去进行写入和 ...
- 颠覆你认知的Python3.9
我通读了python 3.9发行说明和相关的讨论.根据这些信息,我想写一个全面的指南,以便每个人都能一眼了解这些功能及其详细的工作原理 原文地址,点击这里,观看效果更佳 简而言之 从字典更新/合并到添 ...
- 【linux】系统编程-8-Socket
目录 前言 11. 套接字 11.1 Socket简介 11.2 socket() 11.3 bind() 11.4 connect() 11.5 listen() 11.6 accept() 11. ...
- java例题_50 题目:有五个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成 绩),计算出平均成绩,将原有的数据和计算出的平均分数存放在磁盘文件"stud"中。
1 /*50 [程序 50 文件 IO] 2 题目:有五个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成 3 绩),计算出平均成绩,将原有的数据和计算出的平均分数存放 ...