Go chromedp库的使用 —CDP
文章目录
CDP(Chrome DevTools Protocol)
Chrome DevTools Protocol 是基于websocket的一种协议,可以运行其他工具或者库来通过CDP协议进行检查、调试Chrome和其他基于Blink的浏览器。
基于CDP协议的相关语言操作
- Pyppeteer,它是谷歌chrome官方无头框架puppeteer的python版本 https://miyakogi.github.io/pyppeteer/reference.html
- Puppeeer,它是一个Node库,可以使用Node.js来实现控制Chrome或Chromiumhttp://www.puppeteerjs.com/
- Chromedp, 是由Go语言编写,支持Chrome DevTools Protocol的一个库,不需要依赖其他的外界服务(如Selenium和PhantomJS) https://github.com/chromedp/chromedp
Chromedp使用
- 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组成的任务
示例
本地界面浏览器操作
默认情况下chromedp使用的浏览器为headless-chrome
func main() {
//禁用headless-chrome 无头浏览器 推荐debug模式下使用
opts := append(chromedp.DefaultExecAllocatorOptions[:], chromedp.Flag("headless", false))
alloctx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)
defer cancel()
ctx, cancel := chromedp.NewContext(alloctx, chromedp.WithErrorf(log.Printf))
defer cancel()
var nodes []*cdp