golang操作chromedp模拟浏览器基础入门
源起
最近有个项目要用到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模拟浏览器基础入门相关推荐
- python模拟浏览器下载文件在哪里_python下selenium模拟浏览器基础操作
1.安装及下载 selenium安装: pip install selenium 即可自动安装selenium geckodriver下载:https://github.com/mozilla/ge ...
- Java操作Chrome模拟浏览器操作
1.首先pom中引入jar包: <dependency><groupId>org.seleniumhq.selenium</groupId><artifact ...
- golang实现服务端浏览器截屏
" 每天,探索一点点." 笔者近期在使用golang进行开发工作时,受360技术公众号曾发布过文章的启发,想到是否可以使用golang操作无屏浏览器(headless browse ...
- JavaScript 基础入门
JavaScript 基础入门 简介 一.JS 基础语法 1.JS 语法与变量 (1)JavaScript 的书写位置 (2)认识输入输出语句 (3)学会处理报错 (4)变量 (5)变量声明提升 2. ...
- python 模拟浏览器selenium 微信_Spider-Python爬虫之使用Selenium模拟浏览器行为
分析 他的代码比较简单,主要有以下的步骤:使用BeautifulSoup库,打开百度贴吧的首页地址,再解析得到id为new_list标签底下的img标签,最后将img标签的图片保存下来. header ...
- 【Python3零基础入门笔记】05 Python时间处理——time库的使用
time库的使用: time库基本情况 时间获取 时间格式化 程序计时 文本进度条实例 time库基本情况 Time库是python中处理时间的标准库 计算机时间表达 提供获取系统时间并格式化输出功能 ...
- python 模拟浏览器selenium_python爬虫:使用Selenium模拟浏览器行为
前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...
- java使用selenium实现模拟浏览器操作API大全 模拟登录
java selenium 模拟登录 模拟浏览器 API大全 (一)环境安装之Java (二)环境安装之IntelliJ IDEA (三)环境安装之Selenium 1.通过jar包安装 2.通过Ma ...
- 孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1
孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1 (完整学习过程屏幕记录视频地址在文末) 要模拟进行浏览器操作,只用requests是不行的,因此今天了解到有专门的解决方案 ...
- Python利用Selenium模拟浏览器自动操作
概述 在进行网站爬取数据的时候,会发现很多网站都进行了反爬虫的处理,如JS加密,Ajax加密,反Debug等方法,通过请求获取数据和页面展示的内容完全不同,这时候就用到Selenium技术,来模拟浏览 ...
最新文章
- 2021年春季学期-信号与系统-第一次作业参考答案-第四题
- 一个项目中既有移动端,同时也有PC端的代码,并且 他们的代码分开写的,那么如何实现在手机跳转手机页面,pc点击跳转pc页面...
- 对session和cookie的一些理解
- ELF 动态链接 so的动态符号表(.dynsym)
- mysql 加载数据校验_mysql 导入数据后的校验程序
- perl DBD Informix install and test
- SpringAOP中的JointPoint和ProceedingJoinPoint使用详解(附带详细示例)
- keli4 指针运算_如何在KEIL中使用MicroLIB | 学步园
- php 批量采集 邮箱,万能全网邮箱批量采集工具按照关键字搜索邮箱教程
- 完美解决SAMSUNG Mobile USB CDC Composite Device安装失败 三星手机USB驱动失败。
- 人工智能深度学习Caffe框架介绍
- 给大家爆个秘密:怎样迅速提高你的校内人人网人气
- android Activity设置透明主题样式方法
- flask 蓝本(blueprint)
- 哈工大CSAPP大作业 2022
- 入侵必练的CMD命令
- python去掉字典重复项_从字典列表中删除重复项python
- vue2.0安装3.0安装,配置介绍功能模块
- Android UVCCamera问题——Cause: null pointer dereference
- Fast AI人工智能审图平台-建筑图纸设计效率的倍增器
热门文章
- session自动登录抽屉网(自动携带cookie)
- Android ANR日志分析总结
- U3D性能优化之MeshBaker(不带光照)
- HashMap碰撞问题解析
- 世界十大名言是什么?
- python文件打包成exe是 upx不可用、找不到py文件_简单使用Pyinstaller将Python文件打包为可执行性exe-文件夹变成exe...
- spring boot+thymeleaf+bootstrap 简单实现后台管理系统界面
- 免费的个人网路监控软体 NetLimiter 2 Monitor
- Python输入一个表示星期的数字(1表示星期一,2表示星期二......6表示星期六,7表示星期日),输出对应的星期英文单词
- Boost.Geometry介绍