在日常开发中我们经常可能会遇到这样一些情景:需要使用一些自动化的手段来帮助我们测试;在获取某些网页的数据的时候,由于目标网页的数据是动态的,使用传统的数据获取手段无法有效的抓取;需要时不时的抓取某个网页保存为截图作为快照,以用于诸如竞品监测分析等;诸如以上的场景可能在以前我们比较难以实现,或者现有的工具或多或少存在着某些不足。今天就来介绍一款 Go 语言写的基于 DevTools Protocol 的工具,叫 Rod 。

Rod的Github地址:https://github.com/go-rod/rod

Rod 是什么?

Rod 是一款直接基于 DevTools Protocol 的高级 DevTools 驱动程序,它是为了网页自动化和抓取而设计的,Rod 还给用户暴露了一些底层接口,以便如果缺失某些功能的话,用户可以直接调用这些接口发送控制请求给浏览器。

Rod 能做什么?

既然是基于 DevTools Protocol 协议的,那基本 DevTools 能实现的功能大部分都能实现。比如浏览器页面控制、窗口控制、事件监听,根据选择器获取网页元素,模拟鼠标移动点击,页面事件监听、触发,网页注入脚本、样式表,网页内容修改,网页内容获取,执行脚本,Cookie 获取设置,页面截图,会话复用,页面监控等等功能。

Rod 的工作原理是什么?

Rod 在被调用后会尝试使用 WebSocket 去连接 DevTools,如果没有找到的话,会基于不同的系统尝试去一些默认的路径寻找本地浏览器,找到就打开,没有找到的话会尝试去下载一个再启动。

然后 Rod 使用 JSON-RPC 去和 DevTools 交互,以便控制浏览器。当需要控制某个具体的页面的时候,Rod 会给这个页面注入一个js的助手脚本,Rod 使用这个脚本来完成页面内容的获取,控制等。

其他同类工具存在什么问题?

chromedp 由于需要使用复杂的类 DSL 的任务来处理主逻辑,导致发生问题时很难通过理解代码来解决,也很难去追踪问题。chromedp 也无法处理 iframe,不支持影子 DOM,当程序崩溃时,会留下僵尸进程等。

selenium 由于是基于 webdriver protocol 的,功能上相对更少,比如没法处理关闭的影子 DOM,没办法保存网页为 PDF,没有对性能等工具的支持,由于依赖于浏览器驱动等也使得其变得难以使用和维护。虽然 selenium 宣称是支持跨浏览器的,但实际上在很多浏览器上都或多或少存在这样或那样的问题。

puppeteer 需要去处理复杂的 promise/async/await 问题,但在进行自动化测试的时候,更多想要同步的获取到状态之后再进行后续操作,对于 QA 来说不太友好。

cypress 对关闭的影子 DOM 限制很大,对跨域 iframe 来说也不太安全。

案例一:定时对某个网页截图

就像前面说的,有时候我们需要对某个竞品网页保持长期的关注,需要定时的保存快照来做分析,这时候我们就可以使用 rod 来方便的完成这个需求。

这里我写了一个小方法,每3秒(测试用,实际环境可以调整为半天、一天等频率)请求一次 gocn 这个网站,然后等页面加载完成后,将整个页面截图并按截图时间作为文件名保存到本地。

import (   "github.com/go-rod/rod"   "strconv"   "time")func monitorGocn() {   // 创建一个浏览器的实例   browser := rod.New().Connect()   url := "https://gocn.vip"   // 指定要获取的网页   page := browser.Page(url)   // 指定窗口大小,避免截图时截不完整   page.Window(0, 0, 1024, 768)   // 指定截图间隔时间,我这里是测试,就设置了3秒   interval := time.Duration(3) * time.Second   for {      select {      case          nowTimestamp := time.Now().Unix()         nowTimestampStr := strconv.Itoa(int(nowTimestamp))         // 重定向页面,后面的参数无实意,只是为了确保页面刷新         page.Navigate(url + "/?__t__=" + nowTimestampStr)         // 等待页面加载完成         wait := page.WaitRequestIdle()         wait()         file := "screenshot/" + nowTimestampStr + ".jpg"         // 整个页面截图并保存         page.ScreenshotFullPage(file)      }   }}

截图的结果:

截图效果如下:

案例二:自动签到某度贴吧

这个案例主要是以自动签到某度贴吧为例展示自动化操作,我们复用了用户的登录信息,设定一些需要登录的贴吧的数组,每天自动打开每个贴吧的首页,点击签到按钮进行签到。

对签到按钮进行元素审查,很容易得到对应的元素选择器。

然后我们编写代码:

import (   "github.com/go-rod/rod"   "github.com/go-rod/rod/lib/launcher"   "time")func signInBa() {   // 以NewUserMode形式启动,这样可以复用会话信息   // 当然你也可以以普通模式启动,自己调用程序登录   url := launcher.NewUserMode().Launch()   browser := rod.New().ControlURL(url).Connect()   // 先打开某度贴吧首页,方便复用   page := browser.Page("https://tieba.example.com/")   // 设定窗口大小   page.Window(0, 0, 1024, 768)   // 等待页面加载完成   wait := page.WaitRequestIdle()   wait()   // 这里是需要签到的贴吧的名称   kws := []string{"php", "java", "javascript"}   for _, kw := range kws {      // 组装贴吧地址      url := "https://tieba.example.com/f?kw=" + kw      // 前往某个贴吧首页      page.Navigate(url)      wait = page.WaitRequestIdle()      wait()      // 点击签到按钮      page.Element(".j_signbtn").Click()      // 休息10秒再继续      time.Sleep(time.Duration(10) * time.Second)   }}

执行后就可以看到如下效果:

以上两个案例也只是抛砖引玉,充分利用 Rod 能完成的功能远比这些强大,同时支持在 Docker 中启动浏览器,也就是说可以在服务器上去使用 Rod 的所有功能,写好的程序直接扔服务器上就可以等他定时执行,而且支持监控,也能自己处理错误来返回。

总之,用好 Rod 能使你的工作效率大大提升,也能为你完成各种定制化的自动化功能和高级抓取数据需求。

尝试自动重定向的次数太多_GoRod:基于DP协议的Web自动化和数据抓取工具相关推荐

  1. 尝试自动重定向的次数太多_阿里Arthas 3.1.0版本:在线教程、内存编译器和强大的自动补全...

    摘要: `Arthas`是Alibaba开源的Java诊断工具,深受开发者喜爱. 从Arthas上个版本发布,已经过去两个多月了,Arthas 3.1.0版本不仅带来大家投票出来的新LOGO,还带来强 ...

  2. 用HttpWebRequest抓取网页,尝试自动重定向的次数太多”的错误,

    原因:服务器上需要cookie才能浏览 解决: CookieContainer cookieCon = new CookieContainer();  req.CookieContainer = co ...

  3. div自动滚动_简易数据分析 10 | Web Scraper 翻页——抓取「滚动加载」类型网页

    这是简易数据分析系列的第 10 篇文章. 原文首发于博客园:简易数据分析 10. 友情提示:这一篇文章的内容较多,信息量比较大,希望大家学习的时候多看几遍. 我们在刷朋友圈刷微博的时候,总会强调一个『 ...

  4. b站视频详情数据抓取,自动打包并发送到指定邮箱(单个或者群发)

    BiLiBiLi Time: 2020年11月6日19:44:58 Author: Yblackd BiLiBiLi BiLiBiLi 介绍 软件架构 安装教程 使用说明 源码下载 BiLiBiLi ...

  5. excel数据自动录入网页_Excel自动抓取网页数据,数据抓取一键搞定

    网站上的数据源是我们进行统计分析的重要信息源.我们在生活中常常听到一个词叫"爬虫",能够快速抓取网页上的数据,这对于数据分析相关工作来说极其重要,也是必备的技能之一.但是爬虫大多需 ...

  6. database2sharp mysql_C# NetCore使用AngleSharp爬取周公解梦数据 MySql数据库的自动创建和页面数据抓取...

    这一章详细讲解编码过程 那么接下来就是码代码了,GO 新建NetCore WebApi项目 空的就可以 NuGet安装 Install-Package AngleSharp 或者界面安装 using. ...

  7. python自动抓取聊天群内容_python微信聊天机器人改进版,定时或触发抓取天气预报、励志语录等,向好友推送...

    最近想着做一个微信机器人,主要想要实现能够每天定时推送天气预报或励志语录,励志语录要每天有自动更新,定时或当有好友回复时,能够随机推送不同的内容.于是开始了分析思路.博主是采用了多线程群发,因为微信对 ...

  8. 网站在百度站长平台无上传站点LOGO权限下,如何实现LOGO图片在百度索引中自动抓取展现?

    最近美萌那边的大妹子找到我们部门要求解决网站LOGO显示错误的问题.领导将这个问题指派到我这里.我一看这个LOGO图片应该是百度自动抓取首页的一张图,该如何解决这个问题呢? 百度搜索引擎对于网站LOG ...

  9. python跳转到新页面、如何等待页面加载完_python urllib2 – 在抓取之前等待页面完成加载/重定向?...

    我正在学习制作网络抓取工具,并希望抓住TripAdvisor的个人项目,使用urllib2抓取html. 但是,我遇到了一个问题,使用下面的代码,我回来的html是不正确的,因为页面似乎需要一秒钟重定 ...

最新文章

  1. 在函数调用中,星号运算符是什么意思? [重复]
  2. JS的数据访问及优化访问速度
  3. 【技术综述】有三AI不得不看的技术综述
  4. 【C++ Primer】类的多态
  5. make 调试和传参
  6. 高级Python:定义类时要应用的9种最佳做法
  7. 【SpringCloud-Alibaba系列教程】14.一文教你入门RocketMQ
  8. git批量删除文件和批量提交
  9. 显式强制类型转换static_cast, dynamic_cast, const_cast, reinterpret_cast
  10. 从 Web 图标演进历史看最佳实践
  11. @interface自定义注解
  12. Codeforces 808G. Anthem of Berland
  13. 一次性送出25本北大出版社AI类当当最畅销的25本书!包括~机器学习、深度学习实战、数学基础等...
  14. python夜曲编程_夜曲编程——我毕业了!!!
  15. 跑跑卡丁车rush服务器维护,跑跑卡丁车RUSH
  16. rank函数python_Python pandas.DataFrame.rank函数方法的使用
  17. Microsoft Word 标题编号变成黑块的解决方法
  18. RecyclerView让置顶项置顶
  19. 黑马瑞吉外卖之移动端验证码登录使用qq邮箱
  20. Ubuntu的Spark 搭建实验(ssh配置没好,需要的看新发的,完整版)

热门文章

  1. Android HelloWorld 例子
  2. 语义分割的时候,发的牢骚
  3. 全网最详细SpringBatch读(Reader)跨多行文件讲解
  4. SpringSecurity - 基础篇
  5. Go中的函数也是一种数据类型,可以赋值给一个变量
  6. spark分区增减、JavaFX基本操作和HDFS NN DN概念
  7. arthas类和类加载器相关命令:dump、classloader
  8. 什么是死锁(deadlock)?
  9. 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
  10. @RabbitListener组合注解消费消息