对抗 link rot
随着建站变得越来越容易,网页消失似乎也变得更频繁。作为个人,我们有什么办法可以拯救这些失效的超链接?
一、消失的网页
几年前我曾经写过一篇有关 link rot 的文章,提到互联网上的各种「永久链接」并没有那么「永久」。许多个人博客,随着博客平台的倒闭而迁移了几次,里面的内容变得七零八落,最终可能所有文字都 随风而逝了。一些较为火爆的内容可能还有不少内容农场会转载,或是 Wayback Machine 帮忙存档,但是一些 较为小众的话题,可能就永久地佚失了。
对于互联网上的简体中文内容来说,除了因为技术原因而消失,还要面临两大额外的挑战:
- 相当一部分简中内容产生自中国大陆网民,发布于中国大陆的网站上,受 中国政府言论审查制度的监管,极易被网站管理方删除;
- 许多内容生产者选择在以〇信公众号为首的封闭平台发布内容,而这些封闭平台的大部分内容只能在 app 内查看,即使有网页版本也有重重限制(登录后可见、禁止爬虫、禁止外链等)。
前一段时间,我较沉迷 某中国游戏公司开发的游戏,较多地访问 某大型中文游戏论坛,愈发深切地感受到 link rot 是多么令人恼火和惋惜。上一秒刚打开的页面,读了一半暂时离开一段时间,回来随手将页面一刷新或点击「下一页」,就变成了一行「帖子已被隐藏」。有时我会在该游戏的 英文社区看到一些转载自中文社区的帖子,但是随着原链点过去却发现原网页也莫名其妙地消失了。
我越来越想对抗 link rot 了。
二、消失的服务
当年 Google Reader 还在的时候,我会值得细读的文章转发至自己的邮箱,大概是我最早用过的 read-it-later 类型的服务了。后来我用过几种不同的 RSS 阅读器,也用过 Instapaper、Pocket (Read It Later) 等不同的保存文章的服务。诚然,这些服务能在一定程度上对抗 link rot,让你有地方能找回自己曾经读过但现已消失的文章;但其实除了 Google Reader 那样将全文发送到自己邮箱里,其他服务本质上只是把内容消失的风险从一家转移到另一家而已。Instapaper 诞生后好多年,用户百万,但 全公司只有一个人;Pocket 现在有 Mozilla 这座靠山,但大公司也不能保证把某个服务长久地运营下去。
这几年我越来越 不信任「云」了。用户把数据存在某个服务里,一旦这个服务开始劣化甚至倒闭,用户只能像难民一样试图迁移到另一个服务,但原始的服务不一定提供数据导出,就算导出了,也不一定能顺利地导入到新服务里。我可以接受的「云」的用法是:
- 将数据保存成开放、通用、易解析的格式;
- 将这些数据遵循 3-2-1 原则, 备份到「云」上。
我希望我对抗 link rot 保存下来的内容也能符合这样的规则,不要锁死某一家服务,而是处于一个「 这家倒闭了我立刻可以轻易地迁移到别家」的状态。 No vendor lock-in. No strings attached.
三、保存网页的方法
Wayback Machine 是世界上最大的网页存档服务之一,它的历史几乎和互联网一样久,按说已经 too big to fail 了,但我还是对它不够信任。我曾经想过要是能自己搭一个类似的存档服务就好了。我几个月前搭了个 ArchiveBox 用了一段时间,但很快发现它最大的局限性:无法保存需要用户登录之后才能访问到的页面。于是我发现我的思路有问题:我不应该找存档、管理、展示一体的服务,而是先把内容保存下来,再想办法管理和展示它们。
我的浏览器里一直装着一个叫 SingleFile 的扩展,可以将渲染后的页面存成单个 HTML 文件,用 Base64 内嵌所有的外部资源,使这个 HTML 文件在断网的情况下也能 100% 还原页面被保存时的样子。SingleFile 生成的文件是单个 HTML,且即使是像 TweetDeck、Google Docs、Figma 这种非常复杂的页面也能保存并在离线状态下原样打开。我装了这个扩展之后主要用来整活,代替截图,临时保存一些不容易再现的页面(比如有次 Redis 官网挂了,出现了 Redis 错误,十分喜感,我就 保存下来了),也许我可以用它来存档网页?
那么还缺少一个管理这些保存下来的 HTML 文件的方法。
四、管理离线网页的方法・其一
我首先想到的是像 macOS Finder 那样用标签来管理文件。我找到一个叫 TagSpaces 的项目,算是一个文件管理与笔记结合在一起的软件,但它与流行的类似软件(OneNote、Notion、Evernote)设计思路不太一样。我粗略使用了一下,理念还是很不错的:
- 无集中数据库,用户可以选择把标签等信息直接塞到文件名里(如
foo.html
会变成foo[tag1].html
),或是存到 sidecar JSON 里; - 无账号系统,也不需要设置一个专门的目录用来存储内容,而是任意打开一个目录就可以开始查看和管理里面的文件;
- 软件操作的是文件本身,并不关心你的文件存在哪里,因此你可以用 Dropbox / Syncthing 之类的方案自己做多设备同步,也可以选择直接把文件存到 S3 之类的对象存储上,在各设备上访问。
TagSpaces 从设计理念上避免了 vendor lock-in,用户只是用 TagSpaces 来管理内容,而不是把内容绑死在 TagSpaces 上。TagSpaces 倒闭了,用户的内容依然在用户手里。
TagSpaces 还提供了一个 浏览器扩展,用 readability 解析页面之后将其保存成结构较为简单的 HTML,但我更喜欢 SingleFile 这样将页面完整保存下来。
TagSpaces 虽然是开源软件,但官方免费提供的二进制包只有最基础的功能,如果要完整功能的话,需要付费购买 PRO 版本的二进制包,或者自己编译。
五、管理离线网页的方法・其二
和 Uucky 聊到 TagSpaces 的时候,她问我「你最需要的付费功能是什么?」,我说是全文搜索。她说这不是 Windows 和 macOS 自带的功能吗?我如梦初醒——既然这些离线网页本身只是 HTML 文件,而不是什么专有格式,那我直接对着它们搜索不就行了?为啥一定要在 TagSpaces 里搜索?
我调查了一下,找到一款 Linux 可用的全文搜索方案 Recoll。Recoll 以成熟强大的 Xapian 引擎作为后端,以 Qt 作为前端,也能跨平台运行(但 Windows 和 macOS 用户直接用系统自带的搜索就行,不需要 Recoll)。
Recoll 默认会索引整个家目录,我将其改为只索引离线网页所在的目录,再配置一下 实时索引服务,其他的配置都按照默认的来就挺好。
仔细想想,Gmail 有标签功能,但我其实很少通过标签来找邮件。我真的需要 TagSpaces 来手动 tagging 文件吗?有全文检索的话,我直接搜索关键词不就行了?于是我选择了 Recoll 而不是 TagSpaces。
六、尾声
我对抗 link rot 的方案就这么拼拼凑凑地完成了:
- SingleFile 保存网页到本地;
- Recoll 实时索引这些文件,提供全文搜索;
- BorgBackup 把文件备份到 home server 及异地存储。
如果想要在多台设备上访问的话,还可以考虑用 recoll-webui 提供网页搜索接口。
如果是在手机上遇到想保存的文章但是电脑不在身边怎么办?目前似乎没有像 SingleFile 那样能在手机浏览器中保存 DOM 的方案,那只能通过外部访问保存未登录的页面了。上文提到的 ArchiveBox 内建的多种存档方式里有一种就是 headless Chromium + SingleFile,可以在手机上将链接提交给 ArchiveBox 存档,然后再将 ArchiveBox 生成的 SingleFile 文件加到 Recoll 监视的目录。
本文地址: https://wzyboy.im/post/1437.html 。转载请注明出处。
读者来信
2021-10-21 读者 AI 推荐了类似 Evernote 但是支持自建服务器的笔记软件 Joplin,和快速提交 URL 到 Wayback Machine 等网页存档服务的 Telegram Bot @wabarc_bot。
這方案比我的要更UNIX一些…… 我筆記、webclipper、全文搜索三合一,之前是evernote,現在joplin,自建服務端可以定期導出數據庫備份,有多功能webclipper,簡化版帶圖和基礎樣式,圖多時占用空間比singlefile小不少
— AI October 22, 2021
手機上鏈接會發給電報wabarc_bot,主要是防夾,沒法保存登錄狀態的DOM
2021-10-21 读者一阁推荐了在 Chrome 中打印网页为 PDF 并保存至 Google Drive,让 Google Drive 来索引 PDF 中的文字的思路。这一方法可用于在手机上保存已登录的页面。
我选择Google Chrome打印网页到PDF直接保存到Google Drive,索引可以依赖Google Drive
— 一阁 (@yegle) October 22, 2021