我一开始想做的事情很简单:把创作平台上的作品多保存一些,等以后需要参考图、提示词或版式时,可以少翻几页。真正动手以后才发现,“保存了多少文件”几乎不能回答“下次能不能复用”。如果只留下一个页面列表,原来的提示词找不到;如果只保存一个外链,链接过期后封面也打不开;如果只追求爬得更深,平台一限流,已经有的数据还可能被空结果覆盖。
这次我把问题重新拆开,最后保留了原始快照、本地索引和封面缓存 3 层。它们不是 3 份重复数据,而是分别解决“还能不能恢复”“找不找得到”和“看不看得见”。这件事让我重新意识到,创作资产真正的价值不在数量,而在下一次判断时,能不能把它重新调出来。
作品越多,越容易找不回来
资产刚开始积累时,按文件夹保存似乎已经够用。几百个文件还能靠记忆,看到缩略图也大概知道它来自哪次创作。但数量上来以后,文件名通常只能说明它被下载过,不能说明它为什么值得保存。用户真正想复用的,往往是某种提示词结构、某个模型的表现、一个适合电商海报的比例,或者一组已经验证过的颜色和话题标签。
当时本地索引库曾经用 22MB 保存 3442 条作品和 229 个技能的检索数据。这个数字看起来不大,却说明索引和原始文件承担的是不同工作:原始数据负责尽量完整地留下现场,索引负责让人按条件找到现场。如果没有索引,文件再多也只是仓库;如果没有原始快照,索引里即使能搜到,也未必还能回到完整上下文。
我真正要缓存的不是“下载成功的文件”,而是下一次创作可以重新利用的证据。
这里的证据包括提示词、模型、积分、创作过程、热度、比例、尺寸、颜色和话题标签。它们共同回答了几个实际问题:这张图是怎么做出来的,适合什么场景,为什么当时值得注意,以及我下次应该从哪一个参数开始改。如果这些内容被丢掉,保存动作就只剩下占用空间,少了判断依据。
表面上是抓取,实际上是数据分层
最容易误判的地方,是把这件事理解成“再多爬几页”。页数增加确实会带来更多样本,却不能保证样本可恢复、可检索、可验证。一个列表接口返回了作品,不代表它会永久保留封面;一次请求成功,也不代表下一次还能用相同的链接打开。
所以我选择把数据分成 3 层。第一层是原始快照,尽量保留平台当时返回的完整字段,便于后续修复索引或重新解释。第二层是本地结构化索引,把未来会用来筛选的字段单独存好,并支持全文搜索。第三层是封面缓存,保存一份本地可读的视觉证据,让搜索结果不必依赖会过期的签名直链。
我判断这比单纯扩大抓取页数更值得做,是因为复用通常发生在很具体的时刻:我记得“有一张电商海报不错”,但不记得它的原始标题;我记得“某个比例适合竖版”,却不想重新打开几百个页面。此时,索引要先给出候选,封面要帮助我确认,原始快照则在需要深入复盘时提供上下文。3 层之间有分工,找回路径才不会卡在某一条外部链接上。
规模增长后,容量本身也会误导人
这套结构很快遇到一个现实问题:资产库不是几百张图,而是会继续增长的长期仓库。按当时的估算,每万条作品的索引规模约 60MB;实际深爬以后,原始快照达到 1.8GB,索引 271MB,封面 29MB。不同层的体积差异很大,不能用“总共多少文件”来判断系统是否健康。
原始快照大,是因为它保留了恢复所需的上下文;索引相对集中,是因为它只存检索需要的字段;封面较小,是因为它承担的是快速预览,不必替代原图。这个比例让我看到一个重要区别:容量不是越小越好,关键是每一层是否在完成自己的职责。为了节省空间而删掉提示词,可能让未来的复用成本远高于今天省下的存储;为了追求完整而把所有临时响应都塞进搜索层,又会让查询和维护变重。
如果不处理这种分层,后面会导致两种浪费。一种是“看得见但用不了”:只有图片,没有做法;另一种是“存得下但找不到”:字段很多,却没有围绕复用建立索引。前者浪费创作过程,后者浪费检索时间。两者最后都会把人推回平台重新翻页。
限流时,最危险的是把空结果当真相
深爬过程中,平台返回过空包,也触发过限流。更麻烦的是,原来的脚本曾经把空结果写回去,错误覆盖了 12 个分类的浅快照。表面上看,任务没有报错,文件也正常更新;实际上,旧数据已经被一个暂时失败的响应替换了。
这里最容易走的错误捷径是:只要请求完成,就用新结果覆盖旧结果。它把“请求结束”误当成“数据有效”,把网络状态伪装成内容事实。对于增量抓取来说,空结果并不等于平台确认这个分类没有内容,更可能意味着限流、超时、会话失效或响应格式发生变化。
我后来把规则改成:空结果不覆盖已有数据,抓取过程支持增量、断点续爬,并在限流时停下来观察,而不是立即扩大并发。这个决定看起来保守,但它保护的是已经付出成本的数据。一个采集流程是否可靠,不看顺利时抓得多快,而看失败时能不能保住上一次有效结果。
这条规则也适用于其他外部数据源。只要新响应可能因为网络或平台策略暂时失真,就不能把“没有拿到”写成“确实没有”。保留旧快照不是拖泥带水,而是给不稳定的外部世界留一个可回退的事实版本。
本地搜索的价值,是把证据变成下一步动作
完成索引以后,我用“电商 海报”做本地搜索,耗时约 0.1 秒。这个数字的意义不只是快,而是搜索已经从“重新访问平台”变成“先在本地做判断”。我可以先按关键词找到候选,再根据热度、比例、尺寸和封面确认方向,只有在确实需要时,才回到外部页面补充信息。
这种顺序降低了两个风险。第一,签名链接过期时,候选仍然有本地封面可看,不会因为一条外链失效就丢掉视觉证据。第二,平台限流时,已经进入本地索引的作品仍然能被按条件找回,不需要反复刷新页面。本地缓存的核心不是替外部平台做永久镜像,而是让关键判断不再完全依赖外部平台当下是否配合。
我更愿意把封面看成证据的一部分,而不是装饰。文字字段能告诉我它可能符合条件,封面则能让我判断构图、留白、主体和整体气质是否真的值得参考。如果只存结构化字段,搜索结果仍可能停在“看起来相关”;如果只存封面,又无法解释它如何产生。文字和视觉放在一起,才形成能支持复用的最小闭环。
可复用的方法:先定义证据,再安排抓取
这次之后,我把流程总结成一个比较克制的规则。先问未来要怎样复用,再决定今天保存什么。需要按提示词找,就把提示词和创作过程设为核心字段;需要按视觉筛选,就准备本地封面;需要判断趋势,就保留热度、比例和标签。字段不是越多越好,而是每个字段都要能改变下一步选择。
接着把存储分成原始层、索引层和视觉层。原始层用于恢复,索引层用于搜索,视觉层用于确认。抓取时采用增量和断点续爬,遇到限流先降低动作强度;遇到空包,先判定响应是否可信,不能直接覆盖已有快照。最后用真实任务验收,而不是只看文件数量:能否按一个自然语言关键词快速搜到,能否在外链失效时看到封面,能否根据字段回到原始上下文,能否从中提炼下一次创作的起点?
这个方法的重点不是一定要使用某种数据库,也不是一定要把所有页面都保存下来。真正重要的是把“可恢复、可检索、可验证”作为 3 个独立目标。一个流程如果只满足其中一个,短期看似完成,长期就会在复用时重新付费。
下次我会怎么做
下次再建立创作资产库,我会先写一张复用清单,而不是先决定要抓多少页。清单里只放会影响判断的字段:提示词、模型、创作过程、热度、比例、尺寸、颜色、标签和封面。然后先做小规模样本,验证搜索结果是否真的能支持选择,再逐步扩大抓取范围。
我也会把“空结果保护”和“本地封面”放在最早的设计里,而不是等平台限流后再补。前者保护已经获得的事实,后者保护视觉判断。两者都在提醒我:外部资源可以随时变化,自己的复用能力不能只建立在一条暂时有效的链接上。
最终我想留下的不是一个越来越大的文件夹,而是一套能让未来的我少猜一步的证据系统。资产积累的终点,不是把过去堆在那里,而是让过去在下一次创作开始时仍然能够回答问题。