随着建站变得越来越容易,网页消失似乎也变得更频繁。作为个人,我们有什么办法可以拯救这些失效的超链接?

一、消失的网页

几年前我曾经写过一篇有关 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 监视的目录。

更新:SingleFile 默认生成的文件名是页面标题 + 当前时间。这样的文件名并不利于排序和管理,建议在其设置页面更改默认文件名格式。比如我改成了 {date-iso}_{url-hostname}_{page-title}.html,这样按文件名排序的时候是相对比较有序的。当然,这些信息其实 SingleFile 也写在 HTML 文件开头的一小段注释里了,未来想要自己写个脚本解析这些信息再更改文件名也是可以的。

本文地址: https://wzyboy.im/post/1437.html 。转载请注明出处。


读者来信

2021-10-21 读者 AI 推荐了类似 Evernote 但是支持自建服务器的笔记软件 Joplin,和快速提交 URL 到 Wayback Machine 等网页存档服务的 Telegram Bot @wabarc_bot

2021-10-21 读者一阁推荐了在 Chrome 中打印网页为 PDF 并保存至 Google Drive,让 Google Drive 来索引 PDF 中的文字的思路。这一方法可用于在手机上保存已登录的页面。

2021-10-22 读者陈一斌 <c...@outlook.com> 来信推荐了 webscrapbook 这一款抓取工具。

关于您之前写的 Link rot 文章,我深有感触。因为我比较喜欢浏览博客,而中文博客应该是世界上消亡速度最快的私人内容了。

于是我找了一个可以下载网页,并进行管理的工具,这是我用了大概有 10 年的一个工具,是 Chrome 的套件,叫 WebScrapbook。前身是日本人开发的 Scrapbook Plus。

WebScrapbook 由台湾开发者开发,功能十分强大,可以高亮、标注、写便签,也可以直接保存成单独的网页,也可上传到网站上制作成一种资料搜集站,也提供了 RSS feed 功能,发布且订阅。

[...]

从私心来说,我希望这款工具不会那么快地消失……


欢迎留下评论。评论前,请先阅读《隐私声明》。