目录
- 前期准备
- 环境
- 教程
- 浏览器启动
- 命令启动
- Rod启动浏览器
- Rod自动查找浏览器路径并启动
- 输入和点击、Enter动作
- 多页面抓取
前期准备
环境
- Go版本大于等于1.18
- Go模块源更换,加速模块下载
go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct
- Rod模块
-
Rod 是一个直接基于 DevTools Protocol 高级驱动程序。 它是为网页自动化和爬虫而设计的,既可用于高级应用开发也可用于低级应用开发,高级开发人员可以使用低级包和函数来轻松地定制或建立他们自己的Rod版本,高级函数只是建立Rod默认版本的例子。
go get github.com/go-rod/rod
- 浏览器:Edge、Chrome
教程
浏览器启动
命令启动
查找浏览器的可执行路径
#例如 macOS 运行:
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless --remote-debugging-port=9222
# 它将输出类似于:
`DevTools listening on ws://127.0.0.1:9222/devtools/browser/4dcf09f2-ba2b-463a-8ff5-90d27c6cc913`
ws://127.0.0.1:9222/devtools/browser/xxxx 就是控制浏览器的接口
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")
}
Rod启动浏览器
launcher 库来简化浏览器的启动。 例如自动下载或搜索浏览器可执行程序, 添加或删除浏览器可执行程序的命令行参数等。
func main() {
u := launcher.New().Bin("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome").MustLaunch()
rod.New().ControlURL(u).MustConnect().MustPage("https://example.com")
}
Rod自动查找浏览器路径并启动
可以使用帮助函数 launcher.LookPath 来获取浏览器的可执行文件路径
func main() {
path, _ := launcher.LookPath()
u := launcher.New().Bin(path).MustLaunch()
rod.New().ControlURL(u).MustConnect().MustPage("https://example.com")
}
输入和点击、Enter动作
网站可能有许多输入框和按钮,我们需要告诉程序它需要操控其中的哪一个。
#被访问网址
baidu := "https://www.baidu.com"
#启动浏览器
launch := launcher.NewUserMode().Devtools(true).Bin("/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge").MustLaunch()
#访问网站
page := rod.New().ControlURL(launch).NoDefaultDevice().MustConnect().MustPage(baidu)
#模拟用户点击
#proto.InputMouseButtonLeft 表示模拟鼠标左键点击
page.Timeout(3*time.Second).MustElement("#kw").MustInput("chatGPT").MustElement("#submit").Click(proto.InputMouseButtonLeft, 1) # 1表示点击数量
#模拟用户搜索
#input.Ente 表示模拟回车键
page.Timeout(3*time.Second).MustElement("#kw").MustInput("chatGPT").Type(input.Ente)
#截图搜索结果
page.MustWaitLoad().MustScreenshot("chatGPT.png")
启动脚本
#重点:-rod=show,直观的看到效果
go run main.go -rod=show
# 慢动作和可视化跟踪
go run . -rod="show,slow=1s,trace"
效果图
多页面抓取
抓取过程中经常会出现,点击链接打开新窗口,这时是无法正常拿到新窗口页面数据,还会造成脚本无法退出。解决办法就是,多页面抓取,把打开新窗口的链接,用mustPage方法打开新的界面,完成数据抓取。
baidu := "https://www.baidu.com"
path, b := launcher.LookPath()
if !b {
log.Fatalln("启动失败")
}
launch := launcher.New().Bin(path).MustLaunch()
page := rod.New().ControlURL(launch).MustConnect()
// A页面,打开百度搜索
A := page.MustPage(baidu)
A.Timeout(3 * time.Second).MustElement("#kw").MustInput("chatGPT").Type(input.Enter)
// 获取百度百科链接
href := A.MustElement("#\\32 > div > div > h3 > a").MustAttribute("href")
// B页面,打开百度百科链接
B := page.MustPage(*href)
//页面元素数据
link := B.MustElement("body > div.body-wrapper > div.content-wrapper > div > div.side-content > div.summary-pic > a > img").MustAttribute("src")
text := B.MustElement("body > div.body-wrapper > div.content-wrapper > div > div.main-content.J-content > div:nth-child(13)").MustText()
//打印
fmt.Println(*href,*link, text)
效果图