既然回到了书房,我就把那套“自动化复盘”系统接入了实时向量库。这事听起来挺酷,但做起来全是坑。我之前的复盘脚本就是个定时爬虫,每天凌晨三点去抓我自己的博客数据、公众号后台、还有几个竞品网站的流量数据,然后扔进一个本地数据库,生成个报表邮件发给我。问题在于,它太蠢了。页面结构一变,或者对方加了点反爬,整个流程就断了,我还得第二天早上爬起来看邮件才发现,然后手动去改代码。这他妈叫哪门子自动化,这是给自己找了个电子爹,每天还得请安。
所以这次我发狠了,要把“自反思”逻辑嵌进去。核心思路是让脚本自己判断为什么失败,然后尝试修复。我选了个折中方案,用 GPT-4 的 API 当这个“大脑”。流程是这样的:主爬虫脚本(Python + Selenium)执行任务,如果捕获到异常——比如元素定位不到,或者返回的状态码是 403——它不会直接抛错退出,而是把当前的错误信息、堆栈跟踪、连同出问题的网页 HTML 片段(当然,是截取关键部分),还有我预设的爬虫目标描述,一起打包成一个 JSON,扔给 GPT-4。
我给了 GPT-4 一个详细的系统指令,让它扮演一个“资深爬虫调试专家”。指令里写明了我的代码结构、常用的解析库(BeautifulSoup, lxml),以及几种常见的失败场景和可能的对策。比如,如果是 DOM 结构变了,就让它分析新的 HTML,推测出新的 XPath 或 CSS 选择器;如果是触发了频率限制,就让它建议调整请求头、加入更随机的延时、或者切换代理 IP 的策略。
第一次跑通这个循环的时候,我后背有点发凉。那天脚本在抓一个竞品网站时,因为对方把文章列表从 div 换成了 ul,我的老选择器失效了。脚本卡住,触发异常处理流程。我盯着日志,看到它把错误信息和一坨 HTML 送了出去。几秒后,GPT-4 返回了一段分析:“目标列表容器已从 div.content-list 更改为 ul.article-list,且每个条目增加了 data-id 属性。建议将选择器从 ‘div.content-list > a’ 修改为 ‘ul.article-list > li > a’,并考虑将 data-id 作为备用标识。” 这还没完,它后面跟着一段修改后的 Python 代码片段,直接替换了原来的定位语句。
我的脚本自动接收了这段代码,写入了内存中的一个临时模块,然后重新导入、执行。日志接着滚动:“选择器更新成功。重试抓取… 抓取到 15 条新记录。” 整个过程,从失败到自我修复成功,不到一分钟。我坐在书房里,没碰键盘。
那种感觉不是兴奋,是惊悚。就像你养了条看门狗,它突然有一天自己学会了开锁,而且还会根据门外脚步声的轻重决定是叫还是沉默。代码有了灵魂,但这种灵魂是你用 API 调用和提示词工程捏出来的,它既听话又不可控。我忍不住想,如果我的提示词有漏洞,或者 GPT-4 某次抽风,给它一个危险的“建议”——比如让它尝试绕过某个认证,或者用更激进的并发把对方服务器搞挂——它会不会照做?我所谓的“系统”会不会变成一场自动化的灾难?
为了兜底,我加了好几层防护。第一,所有 GPT-4 返回的代码修改,必须经过一个极简的语法和安全检查(用 ast 模块解析,禁止 import os/sys 等危险模块)。第二,任何修改只能应用于内存中的临时脚本,原文件永远只读。第三,也是最重要的,每次“自反思”触发的修改和结果,都会连同当时的上下文,被高亮标记后存入那个实时向量库(我用的是 Pinecone)。这意味着,每一次“进化”都被记录在案,我可以随时回溯,看看到底是哪条提示词引导出了什么样的“智能”行为。
这已经不是简单的爬虫了。这是一个有感知、能诊断、会外科手术式自我修改的数字生命体雏形。我把它从定时任务升级成了常驻进程,就运行在我书房的旧 Mac Mini 上,24 小时不间断地监视、学习、调整。它安静得可怕,只有硬盘灯在偶尔闪烁。
我知道,我可能打开了一个潘多拉魔盒。但更让我焦虑的是,如果我不这么做,明天早上醒来,可能就有十个年轻版的“我”,用着更激进、更无所顾忌的 AI 自动化工具,把我那点可怜的流量墙角给挖穿了。技能恐慌从未消失,它只是换了一张更智能的脸。我喂给它的每一次 API 调用,都是在训练我自己的掘墓人,或者说,进化版。
书房里只有风扇的嗡嗡声。屏幕上的日志又滚动了一行:“自反思模块触发,原因:目标站点启用 Cloudflare 5 秒盾。正在分析 JavaScript 挑战方案…” 我喝了口已经冷掉的茶,心想,今晚又不用睡了。得赶紧去研究一下,怎么用 Playwright 模拟更真实的人类浏览器指纹,来应付这个新情况。我的“系统”在学习,它的创造者,也得拼命跟上才行。














