通過Golang實現(xiàn)無頭瀏覽器截圖
前言
在Web開發(fā)中,有時需要對網(wǎng)頁進行截圖,以便進行頁面預(yù)覽、測試等操作。
而使用無頭瀏覽器來實現(xiàn)截圖功能,可以避免手動操作的繁瑣和不穩(wěn)定性。
這篇文章將介紹:使用Golang進行無頭瀏覽器的截圖,輕松實現(xiàn)頁面預(yù)覽、測試和模擬用戶操作。
什么是無頭瀏覽器
無頭瀏覽器(Headless Browser)是一種沒有圖形用戶界面的瀏覽器,它可以在后臺運行,并通過編程接口來控制和操作瀏覽器。
無頭瀏覽器通常用于自動化測試、網(wǎng)頁截圖、爬蟲等場景,可以幫助我們更方便地進行網(wǎng)頁操作和數(shù)據(jù)采集。
常見的無頭瀏覽器包括Chrome Headless、PhantomJS、Puppeteer等。
在Golang中,可以使用chromedp
和rod
等庫來實現(xiàn)無頭瀏覽器截圖的功能。
更多場景
使用Golang實現(xiàn)無頭瀏覽器截圖可以在很多場景下發(fā)揮作用,以下是一些常見的場景:
網(wǎng)頁截圖:使用無頭瀏覽器可以方便地對網(wǎng)頁進行截圖,可以用于生成網(wǎng)頁快照、監(jiān)控網(wǎng)頁變化等。
自動化測試:使用無頭瀏覽器可以模擬用戶操作,可以用于自動化測試、自動化部署等。
網(wǎng)頁爬蟲:使用無頭瀏覽器可以模擬瀏覽器行為,可以用于網(wǎng)頁爬蟲、數(shù)據(jù)采集等。
數(shù)據(jù)分析:使用無頭瀏覽器可以獲取網(wǎng)頁數(shù)據(jù),可以用于數(shù)據(jù)分析、機器學(xué)習(xí)等。
使用chromedp
chromedp
是一個基于Chrome或Chromium瀏覽器的DevTools協(xié)議的庫,可以方便地控制瀏覽器進行截圖、模擬用戶操作等功能。
以下是使用chromedp
庫實現(xiàn)無頭瀏覽器截圖的示例代碼:
package?main import?( ???"context" ???"io/ioutil" ???"log" ???"time" ???"github.com/chromedp/cdproto/page" ???"github.com/chromedp/chromedp" ) func?main()?{ ???//?創(chuàng)建一個上下文 ???ctx,?cancel?:=?chromedp.NewContext(context.Background()) ???defer?cancel() ???//?設(shè)置瀏覽器選項 ???opts?:=?append(chromedp.DefaultExecAllocatorOptions[:], ??????chromedp.Flag("headless",?true), ??????chromedp.Flag("disable-gpu",?true), ??????chromedp.Flag("no-sandbox",?true), ??????chromedp.Flag("disable-dev-shm-usage",?true), ??????chromedp.Flag("remote-debugging-port",?"9222"), ???) ???allocCtx,?cancel?:=?chromedp.NewExecAllocator(ctx,?opts...) ???defer?cancel() ???//?創(chuàng)建一個瀏覽器實例 ???ctx,?cancel?=?chromedp.NewContext(allocCtx) ???defer?cancel() ???//?導(dǎo)航到指定的URL ???var?buf?[]byte ???err?:=?chromedp.Run(ctx,?chromedp.Navigate("https://www.baidu.com"),?chromedp.Sleep(2*time.Second),?chromedp.ActionFunc(func(ctx?context.Context)?error?{ ??????//?獲取頁面截圖 ??????var?err?error ??????buf,?err?=?page.CaptureScreenshot().WithQuality(90).WithClip(&page.Viewport{X:?0,?Y:?0,?Width:?1920,?Height:?1080,?Scale:?1}).Do(ctx) ??????if?err?!=?nil?{ ?????????return?err ??????} ??????return?nil ???})) ???if?err?!=?nil?{ ??????log.Fatal(err) ???} ???//?將截圖保存到文件 ???err?=?ioutil.WriteFile("screenshot.png",?buf,?0644) ???if?err?!=?nil?{ ??????log.Fatal(err) ???} }
這段代碼使用chromedp
庫創(chuàng)建了一個無頭瀏覽器實例,并導(dǎo)航到百度首頁。
然后使用page.CaptureScreenshot()
函數(shù)獲取頁面截圖,并將截圖保存到screenshot.png
文件中。
運行演示
把我上面的代碼復(fù)制到main.go
文件中,安裝依賴直接運行即可:
go mod tidy
go run main.go
執(zhí)行效果如下:
需要注意的是,使用chromedp
庫需要先安裝Chrome或Chromium瀏覽器,并將其添加到系統(tǒng)的環(huán)境變量中。
使用rod庫
rod
是另一個基于Chrome或Chromium瀏覽器的DevTools協(xié)議的庫,可以方便地控制瀏覽器進行截圖、模擬用戶操作等功能。
以下是使用rod
庫實現(xiàn)無頭瀏覽器截圖的示例代碼:
package?main import?( ?"github.com/go-rod/rod" ?"github.com/go-rod/rod/lib/proto" ?"github.com/go-rod/rod/lib/utils" ?"github.com/ysmood/gson" ) func?main()?{ ?page?:=?rod.New().MustConnect().MustPage("https://baidu.com").MustWaitLoad() ?//簡單模式,默認截圖設(shè)置 ?page.MustScreenshot("my.png") ?//自定義截圖設(shè)置 ?img,?_?:=?page.Screenshot(true,?&proto.PageCaptureScreenshot{ ??Format:??proto.PageCaptureScreenshotFormatJpeg, ??Quality:?gson.Int(90), ??Clip:?&proto.PageViewport{ ???X:??????0, ???Y:??????0, ???Width:??300, ???Height:?200, ???Scale:??1, ??}, ??FromSurface:?true, ?}) ?_?=?utils.OutputFile("my.jpg",?img) }
這段代碼使用rod
庫創(chuàng)建了一個無頭瀏覽器實例,并導(dǎo)航到百度首頁。
然后使用page.MustScreenshot()
函數(shù)獲取頁面截圖,并將截圖保存到my.png
文件中。
同樣演示了使用page.Screenshot
自定義截圖,并將自定義截圖保存到了my.jpg
文件中。
需要注意的是,使用rod
庫需要先安裝Chrome或Chromium瀏覽器,并將其添加到系統(tǒng)的環(huán)境變量中。
運行方式
rod
庫示例代碼的運行方式和chromedp
基本一致,略有區(qū)別的是我們需要根據(jù)提示,運行多次go run main.go
安裝需要的插件:
碰到上面提示不用慌,再執(zhí)行一次go run main.go
即可
執(zhí)行效果如下:
注意
再強調(diào)一遍,不管是使用chromedp
庫還是rod
庫,都需要先安裝Chrome或Chromium瀏覽器,并將其添加到系統(tǒng)的環(huán)境變量中。
我文章中的演示是基于Mac OS。
總結(jié)
本文介紹了如何使用Golang實現(xiàn)無頭瀏覽器截圖的功能。
通過使用chromedp
和rod
庫,可以方便地控制瀏覽器進行截圖、模擬用戶操作等功能。
使用Golang實現(xiàn)無頭瀏覽器截圖的優(yōu)勢包括:
高效性:Golang是一種高效的編程語言,可以快速地處理大量數(shù)據(jù)和請求。
可擴展性:Golang具有良好的可擴展性,可以方便地擴展和修改代碼。
跨平臺性:Golang可以在多個平臺上運行,可以方便地進行跨平臺開發(fā)和部署。
安全性:Golang具有良好的安全性,可以有效地防止代碼注入和攻擊。
綜上所述,使用Golang實現(xiàn)無頭瀏覽器截圖可以在很多場景下發(fā)揮作用,具有高效性、可擴展性、跨平臺性和安全性等優(yōu)勢。
到此這篇關(guān)于通過Golang實現(xiàn)無頭瀏覽器截圖的文章就介紹到這了,更多相關(guān)Golang瀏覽器截圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang 64位linux環(huán)境下編譯出32位程序操作
這篇文章主要介紹了golang 64位linux環(huán)境下編譯出32位程序操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12深入理解Golang中的Protocol Buffers及其應(yīng)用
本篇文章將深入探討 Go 語言中使用 Protobuf 的基礎(chǔ)知識、常見應(yīng)用以及最佳實踐,希望能幫大家了解如何在項目中高效利用 Protobuf2024-11-11在Visual Studio Code中配置GO開發(fā)環(huán)境的詳細教程
這篇文章主要介紹了在Visual Studio Code中配置GO開發(fā)環(huán)境的詳細教程,需要的朋友可以參考下2017-02-02詳解Go并發(fā)編程時如何避免發(fā)生競態(tài)條件和數(shù)據(jù)競爭
大家都知道,Go是一種支持并發(fā)編程的編程語言,但并發(fā)編程也是比較復(fù)雜和容易出錯的。比如本篇分享的問題:競態(tài)條件和數(shù)據(jù)競爭的問題2023-04-04Go語言學(xué)習(xí)之new函數(shù)的用法詳解
這篇文章主要為大家詳細介紹了Go語言中new()函數(shù)的相關(guān)知識以及具體用法,文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下2023-05-05