网站首页 > 技术文章 正文
Java也能做爬虫。
现在提到爬虫人第一个想到的就是python,其实使用Java编写爬虫也是很好的选择,Java成熟的爬虫框架很多,下面给大家展示一个使用Java基础语言编写的爬取小说的案例:
实现功能:
爬取目标网站全本小说
代码编写环境:
JDK:1.8.0_191
Eclipse:2019-03 (4.11.0)
素材:
网站:
http://www.shicimingju.com(如有侵权,请联系我删除,谢谢)
小说:三国演义
案例实现用到的技术:
正则表达式
Java网络通信:URL
IO流
Map—HashMap
字符串操作
异常处理
代码思路:
- 根据小说存放位置创建file对象
- 根据网页结构编写正则,创建pattern对象
- 编写循环,创建向所有小说章节页面发起网络请求的url对象
- 网络流BufferReader
- 创建输入流
- 循环读取请求得到的内容,使用正则匹配其中的内容
- 将读取到的内容写入本地文件,知道循环结束
- 注意代码中的异常处理
案例代码:
案例代码:
package com.qianfeng.text;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GetText {
public static void main(String[] args) {
// 1、 根据小说存放位置创建file对象
File file = new File("D:\\File\\three_guo.txt");
// 2、 根据网页结构编写正则,创建pattern对象
String regex_content = "<p.*?>(.*?)</p>";
String regex_title = "<title>(.*?)</title>";
Pattern p_content = Pattern.compile(regex_content);
Pattern p_title = Pattern.compile(regex_title);
Matcher m_content;
Matcher m_title;
// 3、 编写循环,创建向所有小说章节页面发起网络请求的url对象
for (int i = 1; i <= 120; i++) {
System.out.println("第" + i + "章开始下载。。。");
try {
// 创建每一个页面的url对象
URL url = new URL("http://www.shicimingju.com/book/sanguoyanyi/" + i + ".html");
// 创建网络读取流
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(),"utf8"));
// 4、读取网络内容网络流BufferReader
String str = null;
// 5、 创建输入流
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file,true)));
while ((str = reader.readLine()) != null) {
m_title = p_title.matcher(str.toString());
m_content = p_content.matcher(str.toString());
// 获取小说标题并写入本地文件
Boolean isEx = m_title.find();
if (isEx) {
String title = m_title.group();
// 清洗得到的数据
title = title.replace("<title>", "").replace("</title>", "");
System.out.println(title);
writer.write("第" + i + "章:" + title + "\n");
}
while (m_content.find()) {
String content = m_content.group();
// 清洗得到的数据
content = content.replace("<p>", "").replace("</p>", "").replace(" ", "").replace("?", "");
// 把小说内容写入文件
writer.write(content + "\n");
}
}
System.out.println("第" + i + "章下载完成.........");
writer.write("\n\n");
writer.close();
reader.close();
} catch (Exception e) {
System.out.println("下载失败");
e.printStackTrace();
}
}
}
}
运行效果:
猜你喜欢
- 2025-07-25 freemark学习(二):freemark的数据类型(1)
- 2025-07-25 阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一文搞定
- 2025-07-25 《JAVA编程思想》5分钟速成:第18章(Java的IO系统)
- 2025-07-25 实战SRC漏洞挖掘全过程,流程详细【网络安全】
- 2025-07-25 Tomcat处理HTTP请求流程解析(tomcat cgi)
- 2025-07-25 Java socket详解(转)(java socket编程例子)
- 2025-07-25 全面解读FileUtil与IoUtil工具类的高级功能及应用场景
- 2025-07-25 终于有人把Git最火Java全套详细笔记(吐血放出)资料给分享出来了
- 2025-07-25 《保姆式的详解》Reactor 模式和 Java NIO
- 2025-07-25 基于TCP的网络实时聊天室(socket通信案例)
- 最近发表
-
- Qt编程进阶(63):Qt Quick高级控件的使用
- Qt编程进阶(47):QML鼠标事件处理(qt编程难不难)
- 使用Xamarin和Visual Studio开发Android可穿戴设备应用
- Qt使用教程:创建Qt Quick应用程序(三)
- QML性能优化 | 常见界面元素优化(qml布局自适应大小)
- Qt使用教程:创建移动应用程序(二)
- Qt Quick 多媒体开发播放音乐和视频
- Qt使用教程:创建Qt Quick UI表单(三)
- 如何将 Qt 3D 渲染与 Qt Quick 2D 元素结合创建太阳系行星元素?
- QML控件:TextInput, TextField, TextEdit, TextArea用法及自定义
- 标签列表
-
- axure 注册码 (25)
- exploit db (21)
- mutex_lock (30)
- oracleclient (27)
- nfs (25)
- springbatch (28)
- oracle数据库备份 (25)
- dir (26)
- connectionstring属性尚未初始化 (23)
- output (32)
- panel滚动条 (28)
- centos 5 4 (23)
- sql学习 (33)
- c 数组 (33)
- pascal语言教程 (23)
- ppt 教程 (35)
- java7 (24)
- 自适应网站制作 (32)
- server服务自动停止 (25)
- 超链接去掉下划线 (34)
- 什么是堆栈 (22)
- map entry (25)
- ubuntu装qq (25)
- outputstreamwriter (26)
- fill_parent (22)