最近有个挺有意思的事儿,Datasette的创始人Simon Willison发了一个新插件,专门用来对付AI爬虫。但有意思的点在哪呢——他是用OpenAI的Codex,也就是基于GPT-5.5的AI编码工具来写的这个插件。用AI造的武器来防AI爬虫,你说这算不算以彼之道还施彼身?
哈哈对,确实挺讽刺的。不过说实话这事儿背后反映的问题其实挺严肃的。Simon的datasette.io网站一直在被各种行为不端的爬虫轰炸,你要知道Datasette这个工具本身就是做数据发布的,它能把SQLite数据库直接变成一个可交互的Web API,带过滤、排序、SQL查询这些功能。所以它天然就是爬虫的靶子——你给一个SQLite文件,它就自动生成一整套API端点,爬虫简直如鱼得水。
嗯,而且这些AI爬虫跟传统搜索引擎爬虫还不一样。搜索引擎爬虫好歹还遵守robots.txt,控制一下频率。AI训练数据的爬虫很多就是无视规则,高并发直接整站抓取。
对,而且Datasette这种场景更惨。因为爬虫可以组合不同的查询参数生成海量请求,每个请求都要触发数据库查询,消耗的资源比抓静态页面大得多。所以Simon就搞了这个datasette-ip-rate-limit插件,基于IP做速率限制。
那我们来聊聊这个插件的具体设计。我看了他的生产环境配置,其实思路挺清晰的,不是简单粗暴地限制所有流量。
没错,这是它最值得说的地方。它支持高度可配置的规则系统。首先有个header配置项,用来指定从哪个HTTP头获取客户端真实IP。Simon的站部署在Fly.io上,所以用的是Fly-Client-IP这个头。这其实是反向代理架构里的常见问题——服务器直接看到的连接来源是代理服务器,不是真实客户端,所以需要通过特定的HTTP头来传递原始IP。不同平台用的头名称不一样,Cloudflare用CF-Connecting-IP,通用标准是X-Forwarded-For,插件通过配置项来适配不同环境。
然后具体的限流规则呢?我看他设的是60秒内最多60次请求,超过就封禁20秒。这个数字其实挺宽松的。
对,相当于平均每秒一次请求。正常用户在网页上点来点去,几乎不可能触发这个限制。但自动化爬虫在短时间内遍历各种参数组合的表页面,很容易就超了。而且封禁时长才20秒,这体现了一个很好的设计哲学——惩罚但不过度。你想,万一误伤了正常用户,20秒后就恢复了,用户可能都没感觉到。
还有一个我觉得设计得很巧妙的地方,就是它支持通配符路径匹配。比如可以单独给global-power-plants这个数据库下的所有路径设规则,而不是一刀切。
这个太重要了。因为不同数据集被爬的程度完全不一样,有些公开演示数据库天然就是爬虫的重灾区。另外它还有路径豁免机制,比如/static下面的CSS、JS这些静态资源就不限流,本来就该走CDN缓存。还有一个特别值得说的,就是Cloudflare Turnstile验证码的路径也被豁免了。
这个我要追问一下,为什么验证码的路径必须豁免?
你想啊,Turnstile是Cloudflare的人机验证方案,它通过在页面里嵌入JavaScript脚本跟后端通信来完成验证,大多数情况下用户甚至感知不到。如果限流把验证脚本的通信给阻断了,那本来用来保护网站的验证机制反而失效了——这就成了一个安全悖论。所以这个路径必须放行。
嗯,还有个内存管理的问题。它用的是进程内存来追踪IP状态,设了一个max_keys上限是10000。
对,这是个经典的权衡。它本质上是一个LRU缓存,最近最少使用的IP记录会被淘汰。数字太小,活跃IP的记录可能被过早清掉;太大又吃内存。而且因为是内存存储,进程重启后状态就丢了。如果是更大规模的部署,可能需要用Redis这种外部存储来做分布式限流。不过对Simon的场景来说,这已经够用了。
说到开发方式,Simon用Codex来写这个插件这件事本身也挺有意思。他可是Datasette的核心维护者,对自己的插件体系了如指掌,但还是选择用AI来加速。
其实这恰恰说明了AI编码工具的价值所在。Codex跟ChatGPT里的对话式编码不一样,它更像一个异步工作的AI工程师——你提交任务描述,它在后台独立完成代码实现、测试、调试,然后提交结果。Simon用的是GPT-5.5 xhigh配置,这个xhigh是计算预算等级,意味着模型会投入更多推理资源来换取更高质量的输出。即使是经验丰富的开发者,面对一个需求明确的任务,AI也能显著缩短从问题到解决方案的周期。
最后我想总结一下这个插件的设计哲学,其实对整个Web开发社区都有参考价值。三个关键词:针对性防御、渐进式惩罚、可观测性。不是限制所有流量,而是找到最容易被滥用的路径单独设规则;短时间封禁而非永久拉黑;通过命名规则方便日志分析和策略调优。
嗯,而且它还给规则起了很具体的名字,比如public-demo-multi-parameter-table-pages,一看就知道这条规则在防什么。在AI爬虫越来越猖獗的今天,这种轻量但有效的防御方案真的很有价值。它不需要你上什么重型WAF,一个Python插件就能解决问题。对于用Datasette部署数据服务的开发者来说,这填补了一个重要的安全缺口。
用AI造的矛来防AI的盾,这个时代的攻防博弈确实越来越有意思了。好了,关于这个插件我们就聊到这儿,感兴趣的朋友可以去GitHub上搜datasette-ip-rate-limit看看具体实现。