分享一个 chrome headless 的库,目标是成为 Go 版的 Puppeteer - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
ysmood
V2EX    Go 编程语言

分享一个 chrome headless 的库,目标是成为 Go 版的 Puppeter

  •  1
     
  •   ysmood
    ysmood 2020-04-06 18:11:19 +08:00 6606 次点击
    这是一个创建于 2046 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目地址: 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

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

    8 条回复    2022-09-01 13:30:21 +08:00
    cumt21g
        1
    cumt21g  
       2020-04-06 20:13:14 +08:00   1
    和 chromedp 有啥区别?
    mingsz
        2
    mingsz  
       2020-04-06 23:32:57 +08:00
    看上去不错,先 star 一下
    ysmood
        3
    ysmood  
    OP
       2020-04-07 04:27:24 +08:00
    @cumt21g 其实项目的 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 套娃)关键是他们底层设计太繁杂,我觉得自己写个都比去改它代码省事。这也是我觉得有必要自己写个框架的主要原因。
    hellos
        4
    hellos  
       2020-05-05 23:03:45 +08:00 via Android
    支持。看着比 chromedp 简洁好多。
    1314258
        5
    1314258  
       2020-06-04 21:18:27 +08:00
    支持 ie11 吗?
    ysmood
        6
    ysmood  
    OP
       2020-06-04 22:33:34 +08:00 via Android
    vansenb
        7
    vansenb  
       2021-03-26 21:32:40 +08:00
    用了一下,感觉很好。首先渲染速度很快,想必比 Selenium 速度提升明显。其他的 API 比较友好,大部分 Selenium 拥有的功能这边都具备了。我这边开始投入到商业项目了。
    b4115Z4mRAz9P8EA
        8
    b4115Z4mRAz9P8EA  
       2022-09-01 13:30:21 +08:00
    用了,非常好用,比 Chromedp 好用得不是一个级别。。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1302 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 17:20 PVG 01:20 LAX 09:20 JFK 12:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86