一个 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,页面能像线上一样展示:样式生效、图片能看、链接能点——因为它把所有页面里的href、src以及 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_html和handle_css用正则抽出href、src、url(...),逐条改写成相对路径再写回文件;落盘路径则交给get_abs_filepath统一映射。读取响应内容时,脚本依次尝试utf-8、gb2312、gbk三种解码(第 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 个高频问题
- 动态渲染的站抓不全。脚本只解析静态 HTML/CSS,Vue、React 这类纯 JS 渲染的单页应用,可能只留下一副"空壳"。首次测试请选静态内容较多的站点。
- 外部 CDN 资源不会跟着下载。字体、统计脚本、第三方图床都在域名之外,会被过滤器拦下;本地打开时这些外链加载失败属正常现象。
- 重复运行会先清空目录。
Manager启动时发现同名文件夹存在会直接删除重建(第 69-70 行),不要指望增量更新,也别把其他重要文件放进输出目录。 - 大站磁盘占用很猛。视频、PDF、大图动辄几个 GB,第一次建议只抓一个小栏目试水,再决定要不要全量。
- 报错先看
log.log。脚本把每次失败都按时间戳记在当前目录的这个文件里,超时、反爬、连接被重置一眼可见,先查日志再调参数,比瞎猜高效得多。
写在最后
网络上的内容没有什么是"永远在线"的。与其等到 404 那天追悔莫及,不如趁网站还在,把它搬回自己的硬盘。WebSite-Downloader 用四百多行纯标准库代码,就给了普通人"离线拥有一个网站"的能力:个人知识库、项目备份、离线演示、竞品结构分析,全都能派上用场。
找个你常看的静态站点,跑一次下载试试。你会发现,内容真正攥在自己手里的时候,心里才是最踏实的。
【免费下载链接】WebSite-DownloaderA website downloader written with Python项目地址: https://gitcode.com/gh_mirrors/web/WebSite-Downloader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考