chromedp入门

chromedp是什么?

chromedp是go写的,支持Chrome DevTools Protocol 的一个驱动浏览器的库。并且它不需要依赖其他的外界服务(比如 Selenium 和 PhantomJs)。

Chrome DevTools Protocol (CDP)

Chrome DevTools Protocol (CDP) 的主页在:https://chromedevtools.github.io/devtools-protocol/。它提供一系列的接口来查看,检查,调整并且检查 Chromium 的性能。Chrome 的开发者工具就是使用这一系列的接口,并且 Chrome 开发者工具来维护这些接口。

所谓 CDP 的协议,本质上是什么呢?本质上是基于 websocket 的一种协议。比如在我们打开 webtool 调试工具的时候,其实调试工具也是一个web页面,两个web页面通过websocket建立了一个联系。所以我们如果写了一个客户端程序,也和目标页面创建一个基于 CDP 的 websocket连接,我们也可以通过这个协议来对页面进行操作。

如何打开 Protocol Monitor

在chrome的开发者工具中打开实验选项 Protocol Monitor重启chrome,在console的更多里面就可以打开对应的 Monitor

CDP 协议内容

我们从 Protocol Monitor 面板中可以看到,其中有几个字样,Method,Request,Response。这里的 Method 就是对应官网 https://chromedevtools.github.io/devtools-protocol/ 左侧每个Domain的 Event。

20200622151635

这里的每个Method方法可能是调试页面给目标页面发送的,但是更多是目标页面给调试页面发送的消息。所以我们需要读懂每个Method的内容。不过很可惜,我个人感觉官网的每个Method文档的描述写的实在是太简单了,也没有看到更详细的描述,只能通过名字和事件来猜测每个Method意思了。

chromedp 使用

chromedp的使用最快的方法就是看 https://github.com/chromedp/examples 这个项目

基本我们可以熟悉最常用的几个方法了:

  • chromedp.NewContext() 初始化chromedp的上下文,后续这个页面都使用这个上下文进行操作

  • chromedp.Run() 运行一个chrome的一系列操作

  • chromedp.Navigate() 将浏览器导航到某个页面

  • chromedp.WaitVisible() 等候某个元素可见,再继续执行。

  • chromedp.Click() 模拟鼠标点击某个元素

  • chromedp.Value() 获取某个元素的value值

  • chromedp.ActionFunc() 再当前页面执行某些自定义函数

  • chromedp.Text() 读取某个元素的text值

  • chromedp.Evaluate() 执行某个js,相当于控制台输入js

  • network.SetExtraHTTPHeaders() 截取请求,额外增加header头

  • chromedp.SendKeys() 模拟键盘操作,输入字符

  • chromedp.Nodes() 根据xpath获取某些元素,并存储进入数组

  • chromedp.NewRemoteAllocator

  • chromedp.OuterHTML() 获取元素的outer html

  • chromedp.Screenshot() 根据某个元素截图

  • page.CaptureScreenshot() 截取整个页面的元素

  • chromedp.Submit() 提交某个表单

  • chromedp.WaitNotPresent() 等候某个元素不存在,比如“正在搜索。。。”

  • chromedp.Tasks{} 一系列Action组成的任务

实践

我们尝试打开 https://www.cnblogs.com/ 的首页,然后获取所有文章的标题和链接:

package main

import (
 "context"
 "fmt"
 "log"

 "github.com/chromedp/cdproto/cdp"
 "github.com/chromedp/chromedp"
)

func main() {

 ctx, cancel := chromedp.NewContext(
  context.Background(),
  chromedp.WithLogf(log.Printf),
 )
 defer cancel()

 var nodes []*cdp.Node
 err := chromedp.Run(ctx,
  chromedp.Navigate("https://www.cnblogs.com/"),
  chromedp.WaitVisible(`#footer`, chromedp.ByID),
  chromedp.Nodes(`.//a[@class="titlelnk"]`, &nodes),
 )
 if err != nil {
  log.Fatal(err)
 }

 fmt.Println("get nodes:", len(nodes))
 // print titles
 for _, node := range nodes {
  fmt.Println(node.Children[0].NodeValue, ":", node.AttributeValue("href"))
 }
}

### Chromedp 使用教程 Chromedp 是一种基于 Chrome 开发者协议 (Chrome DevTools Protocol) 的工具,可以更快速、简洁地驱动支持此协议的浏览器[^2]。 #### 安装 Chromedp 要开始使用 Chromedp,请按照以下命令进行安装: ```bash $ go get -u github.com/chromedp/chromedp ``` 这一步会将 Chromedp 及其依赖项下载到您的 GOPATH 中[^1]。 --- ### 示例代码:基本用法 下面是一段简单的示例代码,展示如何使用 Chromedp 访问网页并提取内容: ```go package main import ( "context" "log" "time" "github.com/chromedp/cdproto/network" "github.com/chromedp/chromedp" ) func main() { ctx, cancel := chromedp.NewContext(context.Background()) defer cancel() // 设置超时时间 ctx, cancel = context.WithTimeout(ctx, 30*time.Second) defer cancel() var html string err := chromedp.Run(ctx, chromedp.Navigate(`https://example.com`), chromedp.Sleep(2*time.Second), chromedp.ActionFunc(func(ctx context.Context) error { return network.Enable().Do(ctx) }), chromedp.OuterHTML(`body`, &html), ) if err != nil { log.Fatal(err) } log.Printf("Page HTML:\n%s", html) } ``` 上述代码实现了以下几个功能: - 创建一个新的上下文环境 `ctx` 并设置超时时间为 30 秒。 - 导航至指定 URL (`https://example.com`)。 - 延迟等待页面加载完成。 - 启用网络事件监听器以便捕获请求和响应数据。 - 提取 `<body>` 标签的内容并打印出来。 --- ### 更复杂的案例:从 Instagram 下载图片 如果希望进一步了解 Chromedp 的高级应用,比如从社交媒体平台抓取图像资源,则可以参考如下代码片段。这是一个简化版的例子,演示了如何利用 Chromedp 和 Go 实现自动化任务[^4]。 ```go package main import ( "bytes" "context" "fmt" "io/ioutil" "log" "os" "path/filepath" "strings" "time" "github.com/chromedp/chromedp" ) func downloadImages(username string) { ctx, cancel := chromedp.NewExecAllocator(context.Background(), append(chromedp.DefaultExecAllocatorOptions[:], chromedp.Flag("headless", false))...) defer cancel() ctx, cancel = chromedp.NewContext(ctx, chromedp.WithLogf(log.Printf)) defer cancel() // Set a timeout of 60 seconds. ctx, cancel = context.WithTimeout(ctx, 60*time.Second) defer cancel() var buf []byte if err := chromedp.Run(ctx, chromedp.Tasks{ chromedp.Navigate(fmt.Sprintf("https://www.instagram.com/%s/", username)), chromedp.Sleep(5 * time.Second), // Wait for images to load chromedp.Screenshot("#grid img", &buf, chromedp.NodeVisible), }, ); err != nil { log.Fatalf("Failed to capture screenshot: %v", err) } //
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值