分享一个用于自动化和爬虫的库

2020-09-21 09:23:51 +08:00
 ysmood

项目地址: https://github.com/go-rod/rod

感谢大家的反馈优化了不少 API,因为之前的帖子已经过时了,所以在这里重新发下帖子。近期主要优化了异常处理。基本覆盖了 puppeteer 的主要功能,且支持更多便利的高级功能,比如等待 ajax,复杂代理,文件下载等。

这个库的主要原理就是利用浏览器的 devtools 可编程接口来操控浏览器。日常你可以用它自动化一些重复的页面任务,相比油猴子有更多的高级功能和 golang 强大的生态。工作上可以用它辅助集成化测试减少人力消耗。开发上可以用它简化一些传统爬虫需要费很多时间逆向工程的场景。

欢迎对自动化有兴趣的朋友加入到项目中来,这是我们的聊天室: https://discord.gg/PAaMGJw

可以通过示例文件大致了解 rod 的一些基本用法: https://github.com/go-rod/rod/blob/master/examples_test.go

下图是 rod,puppeteer 和 chromedp 实现相同输出的代码对比:

更多对比请移步: https://github.com/go-rod/rod/tree/master/lib/examples/compare-chromedp

关于 Must 前缀: https://github.com/go-rod/rod/blob/03b1d54362f72599d3bfa465aee6b48c9c51599b/examples_test.go#L137-L186

12946 次点击
所在节点    分享创造
61 条回复
ysmood
2020-09-21 11:39:01 +08:00
@xwhxbg abort 是不可能由外部独立完成的,必然是要 task 自己轮询是否有中断机信号,这个是计算机原理的基础。promise 是 task 自己返回一个承诺,而 golang context 是向 task 传递中断信号。这个根本差异很难用一些三方库抹平,必须要改很多库的接口方式。puppeteer 是没有实现这种细粒度中断信号控制的。所以我觉得这里我表达的应该还算合理。
ysmood
2020-09-21 11:40:13 +08:00
@xwhxbg 所以问题的关键是 puppeteer 没给你接口让你传这个 cancel 的信号进去啊,这样说你觉得还有问题吗?
xwhxbg
2020-09-21 11:44:19 +08:00
@ysmood 你的意思是 golang 可以做到行级别的 cancel,能在一个 function 调用一半的时候不执行下半部分么?
ysmood
2020-09-21 11:50:09 +08:00
@supermoonie 用的 goroutine 不是 libuv 那种。基于 go channel 的通信,不是 epoll,各有优劣。不会像 node 那样要各种侦听事件,写法基本是线性的,不会出现一大堆 callback
ysmood
2020-09-21 11:58:40 +08:00
@xwhxbg 我刚不是说了计算机原理了吗? 当然是不可以的,这不是要对比 golang 和 nodejs,这里只是比较 rod 和 puppeteer 在处理 io block 的 cancel 上。rod 确实能更细力度的处理 cancel 信号,任何可以 io block 的地方基本都可以 cancel
ysmood
2020-09-21 12:01:22 +08:00
@xwhxbg 比如 puppeteer 在模拟 click 时,会发送多个请求到 chrome,你没法阻止这几个请求只发出去一半。rod 可以。
supermoonie
2020-09-21 12:22:17 +08:00
@ysmood 那我换种问法,一个 Tab 需要多少个 goroutine 支持?我可能比较关注性能这块,因为 Chrome 本来就比较消耗资源😂
ysmood
2020-09-21 12:37:46 +08:00
@supermoonie 相比 chrome,rod 的损耗可以忽略不计,就算你开 100 个 tab 也只有几个 goroutine,goroutine 数和 tab 没有关系,rod 使用了严格的 goleak 测试,极大的控制了 goroutine 的数量: https://github.com/uber-go/goleak
supermoonie
2020-09-21 13:57:25 +08:00
@ysmood 今天下班了我去看看你的源码,没有异步 IO 竟然可以做到只有几个 goroutine,很好奇是怎么做到的🌚
jzyzcz
2020-09-21 14:01:02 +08:00
学习一下...
最近也在用 puppeteer 做爬虫,感觉这个可玩性非常高
yejianmail
2020-09-21 18:46:08 +08:00
已⭐,想找个 Java 的 chrome cdp 没有找到合适的,selenium 用起来感觉不太爽
ysmood
2020-09-21 18:53:43 +08:00
@supermoonie 欢迎来 review 代码。有任何问题都可以去聊天室: https://discord.gg/PAaMGJw
supermoonie
2020-09-21 18:56:39 +08:00
@yejianmail java 有 cdp4j,现在好像有社区版,不过代码写的不是太好,线程管理都没有
supermoonie
2020-09-21 18:59:20 +08:00
@ysmood review 不了,毕竟不是搞 go 的,准备抽时间,用 java nio 的封装库 netty 写一遍,之前用的阻塞 io,不是很满意
ysmood
2020-09-21 19:03:38 +08:00
@yejianmail 和其他库的比较,里面有提到 selenium,可能对你有帮助: https://github.com/go-rod/rod#q-why-another-puppeteer-like-lib
ysmood
2020-09-21 19:56:28 +08:00
@supermoonie 写通信异步处理这块算是这个库最小儿科的部分了。核心代码只有 200 行 https://github.com/go-rod/rod/blob/03b1d54/lib/cdp/client.go#L118

这个项目真正难的是如何在没有详细文档和资料的情况下用 cdp 接口完成一些高级功能,chrome 官方的文档非常糟糕,而且 cdp 接口设计本身也问题很大。比如单是模拟完美的 click 都够你折腾一阵子,看似简单的 click 需要调用约十个接口完成,chrome 只列举了全部接口,但是要调用哪 10 个接口完成像人一样点击鼠标是没有说的。

你要是感兴趣,go 挺简单的,比起你去研究 puppeteer,把这个项目翻译成 java 估计会更简单。

其实更好的做法不是用各种语言实现一遍相同的功能,而是基于 rod 这种库开发语言中性的服务,我们有个 issue 你可以看看: https://github.com/go-rod/rod/issues/21

我们也有个语言中性化的试验性项目 https://github.com/go-rod/wayang
soseek
2020-09-21 20:09:40 +08:00
https://github.com/microsoft/playwright-cli

能做到这种就溜了🤭
ysmood
2020-09-21 20:39:40 +08:00
@soseek 这种项目挺多的 rod 也有相关 issue,我们是有计划要做这个的:

https://github.com/go-rod/rod/issues/139

https://github.com/go-rod/rod/issues/81

我是想指导个对这方面感兴趣的学生或者开发者来做个独立项目。实际项目能使用的范围不大,稍微复杂点的网站都很难录制。但是作为兴趣项目是非常有挑战价值的。
ysmood
2020-09-21 20:46:28 +08:00
@soseek 比如设计 “最短选择器搜索算法" ,对于想挑战的人应该还挺有趣的。
supermoonie
2020-09-21 22:58:29 +08:00
@ysmood emmm 。。。异步通信对于 go 可能简单,但是对于 Java 来说却不是小儿科,而且我觉得

https://chromedevtools.github.io/devtools-protocol/

官方文档写的挺详细了,你是不是没有找对地方?其实两年前我就已经把 devtools-protocol 实现了

https://github.com/supermoonie/AutoChrome

只不过我觉得有些地方做的不够好,就搁置了,最近 Netty ( Java 异步 IO 库)学得差不多了,就想再用异步 IO 实现下。

其实 go 这方面做的挺好的,只是实在个人精力有限(个人项目在开发中。。。),要不然我也去搞搞 go 了,原本我还想用 Qt 去写一个 QAutoChrome 以及 Python 写 PyAutoChrome

https://github.com/supermoonie/PyAutoChrome
https://github.com/supermoonie/QAutoChrome

只不过没时间罢了,哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/708906

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX