公司动态

Wget静态网站前端

📅 2026/8/19 13:32:55
Wget静态网站前端
看到一个做的挺不错的前端网页所以想爬下来wget --mirror --convert-links --adjust-extension --page-requisites --no-parent Checking your browser...工作原理下载首页 HTML 文件解析 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.txtrobots.txt是一个君子协定告诉爬虫哪些路径可以访问哪些不可以(没有强制力)。 Wget会遵守robots.txt会尊重网站的爬虫限制一个 robots.txt 文件示例User-agent: * # 适用于所有爬虫Disallow: /admin/ # 禁止爬取 /admin/ 目录下的内容Disallow: /private.pdf # 禁止爬取这个文件Allow: / # 允许爬取其他所有内容Wget不适用于现代 SPA单页应用网站SPA是什么SPA 的核心思想是整个网站只有一个 HTML 页面。用户点击导航栏时页面不会整体刷新而是通过 JavaScript 动态地替换页面中的内容从而提供类似桌面应用的流畅体验。只有一个“空壳” HTMLwget 下载到的 index.html 通常是这样的!DOCTYPE htmlhtmlheadtitleMy App/titlelink href/css/app.css relstylesheet/headbodydiv idroot/div !-- 所有内容最终都由 JS 渲染到这里 --script src/js/app.js/script/body/html这个页面本身没有任何可见内容只是一个空壳。内容完全由 JavaScript 动态生成所有的页面内容、路由、数据请求都由那个巨大的 app.js 文件在浏览器中执行后来完成。wget 下载了 app.js 但没有执行所以它抓取到的永远是一个空壳。路由由前端管理传统网站中/a 和 /b 对应服务器上两个不同的 HTML 文件。在 SPA 中/a 和 /b 是前端路由它们都指向同一个 index.html 文件只是 JS 会根据 URL 的不同在 div idroot 里渲染出不同的内容。总结对于 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[资源文件brCSS/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