使用浏览器自带功能(最简单直接)

这是最基本、最通用的方法,适用于所有现代浏览器(Chrome, Firefox, Edge, Safari)。

html5网页下载工具
(图片来源网络,侵删)

保存整个网页(最完整的方式)

这个方法会下载当前网页的 HTML 文件文件夹(包含所有图片、CSS、JS等资源),并且可以设置是否保存为“网页,仅HTML”(不含资源)或“网页,完整”(含资源)。

  • 操作步骤:

    1. 打开你想要下载的网页。
    2. 按下 Ctrl + S (Windows) 或 Cmd + S (Mac)。
    3. 在弹出的“另存为”对话框中:
      • 保存类型: 选择 “网页,完整”,这会创建一个 .html 文件和一个同名的文件夹,文件夹里包含了所有依赖的资源,这是最推荐的方式,能保证网页离线打开时显示正常。
      • 文件名: 输入你想要的文件名。
      • 保存位置: 选择你要保存的位置。
    4. 点击“保存”。
  • 优点:

    • 无需安装任何额外软件。
    • 操作简单快捷。
    • 最完整,适合离线阅读。
  • 缺点:

    html5网页下载工具
    (图片来源网络,侵删)
    • 会下载大量你可能不需要的文件(广告、跟踪脚本等)。
    • 保存的页面结构可能比较混乱,特别是对于动态加载内容的网站(如单页应用 SPA)。

打印为 PDF(适合阅读和归档)

如果你只想保存网页的,而不关心其交互功能,打印成 PDF 是一个非常好的选择。

  • 操作步骤:

    1. 打开网页。
    2. 按下 Ctrl + P (Windows) 或 Cmd + P (Mac)。
    3. 在打印预览界面,将 目标打印机 设置为 “另存为 PDF”“Microsoft Print to PDF”
    4. 你还可以调整布局(如“横向”或“纵向”)、缩放等选项。
    5. 点击“保存”。
  • 优点:

    • 生成格式统一、易于分享的文档。
    • 通常会智能地分页,去除页眉页脚等浏览器元素。
    • 文件体积相对较小。
  • 缺点:

    html5网页下载工具
    (图片来源网络,侵删)
    • 无法保存网页的交互功能(如按钮点击、视频播放)。
    • 对于复杂的网页,排版可能会有偏差。

使用在线网页下载工具(无需安装)

如果你不想使用浏览器自带功能,或者需要更高级的功能(如批量下载、特定格式转换),可以使用在线工具。

  • 一些知名的在线工具:

    • WebsiteDownloader.io: 功能强大,可以自定义下载范围(只下载某个路径下的文件)、设置用户代理等。
    • DownloadWebsite: 界面简洁,快速下载整个网站。
    • SiteSucker: 主要针对 Mac 用户,但有在线版本。
  • 使用方法:

    1. 打开上述任一网站。
    2. 输入你想要下载的网址。
    3. 根据提示设置下载选项(如保存格式、路径深度等)。
    4. 开始下载,工具会打包成一个 .zip 文件供你下载。
  • 优点:

    • 通常提供比浏览器更灵活的选项。
    • 无需安装,在浏览器中即可使用。
  • 缺点:

    • 隐私风险: 你输入的网址会被服务提供商看到。
    • 文件大小限制: 大型网站可能无法一次性下载。
    • 依赖网络: 速度取决于服务器和网络状况。
    • 可能包含广告。

使用代码实现(适合开发者和技术爱好者)

如果你需要高度定制化的下载功能,或者想集成到自己的项目中,使用代码是最佳选择,这里主要介绍使用 Node.js 的方法,因为它非常适合处理网络请求和文件系统操作。

使用 wget 命令(Linux/Mac 或 Windows 上的 Git Bash)

wget 是一个经典的命令行工具,可以递归地下载整个网站。

# 基本用法,下载整个网站
wget -r -p -k -E http://example.com
# 参数解释:
# -r: 递归下载
# -p: 下载所有必要的文件,以正确显示页面(如图片、CSS)
# -k: 将下载的HTML中的链接转换为本地链接
# -E: 将没有扩展名的HTML文件添加 .html 扩展名

使用 Node.js + puppeteer(更强大,可处理动态网页)

很多现代网站是“单页应用”(SPA),内容是通过 JavaScript 动态加载的,传统的 wgetaxios 无法获取到这些内容。puppeteer 可以模拟一个真实的浏览器,所以可以完美解决这个问题。

步骤:

  1. 安装 Node.js 和 npm

  2. 创建项目并安装 puppeteer:

    mkdir my-downloader
    cd my-downloader
    npm init -y
    npm install puppeteer
  3. 编写下载脚本 download.js

    const fs = require('fs').promises;
    const path = require('path');
    const puppeteer = require('puppeteer');
    async function downloadWebsite(url, outputDir) {
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        await page.goto(url, { waitUntil: 'networkidle2' }); // 等待网络空闲,确保所有资源加载完成
        // 获取页面的 HTML
        const html = await page.content();
        // 创建输出目录
        await fs.mkdir(outputDir, { recursive: true });
        // 保存 HTML 文件
        const htmlPath = path.join(outputDir, 'index.html');
        await fs.writeFile(htmlPath, html);
        // 获取所有图片、CSS、JS 等资源的 URL
        const resources = await page.evaluate(() => {
            const urls = [];
            // 获取所有 img, link, script 标签的 src 或 href
            document.querySelectorAll('img, link, script').forEach(el => {
                const url = el.src || el.href;
                if (url && url.startsWith('http')) {
                    urls.push(url);
                }
            });
            return [...new Set(urls)]; // 去重
        });
        console.log(`Found ${resources.length} resources to download.`);
        // 下载资源
        for (const resourceUrl of resources) {
            try {
                const response = await page.goto(resourceUrl);
                const buffer = await response.buffer();
                const resourcePath = path.join(outputDir, new URL(resourceUrl).pathname);
                // 确保资源文件的目录存在
                await fs.mkdir(path.dirname(resourcePath), { recursive: true });
                await fs.writeFile(resourcePath, buffer);
                console.log(`Downloaded: ${resourceUrl}`);
            } catch (e) {
                console.error(`Failed to download ${resourceUrl}:`, e.message);
            }
        }
        await browser.close();
        console.log('Website downloaded successfully!');
    }
    // 使用示例
    const targetUrl = 'https://example.com'; // 替换成你想下载的网址
    const outputDirectory = 'downloaded-site';
    downloadWebsite(targetUrl, outputDirectory);
  4. 运行脚本:

    node download.js
  • 优点:
    • 功能最强大: 可以处理任何动态加载的网页。
    • 高度可定制: 可以根据需要修改脚本,添加任何逻辑。
    • 完全可控: 数据保存在自己的机器上,无隐私泄露风险。
  • 缺点:
    • 需要编程知识。
    • 需要安装环境(Node.js)。
    • 对于非常复杂的网站,脚本可能需要更复杂的逻辑来处理。

使用专业桌面软件(功能最全面)

如果你需要经常进行网页下载、归档,或者需要管理大量下载的网站,专业软件是更好的选择。

  • HTTrack Website Copier: 开源、免费、跨平台(Windows, Linux, Mac),功能非常强大,可以配置下载的深度、文件类型、排除规则等,是这类工具的标杆。

  • WebCopy: 另一款优秀的免费工具,界面友好,功能强大。

  • Internet Explorer 的“收藏夹”中的“导入和导出”: 虽然是旧功能,但可以快速保存网页链接和快照。

  • 优点:

    • 功能极其丰富和专业。
    • 通常有图形界面,易于使用。
    • 稳定性和性能经过优化。
  • 缺点:

    • 需要额外安装软件。
    • 部分软件可能需要付费才能解锁全部功能。

总结与选择建议

方案类型 适用场景 优点 缺点
浏览器自带功能 偶尔下载单个网页,需要完整离线内容 简单、快捷、无需安装 可能冗余,对动态网页支持不佳
在线下载工具 不想安装软件,需要快速下载 无需安装,操作方便 隐私风险,有大小和速度限制
代码实现 开发者、需要高度定制化、处理动态网页 功能最强、完全可控、无隐私问题 需要编程知识,环境配置稍复杂
专业桌面软件 频繁下载、需要管理大量网站、功能需求高 功能全面、稳定、专业 需要安装软件,部分可能收费

如何选择?

  • 普通用户,偶尔下载: 直接用 浏览器自带的 Ctrl+S,保存为“网页,完整”即可。
  • 普通用户,只想保存内容阅读: 使用 浏览器打印功能,保存为 PDF。
  • 不想装软件,对隐私要求不高: 使用 在线下载工具
  • 开发者/技术爱好者,或需要下载动态网站: 使用 Node.js + Puppeteer 方案。
  • 专业人士,或需要批量、精细化管理: 使用 HTTrack 等专业桌面软件。