源起

最近有个项目要用到headless,以前用过python Selenium。最近想试下go版本的。但是刚开始时候,发现一个坑。网上有部分代码是老版本的chromedp。新版本不通用,就记录下我的学习过程

chromedp 是什么?

广泛使用的headless browser解决方案PhantomJS已经宣布不再继续维护,转而推荐使用headless chrome

那么headless chrome究竟是什么呢,Headless Chrome 是 Chrome 浏览器的无界面形态,可以在不打开浏览器的前提下,使用所有 Chrome 支持的特性运行您的程序。可以像在其他现代浏览器里一样渲染目标网页,并能进行网页截图,获取cookie,获取html等操作.

想要在golang程序里使用headless chrome,需要借助一些开源库,实现和headless chrome交互的库有很多,这里选择chromedp,接口和Selenium类似,易上手。

普通模式

普通模式会在电脑上弹出浏览器窗口,可以在浏览器中看到代码执行的效果,调用完成之后需要关闭掉浏览器。

chrome headless模式

chrome headless模式不会弹出浏览器窗口,并且你多次go run main.go的时候, go 代码运行中断导致后台chrome headless不能退出,导致第二次本地调试失败, 此时解决方案就是自己手动结束chrome进程。
因此在调试go代码的时候不建议使用chrome headless模式。

一些浏览器参数

  • --no-first-run 第一次不运行
  • ---default-browser-check 不检查默认浏览器
  • --disable-gpu 关闭gpu,服务器一般没有显卡
  • remote-debugging-port chrome-debug工具的端口(golang chromepd 默认端口是9222,建议不要修改)
  • --no-sandbox 不开启沙盒模式可以减少对服务器的资源消耗,但是服务器安全性降低,配和参数 --remote-debugging-address=127.0.0.1 一起使用
  • --disable-plugins 关闭chrome插件
  • --remote-debugging-address 远程调试地址 0.0.0.0 可以外网调用但是安全性低,建议使用默认值 127.0.0.1
  • --window-size 窗口尺寸

使用代码:

    opts := append(chromedp.DefaultExecAllocatorOptions[:],chromedp.Flag("headless", false),  // 不开启图像界面chromedp.ProxyServer("http://10.10.1.1:21869"), // 设置代理访问chromedp.Flag("mute-audio", false), // 关闭声音)allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)defer cancel()

选择器:

熟悉最常用的几个方法:chromedp.NewContext() 初始化chromedp的上下文,后续这个页面都使用这个上下文进行操作chromedp.Run() 运行一个chrome的一系列操作chromedp.Navigate() 将浏览器导航到某个页面chromedp.WaitVisible() 等候某个元素可见,再继续执行。chromedp.Click() 模拟鼠标点击某个元素chromedp.Value() 获取某个元素的value值chromedp.ActionFunc() 再当前页面执行某些自定义函数chromedp.Text() 读取某个元素的text值chromedp.Evaluate() 执行某个js,相当于控制台输入jsnetwork.SetExtraHTTPHeaders() 截取请求,额外增加header头chromedp.SendKeys() 模拟键盘操作,输入字符chromedp.Nodes() 根据xpath获取某些元素,并存储进入数组chromedp.NewRemoteAllocatorchromedp.OuterHTML() 获取元素的outer htmlchromedp.Screenshot() 根据某个元素截图page.CaptureScreenshot() 截取整个页面的元素chromedp.Submit() 提交某个表单chromedp.WaitNotPresent() 等候某个元素不存在,比如“正在搜索。。。”

简单说就是1. 设定参数后调起浏览器 2. 浏览器根据你设定的事件进行操作。下面我们直接看一个代码案例

案例:启动访问某个网站

package mainimport ("context""log""time""github.com/chromedp/chromedp"
)func main() {// 禁用chrome headlessopts := append(chromedp.DefaultExecAllocatorOptions[:],chromedp.Flag("headless", false),)allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)defer cancel()// create chrome instancectx, cancel := chromedp.NewContext(allocCtx,chromedp.WithLogf(log.Printf),)defer cancel()// create a timeoutctx, cancel = context.WithTimeout(ctx, 5*time.Second)defer cancel()// navigate to a page, wait for an element, clickvar example stringsel := `//*[@id="username"]`err := chromedp.Run(ctx,chromedp.Navigate(`https://github.com/awake1t`),chromedp.WaitVisible("body"),//缓一缓chromedp.Sleep(2*time.Second),chromedp.SendKeys(sel, "username", chromedp.BySearch), //匹配xpath)if err != nil {log.Fatal(err)}log.Printf("Go's time.After example:\n%s", example)}

访问网站并且截图

package mainimport ("context""io/ioutil""log""math""time""github.com/chromedp/cdproto/emulation""github.com/chromedp/cdproto/page""github.com/chromedp/chromedp"
)func main() {// 禁用chrome headlessopts := append(chromedp.DefaultExecAllocatorOptions[:],chromedp.Flag("headless", false),)allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)defer cancel()// create chrome instancectx, cancel := chromedp.NewContext(allocCtx,chromedp.WithLogf(log.Printf),)defer cancel()// create a timeoutctx, cancel = context.WithTimeout(ctx, 15*time.Second)defer cancel()// navigate to a page, wait for an element, click// capture screenshot of an elementvar buf []byte// capture entire browser viewport, returning png with quality=90if err := chromedp.Run(ctx, fullScreenshot(`https://github.com/awake1t`, 90, &buf)); err != nil {log.Fatal(err)}if err := ioutil.WriteFile("./Screenshot.png", buf, 0644); err != nil {log.Fatal(err)}log.Println("图片写入完成")}// fullScreenshot takes a screenshot of the entire browser viewport.
// Liberally copied from puppeteer's source.
// Note: this will override the viewport emulation settings.
func fullScreenshot(urlstr string, quality int64, res *[]byte) chromedp.Tasks {return chromedp.Tasks{chromedp.Navigate(urlstr),chromedp.ActionFunc(func(ctx context.Context) error {// get layout metrics_, _, contentSize, err := page.GetLayoutMetrics().Do(ctx)if err != nil {return err}width, height := int64(math.Ceil(contentSize.Width)), int64(math.Ceil(contentSize.Height))// force viewport emulationerr = emulation.SetDeviceMetricsOverride(width, height, 1, false).WithScreenOrientation(&emulation.ScreenOrientation{Type:  emulation.OrientationTypePortraitPrimary,Angle: 0,}).Do(ctx)if err != nil {return err}// capture screenshot*res, err = page.CaptureScreenshot().WithQuality(quality).WithClip(&page.Viewport{X:      contentSize.X,Y:      contentSize.Y,Width:  contentSize.Width,Height: contentSize.Height,Scale:  1,}).Do(ctx)if err != nil {return err}return nil}),}
}

更多操作:

https://github.com/chromedp/examples

官方文档:

https://godoc.org/github.com/chromedp/chromedp

golang操作chromedp模拟浏览器基础入门相关推荐

  1. python模拟浏览器下载文件在哪里_python下selenium模拟浏览器基础操作

    1.安装及下载 selenium安装: pip install selenium  即可自动安装selenium geckodriver下载:https://github.com/mozilla/ge ...

  2. Java操作Chrome模拟浏览器操作

    1.首先pom中引入jar包: <dependency><groupId>org.seleniumhq.selenium</groupId><artifact ...

  3. golang实现服务端浏览器截屏

    " 每天,探索一点点." 笔者近期在使用golang进行开发工作时,受360技术公众号曾发布过文章的启发,想到是否可以使用golang操作无屏浏览器(headless browse ...

  4. JavaScript 基础入门

    JavaScript 基础入门 简介 一.JS 基础语法 1.JS 语法与变量 (1)JavaScript 的书写位置 (2)认识输入输出语句 (3)学会处理报错 (4)变量 (5)变量声明提升 2. ...

  5. python 模拟浏览器selenium 微信_Spider-Python爬虫之使用Selenium模拟浏览器行为

    分析 他的代码比较简单,主要有以下的步骤:使用BeautifulSoup库,打开百度贴吧的首页地址,再解析得到id为new_list标签底下的img标签,最后将img标签的图片保存下来. header ...

  6. 【Python3零基础入门笔记】05 Python时间处理——time库的使用

    time库的使用: time库基本情况 时间获取 时间格式化 程序计时 文本进度条实例 time库基本情况 Time库是python中处理时间的标准库 计算机时间表达 提供获取系统时间并格式化输出功能 ...

  7. python 模拟浏览器selenium_python爬虫:使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...

  8. java使用selenium实现模拟浏览器操作API大全 模拟登录

    java selenium 模拟登录 模拟浏览器 API大全 (一)环境安装之Java (二)环境安装之IntelliJ IDEA (三)环境安装之Selenium 1.通过jar包安装 2.通过Ma ...

  9. 孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1

    孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1 (完整学习过程屏幕记录视频地址在文末) 要模拟进行浏览器操作,只用requests是不行的,因此今天了解到有专门的解决方案 ...

  10. Python利用Selenium模拟浏览器自动操作

    概述 在进行网站爬取数据的时候,会发现很多网站都进行了反爬虫的处理,如JS加密,Ajax加密,反Debug等方法,通过请求获取数据和页面展示的内容完全不同,这时候就用到Selenium技术,来模拟浏览 ...

最新文章

  1. 2021年春季学期-信号与系统-第一次作业参考答案-第四题
  2. 一个项目中既有移动端,同时也有PC端的代码,并且 他们的代码分开写的,那么如何实现在手机跳转手机页面,pc点击跳转pc页面...
  3. 对session和cookie的一些理解
  4. ELF 动态链接 so的动态符号表(.dynsym)
  5. mysql 加载数据校验_mysql 导入数据后的校验程序
  6. perl DBD Informix install and test
  7. SpringAOP中的JointPoint和ProceedingJoinPoint使用详解(附带详细示例)
  8. keli4 指针运算_如何在KEIL中使用MicroLIB | 学步园
  9. php 批量采集 邮箱,万能全网邮箱批量采集工具按照关键字搜索邮箱教程
  10. 完美解决SAMSUNG Mobile USB CDC Composite Device安装失败 三星手机USB驱动失败。
  11. 人工智能深度学习Caffe框架介绍
  12. 给大家爆个秘密:怎样迅速提高你的校内人人网人气
  13. android Activity设置透明主题样式方法
  14. flask 蓝本(blueprint)
  15. 哈工大CSAPP大作业 2022
  16. 入侵必练的CMD命令
  17. python去掉字典重复项_从字典列表中删除重复项python
  18. vue2.0安装3.0安装,配置介绍功能模块
  19. Android UVCCamera问题——Cause: null pointer dereference
  20. Fast AI人工智能审图平台-建筑图纸设计效率的倍增器

热门文章

  1. session自动登录抽屉网(自动携带cookie)
  2. Android ANR日志分析总结
  3. U3D性能优化之MeshBaker(不带光照)
  4. HashMap碰撞问题解析
  5. 世界十大名言是什么?
  6. python文件打包成exe是 upx不可用、找不到py文件_简单使用Pyinstaller将Python文件打包为可执行性exe-文件夹变成exe...
  7. spring boot+thymeleaf+bootstrap 简单实现后台管理系统界面
  8. 免费的个人网路监控软体 NetLimiter 2 Monitor
  9. Python输入一个表示星期的数字(1表示星期一,2表示星期二......6表示星期六,7表示星期日),输出对应的星期英文单词
  10. Boost.Geometry介绍