Playwright 接管本地 Chrome:四种方式对比

Playwright 默认下载并使用自带的 Chromium。想用本机装的 Google Chrome(自动化登录时保留 cookie、复用插件),有四种方式,各自适用场景不同。

方式一:channel = “chrome”

最省事——channel: "chrome" 告诉 Playwright 用系统装的稳定版 Chrome:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(channel="chrome", headless=False)
    page = browser.new_page()
    page.goto("https://example.com")
    input("回车退出")
    browser.close()
  • 优点:跨平台一行搞定
  • 局限:不会用你日常那个 profile,不带 cookie、不带插件

其它可选 channel:msedgechrome-betachrome-devmsedge-beta

方式二:executable_path 指定路径

Chrome 装在非默认路径,或者想用 Chromium 兼容分发(Brave、Edge、Vivaldi):

Windows

browser = p.chromium.launch(
    executable_path=r"C:\Program Files\Google\Chrome\Application\chrome.exe",
    headless=False,
)

macOS

browser = p.chromium.launch(
    executable_path="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
    headless=False,
)

Linux

browser = p.chromium.launch(
    executable_path="/usr/bin/google-chrome",
    headless=False,
)

跟方式一一样,不带 cookie / 插件——只是换了浏览器可执行文件。

方式三:launchPersistentContext 复用 profile

想让 Playwright 用日常那个 Chrome 用户目录(复用登录态、书签、扩展):

browser = p.chromium.launch_persistent_context(
    user_data_dir=r"C:\Users\<你>\AppData\Local\Google\Chrome\User Data",
    channel="chrome",
    headless=False,
)
page = browser.pages[0] if browser.pages else browser.new_page()
page.goto("https://example.com")

注意:这个方式要求 Chrome 没在运行,否则报:

Failed to launch: browser closed. Profile is already in use

解法:

  • 关掉所有 Chrome 窗口再跑
  • 或者复制一份 profile 出来单独用:xcopy "C:\...\User Data" "D:\pw-profile" /E /I

想只用某个 Profile(不是 Default):

browser = p.chromium.launch_persistent_context(
    user_data_dir=r"D:\pw-profile",
    args=["--profile-directory=Profile 1"],
    channel="chrome",
    headless=False,
)

方式四:CDP 连接已启动的 Chrome(推荐)

方式三最大的痛点是”Chrome 必须关闭”。想在 Chrome 正常开着的情况下让 Playwright 接管它,走 CDP(Chrome DevTools Protocol)。

第一步:以 debug 模式启动 Chrome,指定端口:

"C:\Program Files\Google\Chrome\Application\chrome.exe" ^
  --remote-debugging-port=9222 ^
  --user-data-dir="D:\pw-chrome-profile"

--user-data-dir 指向一个专用目录,避免和日常 Chrome 抢占用。

第二步:Playwright 连上去:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp("http://127.0.0.1:9222")
    ctx = browser.contexts[0]
    page = ctx.pages[0] if ctx.pages else ctx.new_page()
    page.goto("https://example.com")

优势:

  • Chrome 一直开着,做完自动化 Playwright 断开就行
  • 保留登录态、插件、cookie
  • 可以边脚本操作边人工插手(做半自动化)

生产爬虫、账号自动登录场景基本用这个。

四种方式对比

方式Chrome 需关闭保留 profile使用场景
channel="chrome"简单自动化,无需登录态
executable_path=...用其它 Chromium 分发
launch_persistent_context一次性用现有 profile
connect_over_cdp (CDP)推荐:常驻 Chrome + 脚本联动

顺带:无痕、隐身、下载路径

无痕模式

browser = p.chromium.launch(channel="chrome", args=["--incognito"])

指定下载目录

context = browser.new_context(accept_downloads=True)
page = context.new_page()
async with page.expect_download() as info:
    await page.click("a#download")
download = await info.value
await download.save_as("D:/downloads/file.zip")

忽略证书错误(内网自签证书):

context = browser.new_context(ignore_https_errors=True)

一句话总结

普通自动化用 channel="chrome"要复用登录态用 CDP 连接(先手动启动 Chrome + --remote-debugging-port=9222)。launch_persistent_context 只在 Chrome 关闭时才能用。