如何解决Python+Selenium多实例运行时的Cookie SQLite Error 1555?
这个问题我之前帮朋友排查过类似的,核心原因是多个实例同时读写同一个Cookie数据库文件,SQLite本身对高并发写入的支持很差,直接触发了唯一约束冲突——你看到的UNIQUE constraint failed: cookies.creation_...就是最直接的证据。单个实例运行时没有竞争,自然没问题,但20个实例共享同一个用户数据目录(包括Cookie数据库)就会撞车。
下面给你几个可行的解决方案,按推荐优先级排序:
1. 给每个实例分配独立的用户数据目录(最优方案)
这是最彻底的解决办法,让每个实例拥有完全独立的Cookie存储,从根源上避免竞争。
如果你用的是Chrome/Chromium内核的自动化工具(比如Playwright、Selenium with ChromeDriver),只需要在启动参数里指定不同的--user-data-dir路径就行。举个Python+Playwright的示例:
from playwright.sync_api import sync_playwright import os # 循环创建20个独立实例 for instance_id in range(20): # 为每个实例生成唯一的配置目录 profile_dir = f"./auto-profiles/profile-{instance_id}" os.makedirs(profile_dir, exist_ok=True) # 启动带独立配置的浏览器上下文 browser_context = sync_playwright().start().chromium.launch_persistent_context( user_data_dir=profile_dir, headless=False, args=["--no-sandbox"] ) # 执行你的登录、跳转逻辑 page = browser_context.new_page() page.goto("你的目标网站地址") # ... 后续登录操作
每个实例的Cookie数据库完全隔离,再也不会出现写入冲突。
2. 使用隐身模式(临时快速方案)
如果不需要持久化Cookie(每次实例启动都可以重新登录),可以直接用隐身模式启动实例。隐身模式下,每个实例的Cookie都是临时内存存储,不会写入到共享的SQLite数据库,自然不会有冲突。
比如在Playwright里:
browser = sync_playwright().start().chromium.launch() # 每个实例创建独立的隐身上下文 context = browser.new_context(incognito=True) page = context.new_page()
Selenium的ChromeOptions也可以添加--incognito参数实现同样效果。
3. 加锁控制Cookie写入(不推荐,仅特殊场景用)
如果必须共享Cookie数据,那只能在代码里实现进程锁,确保同一时间只有一个实例在写入Cookie数据库。但这种方法会大幅降低多实例的并行效率,实现起来也复杂,除非有特殊业务需求,否则不建议用。
补充:你看到的
Cookie sqlite error 1555就是SQLite的SQLITE_CONSTRAINT_UNIQUE错误,完全匹配多进程并发写入冲突的场景,用独立用户目录的方案应该能直接解决问题。
内容的提问来源于stack exchange,提问作者Otaku Wiz

