news 2026/8/17 21:37:05

一个 Python 脚本把整个网站离线保存到本地?WebSite-Downloader 快速上手指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一个 Python 脚本把整个网站离线保存到本地?WebSite-Downloader 快速上手指南

一个 Python 脚本把整个网站离线保存到本地?WebSite-Downloader 快速上手指南

【免费下载链接】WebSite-DownloaderA website downloader written with Python项目地址: https://gitcode.com/gh_mirrors/web/WebSite-Downloader

你有没有发现,自己越来越依赖那些"活在别人服务器上"的网页?技术文档、教程、灵感来源……它们平时用着顺手,可一旦站点关停、域名过期,这些内容说没就没,连备份的机会都不留。WebSite-Downloader正是为这个痛点而生的:一个用 Python 写成的网站离线下载工具,能把整站页面连同 CSS、图片、脚本一起搬回你的硬盘,断网也能看。

举个我亲历的例子:帮客户做官网迁移时,原外包团队跑路,服务器随时可能停摆,几十页产品资料、几百张配图危在旦夕。那一刻我比任何时候都确信——链接只是借来的"访问许可",文件才是自己的。

先看看它能产出什么:下载结果长什么样

WebSite-Downloader 不挑平台,也不挑站型。给它一个网址,它就会顺着页面链接一路爬,把 HTML、CSS、JS、图片、字体、PDF 甚至视频全部抓下来,并自动改写成本地可用的相对路径。抓取https://www.whsw.net/之后,你会在本地得到一个大致这样的目录:

whsw-site/ └── www.whsw.net/ ├── index.html ├── css/ ← 样式表已下载并改写 ├── js/ ← 脚本已下载 └── images/ ← 图片已下载

双击index.html,页面能像线上一样展示:样式生效、图片能看、链接能点——因为它把所有页面里的hrefsrc以及 CSS 里的url(...)全部重写成了本地文件之间的相对路径。整站搬迁,不外如此。

三分钟跑通首次下载:改一行代码即可

这个项目简单到"单文件即全部",没有第三方依赖,装好Python 3就能跑,pip install都省了。

第一步,获取代码:

git clone https://gitcode.com/gh_mirrors/web/WebSite-Downloader cd WebSite-Downloader

第二步,打开WebSite-Downloader.py,滚动到文件末尾(第 424-426 行),把示例网址换成你的目标站:

if __name__ == '__main__': manager = Manager('https://www.example.com') # 改成你要下载的网址 manager.start()

第三步,运行并等待:

python WebSite-Downloader.py

脚本立刻拉起 8 个子线程并发抓取,控制台逐条打印处理记录;当所有线程在 60 秒内都找不到新链接时,下载自动收尾,并以响铃提示完成。之后到以域名命名的文件夹里,双击index.html即可离线浏览。

藏在源码里的门道:三个设计细节值得细看

整个项目只有两类角色:Manager负责调度,Spider(继承自threading.Thread)负责搬砖。理解了它们,也就理解了整份代码。

门道一:生产-消费式的多线程流水线。Spider抓完一个页面,会顺手把页面里出现的有效链接塞进自己的links集合;Manager在主循环里不断轮询各线程,把新链接去重后丢回公共队列link_queue(源码第 99-113 行)。去重靠一个set完成,还顺带砍掉锚点(#后面的部分)和超过 250 字符的超长链接,保证 8 个线程各取所需、互不干扰。

门道二:只抓本站内容,靠"顶级域名"把关。is_valid_link(第 210 行)会过滤掉javascript:、邮件地址和data:image内嵌图片;对形如http://...的外站链接,则拿netloc里一级域名往后的部分与主域名比对,不一致直接放弃。所以你下载的是"这一个站",而不是"半个互联网"。

门道三:链接重写 + 三级编码兜底。handle_htmlhandle_css用正则抽出hrefsrcurl(...),逐条改写成相对路径再写回文件;落盘路径则交给get_abs_filepath统一映射。读取响应内容时,脚本依次尝试utf-8gb2312gbk三种解码(第 288-302 行),老式中文站点也不容易乱码。

如何按需改装:线程数、格式与超时都能调

  • 并发线程数:默认 8 个(第 88 行的range(8))。网络带宽充裕、对方服务器扛得住时,改成range(16)即可加速;建议不要盲目加到太大,爬太猛容易给对方服务器造成压力。
  • 支持的文件格式Spider.__init__里的other_suffixes集合(第 134-138 行)就是白名单,想支持新后缀直接往里加,比如'webp'
  • 超时与重试:全局默认超时 20 秒(第 15 行),遇到 mp3、mp4、pdf、zip 这类大文件会自动放宽到 600 秒(第 310-312 行);每个链接最多尝试 3 次(第 78 行的max_tries),超时类错误会自动重试,无需人工干预。
  • 输出目录:默认按"站点名-site/域名"组织,规则写在Manager.__init__里,想换个存放位置改一行即可。

新手避坑指南:5 个高频问题

  1. 动态渲染的站抓不全。脚本只解析静态 HTML/CSS,Vue、React 这类纯 JS 渲染的单页应用,可能只留下一副"空壳"。首次测试请选静态内容较多的站点。
  2. 外部 CDN 资源不会跟着下载。字体、统计脚本、第三方图床都在域名之外,会被过滤器拦下;本地打开时这些外链加载失败属正常现象。
  3. 重复运行会先清空目录。Manager启动时发现同名文件夹存在会直接删除重建(第 69-70 行),不要指望增量更新,也别把其他重要文件放进输出目录。
  4. 大站磁盘占用很猛。视频、PDF、大图动辄几个 GB,第一次建议只抓一个小栏目试水,再决定要不要全量。
  5. 报错先看log.log脚本把每次失败都按时间戳记在当前目录的这个文件里,超时、反爬、连接被重置一眼可见,先查日志再调参数,比瞎猜高效得多。

写在最后

网络上的内容没有什么是"永远在线"的。与其等到 404 那天追悔莫及,不如趁网站还在,把它搬回自己的硬盘。WebSite-Downloader 用四百多行纯标准库代码,就给了普通人"离线拥有一个网站"的能力:个人知识库、项目备份、离线演示、竞品结构分析,全都能派上用场。

找个你常看的静态站点,跑一次下载试试。你会发现,内容真正攥在自己手里的时候,心里才是最踏实的。

【免费下载链接】WebSite-DownloaderA website downloader written with Python项目地址: https://gitcode.com/gh_mirrors/web/WebSite-Downloader

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/17 21:36:25

基于Qwen小模型的本地AI智能体部署与实战指南

最近在尝试将大语言模型(LLM)应用到本地业务场景时,发现一个明显的趋势:动辄数百亿参数的大模型虽然能力强大,但在实际部署中常常面临硬件成本高、推理延迟大、隐私安全难保障等挑战。与此同时,以通义千问&…

作者头像 李华
网站建设 2026/8/17 21:29:49

Faraday 27B本地部署指南:从环境准备到智能体能力验证

这次我们来看一个在开源社区引发讨论的智能体项目:Faraday 27B。根据其发布信息,这个模型在特定基准测试中,声称其性能表现超越了 Claude Opus 4.8 和 GPT-5.5。对于关注本地部署、模型能力边界和成本控制的开发者来说,这无疑是一…

作者头像 李华
网站建设 2026/8/17 21:29:28

进化了百万年的人脚

进化了百万年的人脚,为什么教不会机器人好好走路? 作者:陈卫东 陈宝隆 | RobotSole | www.robotsole.com 做了这么多年机器人足底研发,我总被问一个问题:让机器人稳稳当当地走两步,怎么比让它下赢围棋、算破…

作者头像 李华