深度解析塑造未来的技术文章。

网络正在失去记忆:对抗数字衰退

每年都有数百万网页从网上消失。链接腐烂如何威胁历史记录,以及开发者能做些什么来对抗数字衰退。

暗色图书馆大厅里,无尽的书架上的书籍正溶解成发光的像素

2014年,气候研究员Maria Chen博士发布了一份关于北极海冰融化的开创性数据集。她把数据放在大学的服务器上,在三篇同行评审论文中引用了它,还在十几个学术邮件列表里分享。到了2019年,大学迁移了网络基础设施,链接失效,数据集随之消失。任何公共档案库里都没有备份。五年的野外工作,就这样变成了一个404错误。

Chen的遭遇并不罕见,它其实就是常态。网络正在以惊人的速度丢失自己的记忆,而大多数人直到需要某样东西时,才发现它早已不见了。

链接腐烂与网络历史的悄然侵蚀

研究人员把这种现象称为链接腐烂(link rot),即URL一点点、无情地失效的过程。皮尤研究中心的一项研究发现,2013年的网页中,大约38%在十年内变得无法访问。这可不是什么可以忽略的误差。仅仅一年的内容,就有超过三分之一的网络知识消失了。

原因都很平常:公司合并、改名;托管费用没有续交;内容管理系统被替换;政府在换届后重组网站;博客作者去世,也没人续费域名。单看每一件事,都不像是什么大灾难,但它们会不断叠加。年复一年,网络像蜕皮一样,把自己的过去一层层抛掉。

后果也远不止停留在理论上。法院曾在法律意见书中引用某个URL,几个月后才发现它已经失效。记者丢失了原始素材。整个线上社区,包括他们的对话、圈内梗、创作作品和协作积累的知识,只因为某个平台决定转型或关停,就一夜之间被抹去。还记得Vine吗?Google+呢?最初的GeoCities呢?每一次关停,都抹掉了一段无法完全重建的文化历史。

网络存档为何越来越难,而不是越来越容易

你可能会觉得,我们在这件事上应该越来越擅长。存储很便宜,带宽很充裕,我们有成熟的存档工具,也有专门负责保存的机构。那为什么问题反而越来越严重?

两股力量正在叠加。第一是技术层面。现代网络比早期互联网那种静态HTML页面难存档得多。单页应用完全靠JavaScript渲染内容;API驱动的站点没有稳定的URL可供抓取;付费墙、登录验证和个性化内容流,让每个访问者看到的页面都不一样,包括存档爬虫看到的也一样。

第二是政治层面。大语言模型的爆发引发了一场针对网页爬取的反弹。出版商和站点所有者担心自己的内容在未经许可的情况下被用于训练AI,于是部署了激进的拦截手段:修改robots.txt、上线机器人检测,甚至封禁与数据采集相关的整段IP。

问题在于,这些拦截措施很少能区分商业AI爬虫和存档爬虫。互联网档案馆的Wayback Machine是遵守robots.txt的。一旦站点一刀切地屏蔽所有机器人,存档爬虫也被挡在门外。站长本想阻止AI训练,实际结果却是:他们的内容不会在任何历史记录中留存下来。

为了阻止AI抓取而屏蔽存档爬虫,就像为了防止别人复印一本书而把图书馆烧掉。出发点可以理解,但对历史记录造成的附带损失却是巨大的。

互联网档案馆:压力之下,依然不可或缺

互联网档案馆可以说是网络世界里最接近公共图书馆的存在。自1996年以来,它的Wayback Machine已经存档了超过8000亿个网页。这个数字已经足够惊人,但它仍然只是网上已发布内容的一小部分。

这家机构遭遇了严峻的阻力。围绕其Open Library借阅项目的法律纠纷消耗了大量资源和精力。更广泛的寒蝉效应也真实存在:其他机构看着这些诉讼,对于愿意存档什么变得更加谨慎。

但最大的挑战仍然是规模。网络的增长速度,远超任何单一机构的抓取能力。与此同时,网络向动态、重度依赖JavaScript的应用转变,传统爬虫能捕获的内容越来越少。一个从React应用下载原始HTML的爬虫,拿到的只是一个空的div和一堆JavaScript代码,而不是文章、图片或交互元素。

  • 客户端渲染的应用需要无头浏览器,才能捕获有意义的快照
  • API驱动的内容往往没有稳定、可抓取的URL
  • 视频、播客、交互式可视化等多媒体内容,需要专门的保存方案
  • 网络内容的增长速度远超任何单一机构的抓取能力
  • 法律上的不确定性让机构在存档时投鼠忌器

这并不是放弃集中式档案馆的理由,而是提醒我们:不能只依赖它们。

每位开发者都应该了解的自托管网络存档工具

好消息是,保存网络并不需要你是一家机构。越来越多的开源工具让个人和小团队也能轻松运行自己的存档基础设施,其中一些工具的能力相当强大。

ArchiveBox是个人使用场景中的佼佼者。它是一款自托管工具,能接收URL,并以HTML、PDF、截图、WARC等多种格式保存。你可以把浏览器书签、RSS订阅源或纯文本URL列表喂给它,它就会生成一个可以浏览的本地档案。安装配置只需几分钟:

# Set up ArchiveBox with Docker
docker pull archivebox/archivebox
mkdir -p ~/web-archive && cd ~/web-archive
docker run -v $PWD:/data -it archivebox/archivebox init --setup
# Archive some URLs
docker run -v $PWD:/data -it archivebox/archivebox add \
'https://example.com/important-report' \
'https://example.org/research-dataset'
# Launch the web UI to browse your archive
docker run -v $PWD:/data -p 8000:8000 archivebox/archivebox server 0.0.0.0:8000

对于重度依赖JavaScript的站点,Webrecorder采用了另一种思路。它不是去爬取,而是直接录制你真实的浏览器会话,包括每一个网络请求、每个动态加载的元素和每次交互。结果是一份高保真的捕获内容,以WARC或WACZ格式保存,并可以通过ReplayWeb.page在浏览器中回放。这就好比拍一张建筑照片和制作一段完整的三维漫游之间的区别。

Browsertrix同样来自Webrecorder项目,它把这种思路进一步扩展。它是一个云原生爬取系统,使用真实的浏览器实例来渲染和捕获页面。大学、图书馆和政府机构都用它来运行机构级的存档项目。如果你需要以完整的JavaScript渲染方式存档成千上万个页面,Browsertrix就是首选工具。

如何把保存理念融入你的开发工作流

你不需要搭建一整套存档系统,也能产生实际影响。网站的构建和部署方式中的一些小决策,对内容能否被保存有着不成比例的影响。以下几点才是真正关键的。

第一,从设计阶段就考虑可存档性。使用稳定、人类可读的URL,不要把URL结构绑定到数据库ID或会话令牌上。确保关键内容包含在初始HTML响应中,而不是在页面加载后完全依赖客户端JavaScript注入。如果你在做单页应用,就提供服务端渲染或静态生成作为兜底。这些做法不只对存档有益,对SEO、无障碍访问和性能同样有好处。

第二,robots.txt要精准配置。如果你想阻止AI训练爬虫,就按名称逐一屏蔽,不要把所有访问的机器人一锅端。

# robots.txt — block AI crawlers, welcome archival bots
# Explicitly allow archival crawlers
User-agent: ia_archiver
Allow: /
User-agent: archive.org_bot
Allow: /
# Block specific AI training crawlers
User-agent: GPTBot
Disallow: /
User-agent: Google-Extended
Disallow: /
User-agent: CCBot
Disallow: /
User-agent: anthropic-ai
Disallow: /
User-agent: ClaudeBot
Disallow: /
# Default: allow everything else
User-agent: *
Allow: /

这并不是完美的方案,因为User Agent字符串可以被伪造,但它是一种善意的尝试,既能为合理的保存工作保留通道,又能阻止未经授权的训练采集。

第三,把存档提交自动化。每次发布内容后,都把它提交给Wayback Machine。这只需要几行代码,就能接入任何CI/CD流水线或发布后钩子:

import requests
import time
def archive_url(url: str, retries: int = 3) -> str:
"""Submit a URL to the Wayback Machine's Save Page Now endpoint."""
save_url = f"https://web.archive.org/save/{url}"
for attempt in range(retries):
try:
resp = requests.get(save_url, timeout=30)
if resp.status_code == 200:
location = resp.headers.get("Content-Location", resp.url)
return f"Archived: https://web.archive.org{location}"
except requests.RequestException:
if attempt < retries - 1:
time.sleep(2 ** attempt)
return f"Failed to archive {url} after {retries} attempts"
# Wire this into your publish script
new_post = "https://yourblog.com/posts/new-article"
print(archive_url(new_post))

重试逻辑很重要。Wayback Machine的保存接口经常被大量请求冲击,临时性失败很常见。多一点容错,效果会好很多。

理解WARC:网络存档背后的文件格式

如果你打算处理网络存档,就必须了解WARC。它是ISO标准的文件格式,互联网档案馆、Webrecorder以及大多数正经的存档工具都在使用。可以把WARC文件理解为一页加载过程中所有HTTP请求和响应的完整记录:HTML、样式表、脚本、图片、API调用,全部都在里面。一切都在。

正是这种完整性让回放成为可能。WARC文件不只是保存原始HTML,它还保存了重建页面在捕获时刻原貌所需的全部上下文。下面是如何以编程方式读取它:

from warcio.archiveiterator import ArchiveIterator
def inspect_warc(filepath: str):
"""List all HTTP responses captured in a WARC file."""
with open(filepath, "rb") as stream:
for record in ArchiveIterator(stream):
if record.rec_type == "response":
url = record.rec_headers.get_header("WARC-Target-URI")
status = record.http_headers.get_statuscode()
content_type = record.http_headers.get_header("Content-Type")
print(f"[{status}] {url} ({content_type})")
inspect_warc("my-archive.warc.gz")

较新的WACZ格式在WARC的基础上,在ZIP容器中增加了索引和元数据层。实际好处非常明显:WACZ文件可以直接在浏览器中通过ReplayWeb.page打开,无需任何服务器基础设施。你可以把WACZ文件发邮件给别人,对方立刻就能浏览存档的网站。正是这种低门槛的访问方式,让保存工作真正有用,而不只是技术上可行。

社区存档与志愿者安全网

一些最具戏剧性的保存工作,都是在危机时刻完成的。当某个平台宣布关停时,名为ArchiveTeam的志愿者团体就会动员起来。他们已经从GeoCities、Vine、Google+以及数十个小型服务中抢救出内容。他们的做法很简单:在服务器断电之前,向即将关闭的平台发出海量存档请求,把所有内容以WARC格式保存,然后上传到互联网档案馆供公众访问。

任何人都可以参与。ArchiveTeam的Warrior工具是一个虚拟设备,你可以在自己的硬件上运行它。它会连接到他们的协调服务器,领取存档任务,并把你的带宽和算力贡献给正在进行的任何抢救行动。这是分布式存档最草根的形态。

但紧急抢救只是最后的手段。真正的目标是让保存成为常规工作。越来越多的特定领域社区正在挺身而出:开源项目存档自己的邮件列表和问题追踪器,文化遗产团体保存少数民族语言资源,新闻机构维护其深度调查报道的档案。工具已经有了,更难的是持续多年的人力协调和资金投入,以维持这些工作的运转。

实用数字保存工具包

如果你读到这里,并且想采取行动,这里是一份入门清单。以下都是当前在各种规模下最成熟、维护最好的网络存档工具。

  • ArchiveBox——自托管的个人存档工具,支持保存为HTML、PDF、WARC和截图格式,非常适合保存你自己的研究资料和参考文献。
  • Browsertrix——基于浏览器的机构级爬取工具,使用真实浏览器实例完整渲染JavaScript。
  • Webrecorder——录制你的浏览器会话,实现高保真的交互式捕获,输出WARC/WACZ文件。
  • ReplayWeb.page——直接在浏览器中回放WARC/WACZ文件,无需服务器。
  • SingleFile——浏览器扩展,可将完整网页保存为单个自包含的HTML文件,极其简单。
  • warcio——用于以编程方式读取、写入和处理WARC文件的Python库。
  • Heritrix——互联网档案馆的开源爬虫,工业级强度,学习曲线较陡。
  • ArchiveTeam Warrior——虚拟设备,用于加入分布式志愿者存档项目。
  • Wayback Machine APIs——以编程方式提交和获取存档页面的接口。
  • Conifer——托管式网络存档服务,适合不想自行托管的个人和小团队。

网络不会自己保存自己

有一种根深蒂固的说法,认为互联网从不遗忘。事实恰恰相反,它时时刻刻都在遗忘。网络更像一条河,而不是一座图书馆:内容在其中流动,除非有人刻意截取一份快照,否则源头一干涸,内容就消失了。

开发者在这件事上手握不小的杠杆。我们编写robots.txt,设计URL方案,决定采用服务端渲染还是客户端渲染,也搭建部署流水线。只要多写几行代码,这些流水线就能把每个新页面提交到公共档案库中。这些并不是什么英雄壮举,而只是一些微小的技术决策,却恰恰决定了网络的历史能否留存下来。

Chen博士的数据集至今依然不见踪影。链接失效之前,没有任何档案库抓取过它。但每天都有人发布着重要的内容:一篇深度新闻报道、一份科学数据集、一个会被引用多年的社区论坛帖子。问题不在于这些内容最终会不会消失,它们一定会。真正的问题是,在它们消失之前,是否有人已经先保存了一份副本。