Rod 一个为简化自动化和爬虫设计的 devtools driver

2020-07-02 19:12:41 +08:00
 ysmood

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

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

根目录的 readme 里有常见的问答,以及和 chromedp,puppeteer 等库的比较。

同类的项目有 chromedp,但是其存在架构设计上的问题且更新缓慢,所以我们开发了 rod,感兴趣的朋友请来试试。欢迎对自动化有兴趣的朋友加入到项目中来,这是我们的聊天室: https://discord.gg/PAaMGJw

因为问的人特别多,我们列了个表格用实际可运行的例子帮助大家直观对比 rod 和 chromedp: https://github.com/go-rod/rod/tree/master/lib/examples/compare-chromedp

下面是一个打印 awesome-go 某一类别项目列表的例子:

package main

import (
    "log"

    "github.com/go-rod/rod"
)

func main() {
    // 启动一个浏览器并新建一个页面
    page := rod.New().Connect().Page("https://github.com/avelino/awesome-go")

    // 获取页面里含有 "Selenium and browser control tools" 标题的下方元素
    // 这里我们将获取到 p 标签下方的列表
    section := page.ElementMatches("p", "Selenium and browser control tools").Next()

    // 在列表里获取全部 li 标签
    projects := section.Elements("li")

    for _, project := range projects {
        // 从 li 标签里获取 a 标签
        link := project.Element("a")
        
        // 打印 a 里的文字,a 的链接,以及 li 里的文字
        log.Println(
            link.Text(),
            link.Property("href"),
            project.Text(),
        )
    }
}
12443 次点击
所在节点    Go 编程语言
66 条回复
vus520
2020-07-06 15:24:20 +08:00
@ysmood 静态页面我用 scrapy,动态页面我使用 splash 这类渲染器,想找一个性能比 splash 更好的方案。
ysmood
2020-07-06 16:05:58 +08:00
@vus520 那我推荐你试试 rod,splash 基于 QT, 它用的 webkit 和 v8,rod 基于 chromium,它用的 blink 和 v8,blink 是 fork 的 webkit,他们团队对此的解释可以看这里 http://www.chromium.org/blink/developer-faq

chrome 团队在这篇文章里说了:我们会有更好的多线程支持和性能提升。当然这点就仁者见仁智者见智了。我个人的观察是用 rod 内存消耗基本是几 MB,cpu 的消耗更大的是在于我渲染的什么网站,而不是选什么引擎。关注问题我们看瓶颈在哪,所以我发现容不容易开发才是我选择使用什么方案的决定性因素。比如如果我要实现个拖拽模拟,结果 webkit 要 hack 一堆函数,那我肯定是不会选 webkit 的。

如果吹毛求疵的话,rod 是基于 golang 的,splash 是基于 python,单从你自己项目的架构和可维护性来讲,golang 往往是爬虫更佳的选择。python 之所以现在还在爬虫界这么火,我觉得还是因为老一辈的积累和工具的成熟度,但仅我个人来看未来还是 golang 更适合处理这方面的业务。
ysmood
2020-07-06 16:07:52 +08:00
“cpu 的消耗” 订正为 “内存和 CPU 的消耗”
vus520
2020-07-06 16:12:36 +08:00
@ysmood 好的,我会做一个性能基准测试,感谢。
ysmood
2020-07-06 16:17:41 +08:00
@vus520 如果能把你的结果分享出来那就好了,简单的开个 issue 我们就能看到,这样能帮助更多的人选择哪种方案更符合他们的需求。
Te11UA
2020-07-06 16:22:25 +08:00
作为爬虫我比较关心这个 issue 会不会在 Rod 上得到解决?大概意思是新开的 Tab 无法绕过反爬识别

https://github.com/chromedp/chromedp/issues/557
ysmood
2020-07-06 16:27:26 +08:00
@Te11UA 这个 rod 已经有解决方案了,如果你想了解更多反爬虫经验,可以去聊天群找 PiuPiuPiu,他正在做相关的开发,这里就不聊敏感话题了。
vus520
2020-07-06 17:42:07 +08:00
@vus520 没有问题,乐观估计应该会比 splash 好一点
darrh00
2020-07-06 18:57:35 +08:00
>> Debugging friendly, auto input tracing, remote monitoring headless browser

关于如何调试,有入门的帮助文档吗?
xinyana
2020-07-06 19:41:36 +08:00
门槛有点高啊,零基础 **helloword**给个吧
ysmood
2020-07-06 20:04:03 +08:00
@darrh00 有详尽的文档,上 go 的官方网站就能看,readme 里 examples 就是很容易找到才对:

https://user-images.githubusercontent.com/1415488/86591222-184aa480-bfcc-11ea-8614-b7b2681b00b0.png
ysmood
2020-07-06 20:10:47 +08:00
@xinyana readme 的 examples 里 第一个就是 hello world,我给不会 golang 的 QA 看,她都能猜到怎么用 rod:

https://user-images.githubusercontent.com/1415488/86591430-8e4f0b80-bfcc-11ea-87a2-20245f5743e6.png

要是你还觉得难,那你得先学习下 css selector 和爬虫相关的基础之时了
ysmood
2020-07-06 20:11:58 +08:00
guanzhangzhang
2020-07-07 00:14:51 +08:00
大佬带带我
ysmood
2020-07-07 02:06:54 +08:00
@guanzhangzhang 不是什么大佬,你有问题,可以随时去聊天群里问,如果去英文的群,那能回答你的人就更多。觉得问题有一般性,可以提 issue 。能来贡献代码的人,我都会尽量帮你提高的。

我来这里宣传是希望更多的人来维护,而不是来求夸奖求 star 的,那都是浮云。贡献者多了,我也能从大家的代码受益。
tremblingblue
2020-07-08 11:53:45 +08:00
说个和项目无关的,项目名字让我想起了一个北欧乐队的专辑名字.
missdeer
2020-07-08 12:03:02 +08:00
discord 劝退,微信或者 tg 多好,再不行 slack 嘛
ysmood
2020-07-08 13:23:36 +08:00
@tremblingblue 比如 rod 作为人名还是非常常见的,就跟 jack 类似。
Jirajine
2020-07-08 13:27:03 +08:00
爬虫还是动态语言写起来更合适吧。
ysmood
2020-07-08 13:27:15 +08:00
@missdeer 我们通过很多讨论过之后决定用 discord 的,tg 很难用,连代码高亮都没有。slack 我工作每天用,感觉对开源社区不太友好,更适合闭源项目,免费版还各种限制。

好奇为什么 discord 劝退呢?能详细聊下吗?

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

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

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

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

© 2021 V2EX