devtools.browser
包 devtools.browser
注意:除了devtools包下、base_devtools.browser包也有同名文件;清注意区分。
devtools.NewBrowser 创建浏览器对象、并返回浏览器对象。
当调用这个函数的时候、就会默认打开对应路径的浏览器、
如果你需要多个进程、多个线程、多个browser对象的时候,无需担心进程冲突、因为他会自动选择未被占用的端口进行通信。
简单理解就是不用管他。你写你的剩下的交给LUNA
Arguments
chromiumPath 参数是必须的 , chromiumPath 就是你浏览器的路径;让我试图详细的解释一下。
- mac 、他应该就是你下载下来的浏览器找到他的可执行程序、通常叫Chromium.app,然后右键、显示包内容
- 找到类似MacOS目录的Chromium 这个就是你可运行程序的文件、他的路径就是本参数的路径
- 如果你的路径有空格、你不妨可以创建一个软连接(windows叫快捷方式)到任何你喜欢的目录,然后作为路径也是一样的
- window、
- 你找到你的Chromium.exe作为路径就可以了
- 如果路径有空格、或者权限问题、你也可以在任意目录创建快捷方式、来作为可执行文件路径也是一样的。
- mac 、他应该就是你下载下来的浏览器找到他的可执行程序、通常叫Chromium.app,然后右键、显示包内容
options *BrowserOptions 参数是可选的;具体可以查看示例代码。这里着重说4点、其他看代码或案例更好理解。
CachePath:
这个就是你可以理解一个用户就一个缓存目录、这个就是你当前用户的缓存目录;选一个你喜欢的任意目录均可。
其实就是存放你浏览器缓存数据的,比较占用磁盘空间。
ImgPath:
- 这个是基于视觉所必须的、也就是这个里面应该都是你自己存储的小图的路径;比如你的路径是:"/Users/xxx/Documents/workspace/luna/test_img/baidu_img" 那么你可以在下面在创建文件存储
- 你具体的小图,比如home_target.png等等
Fingerprint:
- 这里不展开讲、可以查看专门设置指纹的案例章节,这里是设置浏览器指纹的、因为我修改的是chromium源代码,所以你只有用我的浏览器才可以用这个
- 对应的功能、他可以修改header信息、包括useragent、包括、语言、地理位置、时区、cavans指纹、
- 包括、隐身模式下浏览器头暴露的问题、包括鼠标键盘可信问题、包括puppeteer、playwright、Selenium、brave等
- 特征被识别问题。
ImgPath:
- 这个是基于视觉所必须的、也就是这个里面应该都是你自己存储的小图的路径;比如你的路径是:"/Users/xxx/Documents/workspace/luna/test_img/baidu_img" 那么你可以在下面在创建文件存储
- 你具体的小图,比如home_target.png等等、建议看一下案例,因为很简单、但是不好解释。
Usage
//示例1
//mac 。chromiumPath:="/Users/xxx/Documents/workspace/Chromium.app/Contents/MacOS/Chromium"
//windows。chromiumPath:="C:\Users\Username\Documents\Chromium.exe"
//打开浏览器、并且创建浏览器对象。
chromiumPath := "your chromium path/Chromium.app/Contents/MacOS/Chromium"
browserObj := devtools.NewBrowser(chromiumPath, &devtools.BrowserOptions{
CachePath: luna_utils.CreateCacheDirInSubDir("your custom cache directory/cache"),
Headless: false,
})
time.Sleep(1 * time.Minute)
//关闭浏览器
browserObj.Close()
//示例2
chromiumPath:="/Users/xxx/Documents/workspace/Chromium.app/Contents/MacOS/Chromium"
browserObj := devtools.NewBrowser(chromiumPath, &devtools.BrowserOptions{
//每个用户缓存文件的路径、就是浏览器缓存
CachePath: luna_utils.CreateCacheDirInSubDir("/Users/xxx/Documents/workspace/cache"),
//这个是你图片缓存的路径、如果后面用到基于视觉操作、就需要这个路径;
ImgPath: "/Users/xxx/Documents/workspace/luna/test_img/baidu_img",
//是否是Headless模式
Headless: false,
//代理ip、支持http、https、sockts5代理类型、同时无论是否有用户名密码均支持。
如:"socks5://API1M5V:9BF49220D11@42.179.160.60:39349"
如:"https://API1M5TV:9BFF49220D11@42.179.160.60:39349"
如:"http://42.179.160.60:39349"
ProxyStr: "https://API1M5TV:9BFF49220D11@42.179.160.60:39349",
//这个在指纹篇详细介绍、这里仅作示例、大概意思就是可以在这里修改你的浏览器指纹。
Fingerprint: []string{"fingerprint1", "fingerprint2"},
//窗口大小 、就是你浏览器的窗口大小
WindowSize: &devtools.WindowSize{
Width: 1496,
Height: 967,
},
})
time.Sleep(1 * time.Minute)
//关闭浏览器
browserObj.Close()
Returns
devtools.browser
OpenPage 打开一个新页面
err,p1:=browserObj.OpenPage("http://www.baidu.com")
Arguments
Url 你需要打开的网址。
Returns
error, 错误信息
*Page ,devtools.Page对象
OpenPageAndListen 打开页面并且创建监听、例如你可以在监听里面监听页面是否加载完成、监听网络请求情况等。
Arguments
url string 你需要打开的网址
fns ...func(devToolsConn *protocol.DevToolsConn) 这个是一个回掉函数、他会自动传入protocol.DevToolsConn类型的链接对象
以便于后续操作。
devToolsConn、这个是底层的sockets链接的对象;他会作为参数传递进来、你可以根据自己的需求判断是否需要使用。
var wg sync.WaitGroup // 同步等待
wg.Add(1) // 增加等待的数量
err, p1 := browserObj.OpenPageAndListen("https://www.baidu.com/", func(devToolsConn *protocol.DevToolsConn) {
//显示json格式日志
devToolsConn.ShowLog(true)
page.PageEnable(devToolsConn)
//等待页面加载完成
devToolsConn.SubscribeOneTimeEvent("Page.loadEventFired", func(param interface{}) {
wg.Done() // 标记回调函数执行完成
page.PageDisable(devToolsConn)
})
})
wg.Wait() // 等待回调函数执行完成
Returns
error, 错误信息
*Page ,devtools.Page对象
GetPages 获取当前浏览器显示的所有页面。
for _,pi:=range browserObj.GetPages(){
//这句可选、只是将页面置于前台而已,防止个别网站对隐藏页面识别
browserObj.SwitchPage(pi)
//打印基本信息
fmt.Println(pi.PageID)
fmt.Println(pi.CurrentURL)
fmt.Println(pi.DevToolsConn)
fmt.Println(pi.Title)
fmt.Println(pi.GetHtml())
}
Returns
[]*Page ,devtools.Page对象数组
SwitchPage 切换页面至前台显示
Returns
gjson.Result 返回devtools 协议返回内容。
SwitchPageAndListen 切换页面至前台显示、并且监听。
切换到页面后、可以监听页面的事件、比如页面加载事件、网络事件等。
for _, pi := range browserObj.GetPages() {
browserObj.SwitchPageAndListen(pi, func(devToolsConn *protocol.DevToolsConn) {
//仅举例
network.EnableNetwork(pi.DevToolsConn)
network.RequestResponseAsync(pi.DevToolsConn, func(requestId string, request, response map[string]interface{}) {
//这里等request & response 是一一对应等请求
fmt.Println(luna_utils.FormatJSONAsString(request), luna_utils.FormatJSONAsString(response))
//如果需要监听某个网址内容、并且打印他具体等网络请求信息等。
//network.GetResponseBody(pi.DevToolsConn, requestId, time.Minute)
})
//end
})
}
Returns
gjson.Result 返回devtools 协议返回内容。
Close 关闭整个浏览器、
大多数情况下、你用不到这个函数,但是当你需要写多线程、或者多进程的时候需要用。
browserObj.Close()