java保存网页核心是获取html内容并写入文件:先用http客户端请求网页,正确处理编码、状态码和重定向,再以相同编码写入本地文件;仅保存html主体,不自动下载css/js等外部资源。

Java 中把网页保存为本地文件,核心思路是:先用 HTTP 客户端发起请求获取网页 HTML 内容(含响应体),再将字节流或字符串写入本地文件。关键在于正确处理编码、HTTP 状态码、重定向和资源完整性。
使用 HttpURLConnection 获取并保存网页
这是 JDK 自带方案,无需额外依赖,适合简单场景:
- 创建 URL 对象,调用 openConnection() 得到 HttpURLConnection 实例
- 设置请求头(如 User-Agent),避免部分网站返回 403
- 检查 getResponseCode() 是否为 200;非 200 或重定向需手动处理(setInstanceFollowRedirects(false) 可控)
- 从 getInputStream() 读取响应体;注意用 getContentType() 解析 charset(如 text/html; charset=UTF-8),否则中文可能乱码
- 用 Files.write() 或 FileOutputStream + OutputStreamWriter 写入文件,指定相同编码
用 Apache HttpClient 更稳健地抓取网页
推荐用于生产环境,自动处理重定向、连接池、超时、gzip 响应解压等:
- 添加 Maven 依赖:org.apache.httpcomponents:httpclient:4.5.14
- 用 CloseableHttpClient 执行 HttpGet 请求,通过 HttpResponse 获取 Entity
- EntityUtils.toString(entity, StandardCharsets.UTF_8) 可安全提取字符串(自动识别 Content-Type 中的 charset)
- 若需保留原始二进制(如含图片 base64 或特殊编码),用 entity.getContent() 获取 InputStream 直接写文件
注意网页中相对路径资源(CSS/JS/图片)不会自动下载
上述方法只保存 HTML 主体文件,不会递归下载引用的外部资源:
- 想完整保存网页(类似浏览器“另存为”),需解析 HTML(例如用 Jsoup),提取 link、script、img 的 src/href 属性
- 对每个相对 URL 拼接 base URL(可用 Jsoup.Document#baseUri() 获取),再逐个请求并保存到对应子目录
- 静态资源路径结构需模拟原站(如 /css/style.css → ./css/style.css),否则本地打开会丢失样式
简单示例:保存百度首页 HTML 到本地
以下代码用 HttpURLConnection,处理 UTF-8 编码并忽略证书(仅测试):
URL url = new URL("https://www.baidu.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("User-Agent", "Mozilla/5.0");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
if (conn.getResponseCode() == 200) {
String charset = "UTF-8";
String contentType = conn.getContentType();
if (contentType != null && contentType.contains("charset=")) {
charset = contentType.split("charset=")[1].split(";")[0].trim();
}
String html = new String(conn.getInputStream().readAllBytes(), charset);
Files.write(Paths.get("baidu.html"), html.getBytes(StandardCharsets.UTF_8));
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











