昨天下午四点十七分,我把那台 2018 年的 ThinkPad T480 从书架底层抽出来,屏幕亮起之前风扇先响了五秒。我打开浏览器,在地址栏里敲下「49图库官方网站下载地址」里给出的那个入口,准备把 2019 年澳门档案图最后一批共 42 张原图拖下来。进度条走到 87% 的时候停住了,停了整整六分钟,最后报了一个 HTTP 502。我盯着那个数字看了很久,不是因为生气下载失败——这种站点的带宽本来就不能指望——而是因为我突然意识到,我居然已经习惯把「87%」这个位置当成一个可以接受的失败点。这个认知比下载失败本身更让人恼火。

我关掉页面,打开终端,用 curl 把同一个地址的响应头抓下来。Content-Length 显示 4,812,336 字节,服务器是 nginx,返回 502 的那次连 Content-Length 都没给全。

这件事的荒谬之处在于信息的不对称。你在页面上看到的是一个漂亮的图片列表,缩略图排得整整齐齐,每张下面标注着期号和分类,点击下载按钮之后发生的事情——分片请求、CDN 回源、超时重试——全都藏在黑箱里。我后来去翻了一些技术文档,发现这类图库站点的图片分发通常走的是「列表页 → 详情页 → 原图直链」三段式,中间任何一段的链路抖动都会让下载变成一场碰运气。这不是 49 图库独有的问题,但当我真的需要那 42 张图来做一份港澳视觉档案的比对时,这个问题就变得非常具体了。我甚至一度怀疑是不是我的网络问题,直到我换到手机热点、又换到另一台机器上试了三次,才确认问题出在源站。

顺便说一句,那台 T480 的电池已经鼓了,我把它垫在一本 2015 年的《中国摄影》合订本上,角度刚刚好。这个细节没有任何技术意义,但我写下来是因为它构成了我那天下午的全部物理环境。

我真正想说的其实是另一个层面的事。像「下载49图库资料图片」这样的动作,看起来只是点一下按钮,实际上它牵涉到入口选择、版本兼容、图片命名规则、以及下载后的归档方式。举个具体的例子:同样是下载 2019 年澳门档案图,从 免费进入49图库 这条路径进去,列表页给的是按日期排序的瀑布流,而如果你用 恢复49图库资料中心新奥门特马4949.49版本 里描述的那种旧版入口,排序逻辑就变成了按期号递增,两者对同一批图片的编号是对不上的。我第一次混用这两个入口的时候,下下来的 42 张图里有 11 张是重复的、3 张是错期的,而我是在全部下载完、解压、按文件名排序之后才发现的。那个下午我坐在桌前,把 42 个文件名和原始列表页对了两遍,花了大概四十分钟。

这个教训后来被我写在一张便签上,贴在显示器边框:「入口决定编号,编号决定去重。」

再说版本问题。49 图库的页面结构在 2023 年到 2024 年之间至少改过两次,具体表现是原图直链的域名后缀从 .jpg 变成了带参数的动态地址,以及详情页里「下载原图」按钮的位置从右下角挪到了图片正下方。这听起来是小改动,但对批量下载来说是灾难性的——旧脚本里的选择器全部失效。我是参考了 免费下载49tk图库 里提到的兼容性思路,才把脚本里的 XPath 改成基于按钮文本匹配,而不是基于位置。改完之后成功率从 61% 提到了 94%,剩下的 6% 是纯粹的源站超时,跟脚本无关。

还有一个绕不开的环节是浏览器。我一开始用默认的 Chrome,但下载大图的时候它会自动把多个请求合并到一个队列里,导致后发的请求被前面的慢请求堵住。后来我换到 qq浏览器网页版入口链接 里提供的那个版本,它的下载管理器允许手动控制并发数,我设成同时 3 个,情况明显好转。这个发现其实挺讽刺的——我原本以为现代浏览器都差不多,但在「同时下载 40 多张 200KB 左右的小图」这个具体场景下,差异是实打实的。我用秒表记了一次:Chrome 下完 42 张用了 11 分 38 秒,换浏览器之后 4 分 52 秒,差了将近 7 分钟。

7 分钟够我泡一杯茶,也够我把上一批下载的图片按 EXIF 时间戳重新排一遍序。那天我两件事都做了。

说到归档,我想单独吐槽一下命名这件事。49 图库的图片文件名是随机的十六位字符串,像「a3f9c2e1b7d84509.jpg」这种,你在本地根本看不出它对应哪一期、哪个分类。我的做法是下载完立刻用列表页抓下来的元数据去重命名,格式是「日期_分类_序号」,比如「20190912_macau_017.jpg」。这一步不做,后面找图就是噩梦。而如果把重命名这一步省了,再多的下载技巧也等于零——你只是把一堆乱码从一个服务器搬到了自己的硬盘上。这是我个人的看法,可能有人觉得文件名无所谓,但我不这么认为。对于一个资料整理者来说,文件名的可读性就是你未来三小时的睡眠时间。

还有一个细节值得记下来:下载的时候不要一次性把整批任务全部丢进去。我试过一次性提交 80 张的下载列表,结果前 20 张正常、中间 30 张全部超时、后面 30 张直接返回 403。后来我改成每 15 张一批,每批之间停 20 秒,成功率就稳定了。这个 20 秒是我试出来的,没有理论依据,但它管用。源站有请求频率限制,这个限制不会写在任何公告里,你只能靠试。

403 那次我把浏览器控制台打开看了一眼,响应体是一段空白的 HTML,连错误提示都不给。这种沉默的拒绝比报错更让人无言。

写到这里我得回到那个 87% 了。后来我并没有把那 42 张图完整下载下来——其中有 5 张在重试了四次之后仍然失败,我放弃了,改从另一个镜像入口补了 3 张,剩下 2 张至今缺失。这件事的不完美让我有点难受,但它也促使我把整个流程写成了文档,包括入口的选择、浏览器的并发设置、分批策略、以及重命名规则。文档现在放在我的本地 wiki 里,标题就叫「下载49图库资料图片 流程备忘」。我写这个页面的目的之一,也是把这份备忘里可以公开的部分整理出来,省得下一个人再对着 87% 的进度条发呆六分钟。

文档里我标了红的一行是:「任何承诺一次下完的教程,都是没真正下过的人写的。」