自定义浏览器启动

原文:https://go-rod.github.io/i18n/zh-CN/#/custom-launch

收录该文档时间: 2024-11-21T08:08:39+08:00

自定义浏览器启动

连接到正在运行的浏览器

​ 查找您的浏览器的可执行路径,例如 macOS 运行:

1
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless --remote-debugging-port=9222

​ 它将输出类似于:

1
DevTools listening on ws://127.0.0.1:9222/devtools/browser/4dcf09f2-ba2b-463a-8ff5-90d27c6cc913

上面的 ws://127.0.0.1:9222/devtools/browser/4dcf09f2-ba2b-463a-8ff5-90d27c6cc913 就是控制浏览器的接口:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
package main

import (
    "github.com/go-rod/rod"
)

func main() {
    u := "ws://127.0.0.1:9222/devtools/browser/4dcf09f2-ba2b-463a-8ff5-90d27c6cc913"
    rod.New().ControlURL(u).MustConnect().MustPage("https://example.com")
}

launcher 库

​ 由于上面的工作流经常被使用,我们抽象出 launcher 库来简化浏览器的启动。 例如自动下载或搜索浏览器可执行程序, 添加或删除浏览器可执行程序的命令行参数等。

​ 因此,上述的手动启动和代码变成:

1
2
3
4
func main() {
    u := launcher.New().Bin("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome").MustLaunch()
    rod.New().ControlURL(u).MustConnect().MustPage("https://example.com")
}

​ 我们可以使用帮助函数 launcher.LookPath 来获取浏览器的可执行文件路径,上面的代码等价于:

1
2
3
4
5
func main() {
    path, _ := launcher.LookPath()
    u := launcher.New().Bin(path).MustLaunch()
    rod.New().ControlURL(u).MustConnect().MustPage("https://example.com")
}

​ 如果 ControlURL 未设置, MustConnect 将自动运行 launcher.New().MustLaunch()。 默认情况下,launcher 将自动下载并使用固定版本的浏览器,以保证浏览器 的行为一致性。 所以您可以将上述代码简化为:

1
2
3
func main() {
    rod.New().MustConnect().MustPage("https://example.com")
}

增加或删除选项

​ 可以使用 SetDelete 来修改浏览器的启动参数(标志):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package main

import (
    "github.com/go-rod/rod"
    "github.com/go-rod/rod/lib/launcher"
)

func main() {
    u := launcher.New().
        Set("user-data-dir", "path").
        Set("headless").
        Delete("--headless").
        MustLaunch()

    rod.New().ControlURL(u).MustConnect().MustPage("https://example.com")
}

​ 前缀可选,例如 headless--headless 相同。

​ 由于类似 user-data-dirproxy-serverheadless 的选项经常会用到,我们为它们写了一些 helper,所以上面的代码可以改成这样:

1
2
3
4
5
6
7
8
9
func main() {
    u := launcher.New().
        UserDataDir("path").
        Headless(true).
        Headless(false).
        MustLaunch()

    rod.New().ControlURL(u).MustConnect().MustPage("https://example.com")
}

​ 所有可用的选项:链接

​ 阅读 API 文档以获取更多信息:链接

清理

​ 默认情况下,浏览器会创建一个 user-data-dir 来保存用户数据,比如 cookie,缓存等。 Rod 提供了一个帮助函数 Cleanup 在浏览器完全关闭后来删除它:

1
2
3
4
5
6
7
func main() {
    l := launcher.New().
        Headless(false).
        Devtools(true)

    defer l.Cleanup()
}

远程管理启动器

​ 对于生产环境的爬虫系统,我们通常会把爬虫和浏览器拆分到不同的集群,从而使它们能够独立扩容。 Rod 提供模块 launcher.Manager 来远程管理启动器。 通过它我们可以远程启动用自定义启动参数浏览器。 它的用例在 这里

​ 因为很难在某些Linux发行版上正确安装chromium, Rod 提供了一个 docker image 来支持跨平台。 下面是一个用例:

  1. 运行 rod 镜像 docker run -p 7317:7317 ghcr.io/go-rod/rod
  2. 打开另一个终端,并运行类似这个示例中的代码

​ 它对于常见的自然语言的截图和字体进行过调优。 每个容器可以同时启动多个浏览器。 当控制链接断开后管理器会自动删除 user-data-dir

用户模式

​ 当您登录到您的 github 帐户时,您想要重新使用登录会话来完成自动化任务。 您可以使用 launcher.NewUserMode 启动您的常规用户浏览器。 Rod 将就像一个浏览器插件:

1
2
wsURL := launcher.NewUserMode().MustLaunch()
rod.New().ControlURL(wsURL).MustConnect().NoDefaultDevice()

​ 这里是一个更详细的示例: 代码示例

底层 API

​ 如果你想要控制启动过程中的每个步骤,比如说禁用自动下载、使用系统默认浏览器,见此示例文件

最后修改 November 21, 2024: init (2a1db69)