Wget静态网站前端

看到一个做的挺不错的前端网页所以想爬下来:

wget --mirror --convert-links --adjust-extension --page-requisites --no-parent Checking your browser...

工作原理:

  1. 下载首页 HTML 文件
  2. 解析 HTML 内容,提取所有链接(<a href>, <img src>, <link href>, <script src> 等)

|--------------------|----------------|--------------------------------------|
| --mirror | 启用镜像模式,递归下载 | 相当于 -r -N -l inf |
| --convert-links | 转换链接为本地相对路径 | https://site.com/page → ../page.html |
| --adjust-extension | 为无扩展名文件添加合适扩展名 | /page → page.html |
| --page-requisites | 下载页面所需的所有资源 | CSS, JS, 图片等 |
| --no-parent | 不下载父目录内容 | 只下载 site.com/path/ 下的内容 |

  • wget 的工作方式:下载 HTML 文件 → 解析 HTML 中的链接 → 下载链接指向的文件(包括 JS 文件)→ 结束。
  • 浏览器的工作方式 :下载 HTML 文件 → 解析 HTML → 下载 JS 文件 → 执行 JS 代码 → JS 代码修改了 HTML 文档(DOM) → 最终渲染出页面。

Loading robots.txt; please ignore errors. --2026-07-31...- https://www.com/robots.txt

robots.txt 是一个君子协定,告诉爬虫哪些路径可以访问,哪些不可以(没有强制力)。 Wget会遵守robots.txt,会尊重网站的爬虫限制

一个 robots.txt 文件示例:

User-agent: * # 适用于所有爬虫

Disallow: /admin/ # 禁止爬取 /admin/ 目录下的内容

Disallow: /private.pdf # 禁止爬取这个文件

Allow: / # 允许爬取其他所有内容

Wget不适用于现代 SPA(单页应用)网站:

SPA **是什么?**SPA 的核心思想是:整个网站只有一个 HTML 页面。用户点击导航栏时,页面不会整体刷新,而是通过 JavaScript 动态地替换页面中的内容,从而提供类似桌面应用的流畅体验。

只有一个"空壳" HTML:wget 下载到的 index.html 通常是这样的:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>My App</title>
  5. <link href="/css/app.css" rel="stylesheet">
  6. </head>
  7. <body>
  8. <div id="root"></div> <!-- 所有内容最终都由 JS 渲染到这里 -->
  9. <script src="/js/app.js"></script>
  10. </body>
  11. </html>

这个页面本身没有任何可见内容,只是一个空壳。

内容完全由 JavaScript 动态生成:所有的页面内容、路由、数据请求,都由那个巨大的 app.js 文件在浏览器中执行后来完成。wget 下载了 app.js 但没有执行,所以它抓取到的永远是一个空壳。

路由由前端管理:传统网站中,/a 和 /b 对应服务器上两个不同的 HTML 文件。在 SPA 中,/a 和 /b 是前端路由,它们都指向同一个 index.html 文件,只是 JS 会根据 URL 的不同,在 <div id="root"> 里渲染出不同的内容。

总结: 对于 SPA 网站,wget 就像一个去图书馆找书的人,它只找到了一个空书架(index.html),而所有的书(内容)都是图书馆管理员(JS)在读者(浏览器)到来时才现场写上去的。因此,要抓取 SPA 网站,必须使用 Puppeteer 或 Selenium 这类能真正运行 JavaScript 的"无头浏览器"。

复制代码
graph TD
    A[下载首页 index.html] --> B[解析HTML提取所有链接]
    B --> C{链接类型判断}
    C --> D[内部链接<br>继续递归下载]
    C --> E[外部链接<br>根据规则跳过]
    C --> F[资源文件<br>CSS/JS/图片直接下载]
    D --> G[下载新页面并重复解析]
    F --> H[保存到相应目录]
    G --> B

graph TD
    subgraph 正常浏览器访问流程
        A1[浏览器请求 github.com] --> B1[服务器返回空壳 index.html]
        B1 --> C1[浏览器加载并执行 JS 脚本]
        C1 --> D1[JS 检测路由并发起 API 请求<br>携带 Cookie/Token 鉴权]
        D1 --> E1[后端验证通过<br>返回 JSON 数据]
        E1 --> F1[JS 将数据渲染到 DOM 树]
        F1 --> G1[用户看到完整的动态页面]
    end

    subgraph wget 爬取失败流程
        A2[wget 请求 github.com] --> B2[下载空壳 index.html]
        B2 --> C2[wget 解析 HTML 提取链接]
        C2 --> D2[wget 尝试请求 /marketplace 等页面]
        D2 --> E2[服务器检测到非浏览器请求<br>或缺少必要鉴权信息]
        E2 --> F2[返回 400 Bad Request 拒绝服务]
        C2 -.-> G2[wget 下载了 JS 文件但无法执行]
        G2 -.-> H2[无法发起 API 请求获取数据]
        H2 -.-> I2[本地只留下一堆空壳 HTML 和 JS]
    end

    style F2 fill:#ffcccc,stroke:#ff0000,stroke-width:2px
    style I2 fill:#ffcccc,stroke:#ff0000,stroke-width:2px

graph TD
    subgraph 正常浏览器访问流程
        A1[浏览器请求 excalidraw.com] --> B1[服务器返回 6.7K 的 index.html]
        B1 --> C1[浏览器解析 HTML 发现 JS/CSS/字体链接]
        C1 --> D1[浏览器下载 2MB 的核心 JS 文件]
        D1 --> E1[浏览器请求 .woff2 字体文件]
        E1 --> F1[服务器正确返回字体二进制文件]
        F1 --> G1[浏览器执行 JS 渲染画板]
        G1 --> H1[用户获得可交互的画板<br>且字体正常显示]
    end

    subgraph wget 爬取失败流程
        A2[wget 请求 excalidraw.com] --> B2[下载 6.7K 的 index.html]
        B2 --> C2[wget 解析 HTML 提取所有资源链接]
        C2 --> D2[wget 下载 2MB 的 JS 文件和 CSS]
        D2 --> E2[wget 尝试请求 .woff2 字体文件]
        E2 --> F2[服务器针对字体路径触发 SPA 回退机制<br>返回 index.html 内容]
        F2 --> G2[wget 收到 HTML 但请求的是字体]
        G2 --> H2[wget 强行加上 .html 后缀保存<br>本地得到无用的假字体文件]
        H2 --> I2[wget 不会执行下载的 JS]
        I2 --> J2[本地运行时字体缺失<br>且 file://协议可能导致 JS 模块加载失败]
    end

    style F2 fill:#ffcccc,stroke:#ff0000,stroke-width:2px
    style H2 fill:#ffcccc,stroke:#ff0000,stroke-width:2px
    style J2 fill:#ffcccc,stroke:#ff0000,stroke-width:2px
相关推荐
Eason_Lou13 小时前
【无标题】
前端·vue.js·html
anOnion14 小时前
构建无障碍组件之Menu and Menubar Pattern
前端·html·交互设计
Highcharts19 小时前
全功能施工项目管理甘特图 Demo:任务依赖箭头、当前日期标线、周末高亮、分组项目可视化
html·数据可视化
IMPYLH19 小时前
HTML 的 <h1>–<h6> 元素
前端·javascript·html
IMPYLH19 小时前
HTML 的 <head> 元素
前端·html
梦醒沉醉21 小时前
2、HTML入门——HTML元信息
html
莫问ABC1 天前
HTML、CSS、JavaScript 前端三件套
前端·css·html
葡萄城技术团队1 天前
告别宽表拖拽:SpreadJS 如何让 Web 表格承接 Excel 操作习惯
数据库·html·excel
zhanghaha13141 天前
HTML系列教程:2_HTML 编辑器(零基础超详细讲解
前端·编辑器·html