go控制浏览器的方式和简单代码示例
目前(2025/05/06)只用过chromedp和playwright-go两个库,在这里只说一下这两个库的使用,一些更深入的我也没研究。
1.简单比较
| chromedp | playwright-go | |
| 上手难度 | 代码比playwright稍微更麻烦一点 | 更容易上手 |
| 性能 | 据说是更好一些,实际中我使用它过cloudflare盾没太有感觉 | |
| 浏览器支持 | 打开chrome/chromium没问题,Edge没试过 | 可以打开多种浏览器 |
| 驱动 | 【好像不需要】安装chrome Driver,不知道是不是库给偷偷安装了 | 必须要安装驱动,或者代码中显示调用一个Install方法来安装驱动 |
| 连接Chrome方式 |
1.可以提前手动打开浏览器之后通过一个端口来连接Chrome 2.也可以通过代码打开Chrome后控制它 |
既可以提前打开Chrome,也可以通过代码打开Chrome |
| 限制 |
1.【未测试】文件大小是否限制 2.一台机器可以打开多个Chrome浏览器来进行控制 |
1.使用ConnectOverCDP连接已经打开的Chrome浏览器的时候,上传文件被限制到了50M,并且似乎没有解开的方式。只能使用LaunchPersistentContext来打开才能突破这个限制 2.同一台机器上,使用playwright似乎不能打开多个浏览器,控制会串到其它chrome实例 3.对于连接已经打开的Firefox浏览器,【没有测试成功】,也可能是我代码的问题 |
| 用户隔离 | 可以通过使用不同profile的方式来隔离,但是Chrome在V136及以后的版本不能使用默认用户目录 | 可以通过使用不同profile的方式来隔离,但是Chrome在V136及以后的版本不能使用默认用户目录 |
2.playwright-go连接已经在9222端口打开的Chrome浏览器
// ConnectToChromeInstance connects to a chrome instance context
//
// cdpUrl 为一个已经运行了调试端口的chrome实例的 url, 例 http://localhost:9222
func ConnectToChromeInstance(cdpUrl string) (playwright.BrowserContext, error) {
// 启动 Playwright 并连接到已经存在的 Chrome 实例
pw, err := playwright.Run()
if err != nil {
return nil, fmt.Errorf("ConnectToChromeInstance 无法启动 Playwright: %v", err)
}
// defer pw.Stop()
browser, err := pw.Chromium.ConnectOverCDP(cdpUrl)
if err != nil {
return nil, fmt.Errorf("ConnectToChromeInstance 无法连接到 Chrome 实例: %v", err)
}
// defer browser.Close()
contexts := browser.Contexts()
if len(contexts) == 0 {
return nil, fmt.Errorf("ConnectToChromeInstance 无法获取 Chrome 实例的 context")
}
browserCtx0 := contexts[0]
return browserCtx0, nil
}
3.playwright-go打开指定的用户Profile的方法(ChromeV136及以上的user-data-dir不能使用默认目录)
// 通过LaunchPersistentContext 方式打开某个Profile
func LaunchChromePersistentContext(pw *playwright.Playwright, chromeExecPath, userDataDir, userProfile string) (playwright.BrowserContext, error) {
// 启动浏览器
browserCtx, err := pw.Chromium.LaunchPersistentContext(userDataDir, playwright.BrowserTypeLaunchPersistentContextOptions{
Headless: playwright.Bool(false),
Channel: playwright.String("chrome"),
ExecutablePath: &chromeExecPath,
Args: []string{
"--profile-directory=" + userProfile,
},
})
if err != nil {
return nil, fmt.Errorf("LaunchChromePersistentContext 无法启动浏览器 userProfileDir: %s, 错误:%v", userProfile, err)
}
return browserCtx, nil
}
浙公网安备 33010602011771号