在AIGC(人工智能生成内容)浪潮中,大模型的底层竞争力往往取决于“数据喂养”的质量。对于Midjourney、Stable Diffusion等视觉生成业务而言,海量且高质量的“图文对(Image-Prompt pairs)”是优化模型表现、建立垂类Prompt知识库的战略级资产。
然而,面对ArtStation、Civitai等顶尖图库网站日益严苛的防护机制,简单的脚本式爬虫早已捉襟见肘。如何以工业级的标准,实现降本增效、高并发、高可用的数据采集?今天,我们将站在大厂架构的视角,探讨AIGC提示词爬虫系统从单机时代到云原生时代的演进之路,并深入解析其中的核心代码实现。
一、 阶段一:单机时代的痛点与局限
在业务冷启动阶段,团队往往追求“糙快猛”。几行Python代码,配合 requests 或 selenium,一个单机爬虫就跑起来了。
但随着数据需求量从万级跃升至百万级,单机架构的三大痛点迅速暴露:
- IP极速熔断: 单一节点的出口IP在短时间内产生高频并发,极易触发目标站点的WAF(Web应用防火墙),导致IP被长期封禁(HTTP 403/429)。
- 状态维持困难: 缺乏统一的Session管理,Cookie过期或User-Agent指纹被风控识别后,单机脚本只能被动宕机,需要人工介入重启。
- 性能天花板: 单机的网络I/O和CPU资源存在物理上限,无法满足亿级海量图库的日级更新监控。
二、 阶段二:分布式设计与高可用代理池
为了打破单机瓶颈,架构必须向横向扩展(Scale-out)演进。在分布式架构中,我们将爬虫系统拆分为调度中心(Master)**和**执行节点(Worker)。
在这个阶段,爬虫代理技术与动态指纹伪造成为了系统高可用性的核心保障。执行节点不再使用固定的机器IP,而是通过接入企业级代理服务(如爬虫代理),实现每次请求的IP动态轮换。
核心 Worker 节点代码实战
以下是分布式架构中,一个标准 Worker 节点抓取高质量图库并提取Prompt的核心逻辑。代码中集成了爬虫代理、浏览器模拟等。
import requests
import time
from requests.exceptions import RequestException
# =======================================================
# 亿牛云 爬虫代理企业级配置 (分布式Worker节点通用配置)
# 注:实际生产环境中,此类凭证应从配置中心(如Nacos/Apollo)动态拉取
# =======================================================
PROXY_DOMAIN = "proxy.16yun.cn" # 代理域名
PROXY_PORT = "81000" # 代理端口
PROXY_USER = "16YUN_USERNAME" # 分配的用户名
PROXY_PASS = "16YUN_PASSWORD" # 分配的密码
class AIGCDataWorker:
def __init__(self):
# 1. 构造代理连接爬虫代理
self.proxy_meta = f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_DOMAIN}:{PROXY_PORT}"
self.proxies = {
"http": self.proxy_meta,
"https": self.proxy_meta
}
# 2. 构造企业级请求指纹 (User-Agent & Cookie)
# 商业实践:结合UA池和Cookie池服务,每次请求随机或按权重获取
self.headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
"Accept": "application/json, text/plain, */*",
"Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8",
"Referer": "https://www.google.com/",
# 注入有效Cookie,维持会话状态,降低风控概率
"Cookie": "session_id=enterprise_token_998877; user_pref=high_res; acw_tc=123456789"
}
def fetch_prompt_data(self, target_api_url):
"""
执行图库API抓取任务
"""
try:
print(f"[Worker-Node] 正在通过爬虫代理集群请求目标: {target_api_url}")
# 发起带隧道代理和完整指纹的请求
response = requests.get(
url=target_api_url,
headers=self.headers,
proxies=self.proxies,
timeout=15 # 设置合理的超时时间,防止Worker阻塞
)
# 校验HTTP状态码
response.raise_for_status()
# 提取图文对数据
data = response.json()
self._process_data(data)
except RequestException as e:
print(f"[Worker-Node-Error] 请求异常,触发重试队列。详细信息: {e}")
# 商业实践:此处应将失败的URL打回消息队列(如RabbitMQ/Kafka)进行重试
def _process_data(self, data):
"""
解析并清洗Prompt数据
"""
print("[Worker-Node] 成功获取响应,开始解析Prompt与元数据...")
items = data.get("data", [])
for item in items:
image_url = item.get("source_image", "")
# 提取正向与反向提示词
positive_prompt = item.get("positive_prompt", "")
negative_prompt = item.get("negative_prompt", "")
# 商业实践:此处应将清洗后的数据写入数据湖或分布式数据库(如MongoDB/ES)
print(f"入库准备 -> 图片: {image_url} | 核心Prompt: {positive_prompt[:30]}...")
if __name__ == "__main__":
# 模拟从消息队列中获取到的图库分页API
target_gallery_api = "https://api.high-quality-ai-gallery.com/v2/images?tag=cyberpunk&page=1"
worker = AIGCDataWorker()
worker.fetch_prompt_data(target_gallery_api)
三、 阶段三:云原生部署与自动化运维 (Cloud-Native)
当业务进一步扩张,我们需要监控数百个图库站点的动态,分布式架构也需要向云原生进化。这一阶段的核心目标是极致的弹性伸缩与全链路的可观测性。
- Docker与Kubernetes (K8s) 容器化编排:
将上述的 Python Worker 代码打包成 Docker 镜像。通过 K8s 的 HPA (Horizontal Pod Autoscaler) 机制,根据当前消息队列(如 Kafka/RabbitMQ)中积压的 URL 任务数量,自动横向扩容或缩容 Pod(容器实例)的数量。任务多时,瞬间拉起上千个节点;任务少时,自动销毁释放资源,将计算成本降至最低。 - 指纹池与代理池的微服务化:
Cookie和User-Agent的更新不再硬编码在脚本中,而是抽象为一个独立的微服务(Fingerprint API)。同时,监控爬虫代理的连通率,通过熔断机制踢出偶发故障的代理节点。 - 全链路监控 (Prometheus + Grafana):
建立实时看板,监控爬虫集群的 RPS(每秒请求数)、HTTP状态码分布、代理网络延迟以及 Prompt 数据的日均产出量。一旦发现 403 状态码激增,立即触发飞书/钉钉报警,研发团队可第一时间调整抓取策略。
结语
在AIGC时代,提示词数据就是训练和优化模型的“原油”。从单机的简陋尝试,到分布式的代理与指纹对抗,再到云原生下的弹性调度,爬虫架构的每一次跃迁,本质上都是在解决商业层面的效率与成本问题。构建一套高可用的云原生数据采集引擎,才是AI团队保持长期竞争力的关键底座。