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

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 23:26:11 +08:00
@supermoonie 就是个经典生产消费模型而已,了解了原理,让我用 java 写我也觉得挺简单的,就算不用 netty 也可以的,瓶颈不在这儿。我觉得没必要争论这个,个人主观感受而已,仁者见仁智者见智。

https://chromedevtools.github.io/devtools-protocol/ 这个我是知道的,rod 文档里也多次提到了这个,而且 rod 本身很多代码也是自动生成于这个的。

我认识的深入开发过 cdp 的人都觉得 https://chromedevtools.github.io/devtools-protocol/ 写的不够详细,比如 Page.createIsolatedWorld 的文档,我是看不懂的,比如 IsolatedWorld 和 v8 的关系,生命周期,作用范围啥都没说。一堆类似的不明不白的 API 说明。
supermoonie
2020-09-22 00:19:47 +08:00
@ysmood 哈哈哈,这倒是,不过这些 api 无关紧要。突然想起来不打算搞 cdp 的一个重要原因,cef …… 前段时间已经打通了 cef 的 java 绑定,各种 api 随便调用,还实现了一个简单的浏览器,然后就觉得 cdp 不香了🤪
supermoonie
2020-09-22 00:22:12 +08:00
@ysmood 更正下,可能是我表达不准确,没有想表达哪种语言好与坏,我的锅🤣
ysmood
2020-09-22 02:42:05 +08:00
@supermoonie cef 跟 cdp 要解决的问题完全不同。而且我要用 cef 的话,还用个毛的 java,直接 c++ 了,何必折腾自己呢。学个语言的成本比跨语言 embed 坑要少多了。

比如我可以立刻用同时用 puppeteer 和 rod 控制几千个 chromium 的集群,你用 cef 不又是要自己来一套 cdp 的轮子才能做到这种级别的解耦吗?
iiusky
2020-09-22 21:45:59 +08:00
截图好像还是有问题 目前用的 pjs 代替
pucipuci
2020-09-22 21:50:53 +08:00
可以
ysmood
2020-09-22 21:58:32 +08:00
@iiusky 截图都是我实际跑过结果的,底下的链接你可以访问然后自己跑。能说下 pjs 是什么意思吗?没看懂
ysmood
2020-09-22 22:01:30 +08:00
lxilu
2020-09-22 23:31:27 +08:00
#21 操作系统原理软中断
wewewe
2020-09-23 19:52:46 +08:00
如果能够结合这个效果会更好
https://www.v2ex.com/t/706327
ysmood
2020-09-23 19:56:35 +08:00
@wewewe 不都是用 sentry 之类的吗?
ysmood
2020-09-23 21:02:29 +08:00
Cabana
2020-09-27 09:04:53 +08:00
Cabana
2020-09-27 09:06:28 +08:00
@Cabana 误触了不好意思
ysmood
2020-09-27 09:41:18 +08:00
@Cabana 没事儿,正好增加回复,v 站只有回复才会增加排序,这帖子收藏比回复多 😂
tikazyq
2020-09-29 10:14:50 +08:00
简单看了一下源码,貌似还是基于 Chrome 的吧,这个相当于是 puppeteer 的 golang 版本对吧
soulteary
2020-10-06 20:30:57 +08:00
@ysmood 你还在折腾这个呀,#38L 提到的那个东西,几年前就做完了,录制重放都问题不大,大概整了 7 ~ 8 套方案(有侵入、无侵入、移动、PC 、有客户端、无客户端、依赖框架、无框架依赖...),组合使用应该能解决绝大多数场景,尤其是功能层面 replay 。

当时郁闷的是不能从浏览器底层创建事件,做不到完美的仿真,现在可以做到了,但是却失去了再做一遍的兴趣和耐心。
ysmood
2020-10-07 00:28:02 +08:00
@soulteary 我不是回复了吗?看 38 楼。你做的哪些基本没有实用价值啊,我大概是不会优先费时间在上面的,除非有感兴趣的人想去实现,我可以指导下。这种功能只能算 driver 的一个很小的应用而已。
lizhenda
2022-06-29 14:27:00 +08:00
准备试试水
shuirong1997
2023-05-26 14:48:29 +08:00
お問い合わせ内容お問い合わせ内容お問い合わせ内容お問い合わせ内容お問い合わせ内容お問い合わせ内容

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

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

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

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

© 2021 V2EX