首页 > 其他分享 >Go每日一库之178:chromedp(一个基于Chrome DevTools协议的库,支持数据采集、截取网页长图)

Go每日一库之178:chromedp(一个基于Chrome DevTools协议的库,支持数据采集、截取网页长图)

时间:2023-09-29 21:23:40浏览次数:54  
标签:网页 log err 一库 chromedp https 178 example

该库提供了一种简单、高效、可靠的方式来控制Chrome浏览器进行自动化测试和爬取数据。

项目地址:https://github.com/chromedp/chromedp

它可以模拟用户在浏览器中执行各种操作如点击输入文本、截取网页长图、将网页内容转换成pdf文档、下载图片等,从而获取到需要采集的数据

基础用法

chromedp的基本用法非常简单,只需要定义一个任务列表,然后将其传递给chromedp.Run函数即可。下面是一个简单的例子。这个例子的功能如下:

  • chromedp.Navigate:打开https://pkg.go.dev/time网页
  • chromedp.WaitVisible:等待网页加载完成
  • chromedp.Click:点击#example-After标签。也就是网页中的After函数示例
  • chromedp.Value:将示例代码的值读取到example变量中
  • 最后输出example变量

如下:

package main

import (
 "context"
 "log"
 "time"
    "github.com/chromedp/chromedp"
)

func main() {
 // create chrome instance
 ctx, cancel := chromedp.NewContext(
  context.Background(),
  // chromedp.WithDebugf(log.Printf),
 )
 defer cancel()

 // create a timeout
 ctx, cancel = context.WithTimeout(ctx, 15*time.Second)
 defer cancel()

 // navigate to a page, wait for an element, click
 var example string
 err := chromedp.Run(ctx,
  chromedp.Navigate(`https://pkg.go.dev/time`),
  // wait for footer element is visible (ie, page is loaded)
  chromedp.WaitVisible(`body > footer`),
  // find and click "Example" link
  chromedp.Click(`#example-After`, chromedp.NodeVisible),
  // retrieve the text of the textarea
  chromedp.Value(`#example-After textarea`, &example),
 )
 if err != nil {
  log.Fatal(err)
 }
 log.Printf("Go's time.After example:\n%s", example)
}

高级使用

除了基本用法之外,chromedp还提供了许多高级功能。

截屏

将网页截取成图片有两个函数:chromedp.Screenshotchromedp.FullScreenshot。其中chromedp.Screenshot是按网页中的某个div的元素截取。而chromedp.FullScreenshot是截取整个网页。我们看下下面的例子:

package main

import (
 "context"
 "log"
 "os"

 "github.com/chromedp/chromedp"
)

func main() {
 // create context
 ctx, cancel := chromedp.NewContext(
  context.Background(),
  // chromedp.WithDebugf(log.Printf),
 )
 defer cancel()

 // capture screenshot of an element
 var buf []byte
 if err := chromedp.Run(ctx, elementScreenshot(`https://pkg.go.dev/`, `img.Homepage-logo`, &buf)); err != nil {
  log.Fatal(err)
 }
 if err := os.WriteFile("elementScreenshot.png", buf, 0o644); err != nil {
  log.Fatal(err)
 }

 // capture entire browser viewport, returning png with quality=90
 if err := chromedp.Run(ctx, fullScreenshot(`https://brank.as/`, 90, &buf)); err != nil {
  log.Fatal(err)
 }
 if err := os.WriteFile("fullScreenshot.png", buf, 0o644); err != nil {
  log.Fatal(err)
 }

 log.Printf("wrote elementScreenshot.png and fullScreenshot.png")
}

// elementScreenshot takes a screenshot of a specific element.
func elementScreenshot(urlstr, sel string, res *[]byte) chromedp.Tasks {
 return chromedp.Tasks{
  chromedp.Navigate(urlstr),
  chromedp.Screenshot(sel, res, chromedp.NodeVisible),
 }
}

// fullScreenshot takes a screenshot of the entire browser viewport.
//
// Note: chromedp.FullScreenshot overrides the device's emulation settings. Use
// device.Reset to reset the emulation and viewport settings.
func fullScreenshot(urlstr string, quality int, res *[]byte) chromedp.Tasks {
 return chromedp.Tasks{
  chromedp.Navigate(urlstr),
  chromedp.FullScreenshot(res, quality),
 }
}

该示例就是通过elementScreenshot函数中截取了https://pkg.go.dev/中的img.Homepage-logo标签的图片。另外一个就是通过fullScreenshot函数来截取了https://brank.as/网站的长图。因为图像较大,大家可以运行代码查看具体的效果。

其他功能

  • 模拟表单提交:可以使用chromedp.Submit函数模拟表单提交。
  • 模拟鼠标滚动:可以使用chromedp.ScrollIntoView函数模拟鼠标滚动。
  • 模拟键盘输入:可以使用chromedp.KeyEvent函数模拟键盘输入。

github上也给出了具体的示例代码,大家可以自行查看。示例链接:https://github.com/chromedp/examples

chromedp的应用场景

由于chromedp具有高效、稳定、可靠的特点,因此在以下场景中得到了广泛的应用:1.数据采集:可以使用chromedp对各类网站进行数据采集。2.自动化测试:可以使用chromedp对Web应用进行自动化测试。3.网络爬虫:可以使用chromedp对各类网站进行爬取。4.数据分析:可以使用chromedp对采集到的数据进行分析和处理。

总结

chromedp基于Chrome DevTool协议实现。可以对网页内容进行采集、模拟点击、提交数据、将网页内容转换成pdf、抓取网页长图等功能。

标签:网页,log,err,一库,chromedp,https,178,example
From: https://www.cnblogs.com/arena/p/17737368.html

相关文章

  • Go每日一库之176:filetype(文件类型鉴别)
    filetype(https://github.com/h2non/filetype)是一个Go语言的第三方库,可以根据文件的魔数(magicnumbers)签名来推断文件的类型和MIME类型。它支持多种常见的文件类型,包括图片、视频、音频、文档、压缩包等。它还提供了一些便捷的函数和类型匹配器,可以方便地对文件进行分类和筛选......
  • Go每日一库之174:delve (Go 调试工具)
    简介Delve 用来调试 Go 语言开发的程序,该工具的目标是为 Go 语言提供一个简单、功能齐全的调试工具。为什么不推荐gdb• gdb对Go的调试支持是通过一个python脚本文件 src/runtime/runtime-gdb.py 扩展的,功能有限• gdb只能做到最基本的变量打印,却理解不了go......
  • Go每日一库之173:Pie (高性能、类型安全的slice操作库)
    在Go语言中,对slice和map是我们最常用的数据结构。比如,计算两个切片的交集、差集;判断切片中的元素是否都满足某个条件的等。我推荐大家使用这个包:[elliotchance/pie](https://github.com/elliotchance/pie)。该包封装了对切片和map的常用操作,能满足工作中的大部分需求。比如计算......
  • Go每日一库之172:go-prompt
    简介受python提示工具包的启发,在Go中构建强大的交互式提示一、代码示例packagemainimport( "fmt" "github.com/c-bata/go-prompt")funccompleter(dprompt.Document)[]prompt.Suggest{ s:=[]prompt.Suggest{ {Text:"users",Description:"Store......
  • Go每日一库之133:lo(基于泛型的 Golang lodash 库)
    近日,Go核心开发团队终于宣布了Go1.18正式版本的发布!这是一个大家期待很久的版本!Go1.18包含大量新功能:模糊测试、性能改进、工作区等,以及Go语言开源以来最大的一次语法特性变更——支持泛型!支持泛型后,我们便不再需要写如下冗余的代码:现在只需要简单的一行即可:funcMi......
  • Go每日一库之132:wasm与tinygo
    WASM的概念,这几年还是挺火的,新的语言,比如Rust、Go、Swift等,都对WASM提供支持。相比之下,Go语言的简单性,使得对WASM的支持,使用起来也较简单。本文是目前公开资料中为数不多较完整的教程,希望能对你有帮助。WASM是什么标题说:“Golang中的Wasm太棒了。”,但请用几句话来说......
  • Go每日一库之131:caddy(轻量web服务器)
    一直以来,我都是使用Nginx作为Web服务器,但是配置可以说是非常麻烦了。每次我要新开一个域名,都要先使用acme.sh签发SSL证书,然后再写配置,大概要花上5分钟的时间。曾经想过写个脚本自动完成这些工作,但是苦于对Linux的了解不多,也就作罢了。最近看到了Caddy,一个用Go写的......
  • Go每日一库之130:go-humanize(人性化显示)
    go-humanize是一个「人性化」的Go语言库,人性化的意思不是形容这个Go语言库,而是这个Go语言库实现的功能,它可以把数字、时间、容量等转换为我们人类容易理解的词语,比如硬盘的容量是82854982bytes,我们可不太好理解,但是如果说容量是83M,那就好理解了,go-humanize干的就是这个事情。......
  • Go每日一库之129:promu(Prometheus构建发布工具)
    众所周知,Go语言中打包命令是gobuild。在项目中,你可以单独使用gobuild命令对项目进行编译打包,也可以根据自己的需要,在该命令后加各种参数。prometheus官方为了统一项目(包括prometheus、alertmanager和各种官方的exporter)的编译和打包,开发了promu工具。官方对promu工具......
  • Go每日一库之128:podinfo(k8s微服务模板)
    项目介绍官方Github:PodinfoPodinfo是一个用Go制作的小型web应用程序,它展示了在Kubernetes中运行微服务的最佳实践。它已实现的技术指标(截选自官方README.md):里面每一项技术指标的实现方式,其实都可以拿出来单独讲好久,相关理论也有好多。这里我只是讲针对这个项......