
本文详解 Nodriver 在新版 Chrome(116+)中因弃用旧版 --headless 参数导致启动失败的问题,提供兼容性修复方法及完整可运行代码。
本文详解 nodriver 在新版 chrome(116+)中因弃用旧版 `--headless` 参数导致启动失败的问题,提供兼容性修复方法及完整可运行代码。
nodriver 是 undetected-chromedriver 的现代异步继任者,专为规避自动化检测而设计。然而,自 Chrome 116 起,官方彻底废弃了传统的 --headless 标志,仅支持 --headless=new(即 Chromium 新无头后端)。而早期版本的 nodriver(如 v0.3.1 及之前)仍尝试使用已失效的旧协议逻辑初始化无头环境,最终在 _prepare_headless() 内部调用中因无法解析响应返回 None,引发 TypeError: cannot unpack non-iterable NoneType object 错误。
根本原因在于 nodriver 默认未显式传递符合新版 Chrome 规范的 headless 启动参数,其内部逻辑依赖于过时的 CDP 行为判断,导致连接准备阶段崩溃。
✅ 正确解决方案:显式指定 --headless=new 参数
需通过 browser_args 手动注入合规参数,并禁用冲突选项(如 --headless 自动推导):
import nodriver as uc
async def main():
# 显式配置兼容新版 Chrome 的无头参数
config = uc.Config(
browser_args=[
"--headless=new", # ✅ 强制启用新版无头模式
"--no-sandbox",
"--disable-gpu",
"--disable-dev-shm-usage",
"--disable-extensions",
"--disable-blink-features=AutomationControlled",
],
# 可选:指定 Chrome 可执行文件路径(若自动检测失败)
# user_data_dir=None,
)
browser = await uc.start(config=config)
page = await browser.get('https://bot.sannysoft.com/')
print("Page loaded successfully in headless mode!")
await page.sleep(2) # 等待页面渲染
await browser.stop()
if __name__ == '__main__':
uc.loop().run_until_complete(main())
⚠️ 关键注意事项:
- 不要同时设置
headless=True和--headless=new:nodriver的headless=True参数会触发内部旧逻辑,与手动传参冲突,应完全移除该关键字参数,仅靠browser_args控制; - 确保 Chrome 版本 ≥ 116(推荐使用最新稳定版),可通过
chrome --version验证; - 若仍报错,请升级
nodriver至最新版(≥ v0.4.0):pip install -U nodriver,新版本已原生支持--headless=new自动适配; - Linux/macOS 用户需额外添加
--single-process或确保沙箱权限配置正确; -
--headless=new不支持--remote-debugging-port,调试时请临时改用--headless=old(仅限开发验证)。
总结:该问题本质是浏览器底层演进与库适配滞后的典型场景。通过显式声明 --headless=new 并规避自动 headless 推导逻辑,即可稳定启用无头模式,兼顾反检测能力与现代 Chromium 兼容性。










