网站消失的前一晚,我用 1 行代码把整站离线下载到了本地——WebSite-Downloader 不踩坑记录
网站消失的前一晚,我用 1 行代码把整站离线下载到了本地——WebSite-Downloader 不踩坑记录
【免费下载链接】WebSite-DownloaderA website downloader written with Python项目地址: https://gitcode.com/gh_mirrors/web/WebSite-Downloader
朋友的博客因为服务器续费逾期,一夜之间全部下线。书签还在,页面却没了。这种事其实不罕见:网页生来脆弱,域名会过期、内容会被删、平台会倒闭,而你收藏夹里那些链接,从来都不真正属于你。WebSite-Downloader 是一个用 Python 写的网站离线下载工具,它做的事情很朴素——把整站连同 HTML、CSS、JS、图片、字体一并抓回硬盘,整理成一个本地文件夹,断网也能照常浏览。这篇笔记写给所有想给网站留一份本地副本、又不想碰复杂爬虫框架的人。
它和浏览器"另存为"的区别,藏在链接重写里
浏览器另存为网页,本质是复制"当前这一页"。图片、样式、脚本依然指向线上地址,一断网,页面立刻打回原形。WebSite-Downloader 的思路完全不同:它把整站当成一张关系网,顺着链接挨个抓取,再把页面里所有引用改写成相对路径,让本地副本自成一体。
原理并不玄乎。主线程的 Manager 维护一个待抓链接队列,默认 8 个 Spider 子线程并发取链接处理:HTML 里的 href、src 和 CSS 里的 url() 被正则抽出来,逐一判断是否属于目标站的顶级域名,属于才入队继续抓取,抓完再把绝对地址重写成../images/logo.png这类相对路径。图片、PDF、视频等资源则按扩展名直接下载,最终落地成一个以域名命名的文件夹。整个逻辑压缩在单个 WebSite-Downloader.py 文件里,想研究实现细节,直接打开翻就行。
值得多说一句:链接过滤只放行同一顶级域名(代码里的 top_domain 判断),所以它不会顺手把你的整个互联网搬回家。至于它到底怎么被启动起来,下一步其实只需要改一行代码。
把整个网站下载到本地的最短路径:改一行,跑一次
最短的运行路径只有三步:克隆仓库、打开文件、改一行。
git clone https://gitcode.com/gh_mirrors/web/WebSite-Downloader cd WebSite-Downloader翻到 WebSite-Downloader.py 的最后两行,把占位地址换成目标站:
if __name__ == '__main__': manager = Manager('https://www.example.com') manager.start()然后执行python WebSite-Downloader.py,控制台会打印实时进度,抓完还会响铃提醒。产物落在类似example-site/www.example.com/的目录里,双击 index.html 就能离线浏览整个网站下载结果,所有资源均已本地化。
跑通之后,有三个"旋钮"值得认识。第一个是并发线程数,Manager 构造时range(8)默认开 8 个子线程,网络好的话可以调到 16,但别贪心,给目标服务器留口气。第二个是 Spider 里的 other_suffixes 集合,遇到新格式(比如 webp)往里加一个后缀即可。第三个是 max_tries = 3,单个链接最多重试三次,失败的请求都会记进 log.log,排查问题先看它。跑通只是开始,真正会绊倒人的,是它"抓不下来"的那部分。
离线浏览网站之前,先认识 4 个它抓不下来的东西
工具再聪明也有边界,而且边界往往藏在细节里。🛎️
第一个坑是动态内容。靠 JavaScript 运行时才渲染出来的页面,抓回来只剩骨架,SPA 单页应用尤其明显——这类站点想离线下载,基本得另想办法。第二个坑是跨域资源。图床、CDN 上的文件因为域名不同会被过滤掉,抓完发现样式全丢,先怀疑这个原因,再去检查 CSS 是否真的落盘了。
第三个坑是编码。工具对响应做 utf-8、gb2312、gbk 三级解码尝试,老站基本都能蒙对,但极端情况会直接跳过并记入日志。第四个是"信任"问题:源码默认不校验 HTTPS 证书,为的是兼容证书过期的站点,代价是它不替你做安全判断,抓取来源不明的网站请自行斟酌。
最后是老生常谈的合规红线:下载前先看一眼 robots.txt,线程数别开太狠,抓下来的内容仅限个人备份与学习用途。大站动辄几个 GB,建议先只抓首页估个体量,再决定要不要整站拉取。把这些边界摸清楚,就该聊聊它真正值得托付的场景了。
它真正擅长的场景,和一句该说的提醒
说回值得用它的地方。我见过最舒服的用法,是把开源电子书、API 文档、技术教程整站下载成离线知识库,飞机上、隧道里随时可查;也有人拿它给个人站点做月度备份,与网页快照互为补充。这类静态或服务端渲染的内容站,正是它的主场。
抓下来的 HTML 已经是完整资产,接下来能做的事就多了——转成 PDF 归档、提取全文做本地检索、甚至二次加工成自己的笔记体系。不妨现在就挑一个你舍不得丢的静态博客,改一行代码,给它留一份本地副本。至于抓下来的内容能玩出什么花样,那就是下一个值得琢磨的问题了。
【免费下载链接】WebSite-DownloaderA website downloader written with Python项目地址: https://gitcode.com/gh_mirrors/web/WebSite-Downloader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考