6

对抗 link rot

 2 years ago
source link: https://wzyboy.im/post/1437.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

一、消失的网页

几年前我曾经写过一篇有关 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小不少
手機上鏈接會發給電報wabarc_bot,主要是防夾,沒法保存登錄狀態的DOM

— AI October 22, 2021

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

我选择Google Chrome打印网页到PDF直接保存到Google Drive,索引可以依赖Google Drive

— 一阁 (@yegle) October 22, 2021


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK