Golang Go语言中分享一个chrome headless库 目标成为Go版Puppeteer

发布于 1周前 作者 gougou168 来自 Go语言

Golang Go语言中分享一个chrome headless库 目标成为Go版Puppeteer

项目地址: https://github.com/ysmood/rod

目前我们自己的 QA 在用它做支付服务的集成测试和冒烟监控,之后还打算用到其他一些爬虫项目。相比用 Nodejs 对于 QA 来说 Go 的心智负担更小,不用教他们 Promise,异步 IO 等概念,而且要强类型的易维护性的话还得学 Typescript,过于繁杂。

下面是个简单的谷歌翻译示例:

package main

import ( “fmt” “os”

"github.com/ysmood/rod"

)

func main() { source := os.Args[1]

browser := rod.New().Connect()

page := browser.Page("https://translate.google.com/")

wait := page.WaitRequestIdle()
page.Element("#source").Input(source)
wait()

result := page.Element(".tlid-translation").Text()

fmt.Println(result)

}

更多详细的使用示例可以看 https://github.com/ysmood/rod/blob/master/examples_test.go

感兴趣的话请试试。另外想来收集下需求和吸引一些想一起维护的人。


更多关于Golang Go语言中分享一个chrome headless库 目标成为Go版Puppeteer的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

和 chromedp 有啥区别?

更多关于Golang Go语言中分享一个chrome headless库 目标成为Go版Puppeteer的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


看上去不错,先 star 一下

其实项目的 readme 里已经提到了和 chromedp,puppeteer,以及 cypress 的对比。

我们一开始也是使用的 chromedp,但是用了一段时间之后发现了很多它的根本设计问题,chromedp 为了并不常用的 context 设计了反直觉的 DSL 来绕开这个问题,这使得我们不得不大量重复的使用它设计不完全的语法操作网页内容,写个 if-else 都要多增一些代码,而且不小心写错了还容易出奇怪的 bug,debug 相当痛苦,每次断点到它的代码里基本就会迷路,原因就是它利用自己的 DSL 将 golang 的强类优点基本全屏蔽了,类型跳转根本没法用,基本就等于是在用 nodejs 了,那我何不直接用 puppeteer 呢?

另外一个要命的问题就是它底层设计时用了 chrome 自己的 json schema 来生自动成类型代码,而 chrome 自己的 json schema 本来就设计不好,比如最底层的 api call 其实是有个可选的 session id 字段的,然而 schema 里并没有表达,这导致 chromedp 等利用这个自动生成代码的库都没有把这个 session id 带上,这对于 iframe 的操作是很关键的。这也就是为什么这么多年了他们这个 issue 还没任何进展 https://github.com/chromedp/chromedp/issues/72
iframe 的支持对于我们支付服务的测试是必要的(比如 stripe 多层 iframe 套娃)关键是他们底层设计太繁杂,我觉得自己写个都比去改它代码省事。这也是我觉得有必要自己写个框架的主要原因。

支持。看着比 chromedp 简洁好多。

支持 ie11 吗?

用了一下,感觉很好。首先渲染速度很快,想必比 Selenium 速度提升明显。其他的 API 比较友好,大部分 Selenium 拥有的功能这边都具备了。我这边开始投入到商业项目了。

用了,非常好用,比 Chromedp 好用得不是一个级别。。。

在Go语言中,实现一个类似Puppeteer的Chrome Headless库是一个既有趣又富有挑战性的任务。Puppeteer是Node.js的一个库,提供了对Chrome或Chromium的高级别API控制,非常适合进行网页自动化、爬虫开发、截图生成和PDF生成等任务。要在Go语言中实现类似功能,可以考虑以下几个关键步骤和已有的库:

  1. Chrome DevTools Protocol (CDP): CDP是Chrome浏览器提供的远程调试协议,允许开发者与浏览器实例进行交互。这是实现Go版Puppeteer的基础。

  2. 现有库: 探索已有的Go语言库,如cdprotorod,这些库提供了对CDP的支持。rod是一个相对成熟的库,能够较为全面地模拟Puppeteer的功能,包括页面控制、元素选择、事件监听等。

  3. WebSocket通信: Chrome在无头模式下支持通过WebSocket进行远程调试。Go程序可以通过建立WebSocket连接与Chrome实例通信,发送CDP命令并接收响应。

  4. API设计: 设计一套易于使用的API,模仿Puppeteer的接口风格,使开发者能够轻松上手。

  5. 测试与文档: 确保库在各种场景下的稳定性和正确性,编写详细的文档和示例代码,帮助开发者快速上手。

总之,实现Go版Puppeteer是一个复杂但可行的项目,需要深入理解CDP协议和Go语言的网络编程。推荐从研究现有的Go库开始,逐步扩展和完善功能。希望这些建议能帮助你实现目标!

回到顶部