Ubuntu 22.04 安装 Google Chrome 及 Go-Rod 自动化操作完整指南
1. 安装 Google Chrome
1.1 直接安装(推荐)
# 下载最新稳定版 Chrome(amd64架构)
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
# 安装 Chrome 并自动处理依赖
sudo apt install -y ./google-chrome-stable_current_amd64.deb
# 验证安装
google-chrome --version
1.2 通过官方仓库安装(可选)
# 添加 Google 的 GPG 密钥
wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
# 添加 Chrome 的 APT 源
echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
# 更新并安装
sudo apt update && sudo apt install -y google-chrome-stable
2. Go-Rod 自动化脚本配置
2.1 基础代码示例
package main
import (
"log"
"os"
"github.com/go-rod/rod"
"github.com/go-rod/rod/lib/launcher"
"github.com/go-rod/rod/lib/proto"
)
func main() {
// 启动浏览器配置
url := launcher.New().
Headless(true). // 无头模式
Set("no-sandbox"). // 禁用沙盒(必须设置,尤其是 root 用户)
MustLaunch()
// 连接浏览器实例
browser := rod.New().ControlURL(url).MustConnect()
defer browser.MustClose()
// 创建页面并导航
page := browser.MustPage("URL替换为实际地址").MustWaitLoad()
// 设置 User-Agent 和语言
page.MustSetUserAgent(&proto.NetworkSetUserAgentOverride{
UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
AcceptLanguage: "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
})
// 调试操作(示例)
saveDebugData(page)
// 其他操作(如填写表单)
// page.MustElement("#username").MustInput("user")
// page.MustElement("#password").MustInput("pass")
// page.MustElement("button[type='submit']").MustClick()
}
// 调试方法封装
func saveDebugData(page *rod.Page) {
// 保存页面 HTML
html, err := page.HTML()
if err != nil {
log.Printf("保存 HTML 失败: %v", err)
} else {
os.WriteFile("debug_page.html", []byte(html), 0644)
}
// 截图保存
if err := page.MustScreenshot("debug_page.png"); err != nil {
log.Printf("截图失败: %v", err)
}
}
3. 关键配置详解
3.1 User-Agent 的作用
UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
- 用途:
User-Agent 是浏览器向服务器发送的标识字符串,用于告知服务器客户端的浏览器类型、操作系统、渲染引擎等信息。 为什么需要设置:
- 避免被检测为爬虫:许多网站会检测无头浏览器(如 Headless Chrome),通过设置常见浏览器的 User-Agent 可降低被屏蔽的风险。
- 模拟真实用户:使请求看起来像是来自普通浏览器(如 Chrome 或 Edge)。
- 兼容性:某些网站会根据 User-Agent 返回不同内容(如移动端或桌面端页面)。
参数解析:
Windows NT 10.0
:表示操作系统为 Windows 10。Win64; x64
:64 位系统。AppleWebKit/537.36
:浏览器内核版本。Chrome/91.0.4472.124
:Chrome 浏览器版本。Safari/537.36
:兼容 Safari 内核标识(Chrome 基于 WebKit)。
3.2 Accept-Language 的作用
AcceptLanguage: "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6"
- 用途:
Accept-Language
是 HTTP 请求头,用于告知服务器客户端接受的语言优先级。 为什么需要设置:
- 语言适配:确保服务器返回中文内容(如
zh-CN
优先)。 - 降低检测风险:模拟真实用户的浏览器语言配置,避免因默认语言异常被识别为机器人。
- 多语言支持:如果目标网站支持多语言,可以控制返回的页面语言。
- 语言适配:确保服务器返回中文内容(如
参数解析:
zh-CN,zh;q=0.9
:优先接受简体中文(权重 0.9)。en;q=0.8
:其次接受英文(权重 0.8)。en-GB;q=0.7
:英式英语。en-US;q=0.6
:美式英语。
3.3 必选参数
Set("no-sandbox")
作用:禁用 Chrome 沙盒模式。
必要性:在 Linux 服务器或 Docker 中以root
用户运行时必须启用,否则会报错Failed to launch browser
。Headless(true)
作用:以无界面模式运行浏览器,节省资源。
调试建议:设为false
可显示浏览器界面观察操作。
4. 调试方法
4.1 基础调试
方法 | 作用 | 代码示例 |
---|---|---|
保存页面 HTML | 分析页面结构 | html, _ := page.HTML() |
截图 | 检查渲染效果 | page.MustScreenshot("debug.png") |
打印控制台日志 | 捕获 console.log 输出 | 见下文代码 |
4.2 高级调试
// 监听控制台日志
go page.EachEvent(func(e *proto.RuntimeConsoleAPICalled) {
for _, arg := range e.Args {
log.Printf("[控制台日志]: %s", arg.Value)
}
})()
// 监听网络请求
go page.EachEvent(func(e *proto.NetworkRequestWillBeSent) {
log.Printf("[请求发送]: %s %s", e.Request.Method, e.Request.URL)
})()
5. 常见问题与解决
5.1 依赖缺失错误
- 报错示例:
Failed to launch browser: error while loading shared libraries: libXss.so.1
解决方案:
sudo apt install -y libxss1 libgbm1 libasound2
5.2 无头模式被检测
- 现象:页面返回反爬提示。
解决方案:
- 禁用无头模式:
Headless(false)
添加更复杂的 User-Agent 和分辨率模拟:
page.MustSetViewport(&proto.EmulationSetDeviceMetricsOverride{ Width: 1920, Height: 1080, DeviceScaleFactor: 1, Mobile: false, })
- 禁用无头模式:
6. 总结
- 安装 Chrome:优先使用
.deb
直接安装,确保依赖完整。 Go-Rod 配置:
- 必须设置
no-sandbox
(尤其 root 用户)。 - 必须设置
User-Agent
和Accept-Language
模拟真实用户。
- 必须设置
调试技巧:
- 结合 HTML 保存、截图、日志监听快速定位问题。
生产环境建议:
- 使用 Docker 容器化运行(避免环境差异)。
- 定期更新 User-Agent 以匹配最新浏览器版本。