通過(guò)Golang實(shí)現(xiàn)無(wú)頭瀏覽器截圖
前言
在Web開發(fā)中,有時(shí)需要對(duì)網(wǎng)頁(yè)進(jìn)行截圖,以便進(jìn)行頁(yè)面預(yù)覽、測(cè)試等操作。
而使用無(wú)頭瀏覽器來(lái)實(shí)現(xiàn)截圖功能,可以避免手動(dòng)操作的繁瑣和不穩(wěn)定性。
這篇文章將介紹:使用Golang進(jìn)行無(wú)頭瀏覽器的截圖,輕松實(shí)現(xiàn)頁(yè)面預(yù)覽、測(cè)試和模擬用戶操作。
什么是無(wú)頭瀏覽器
無(wú)頭瀏覽器(Headless Browser)是一種沒(méi)有圖形用戶界面的瀏覽器,它可以在后臺(tái)運(yùn)行,并通過(guò)編程接口來(lái)控制和操作瀏覽器。
無(wú)頭瀏覽器通常用于自動(dòng)化測(cè)試、網(wǎng)頁(yè)截圖、爬蟲等場(chǎng)景,可以幫助我們更方便地進(jìn)行網(wǎng)頁(yè)操作和數(shù)據(jù)采集。
常見的無(wú)頭瀏覽器包括Chrome Headless、PhantomJS、Puppeteer等。
在Golang中,可以使用chromedp
和rod
等庫(kù)來(lái)實(shí)現(xiàn)無(wú)頭瀏覽器截圖的功能。
更多場(chǎng)景
使用Golang實(shí)現(xiàn)無(wú)頭瀏覽器截圖可以在很多場(chǎng)景下發(fā)揮作用,以下是一些常見的場(chǎng)景:
網(wǎng)頁(yè)截圖:使用無(wú)頭瀏覽器可以方便地對(duì)網(wǎng)頁(yè)進(jìn)行截圖,可以用于生成網(wǎng)頁(yè)快照、監(jiān)控網(wǎng)頁(yè)變化等。
自動(dòng)化測(cè)試:使用無(wú)頭瀏覽器可以模擬用戶操作,可以用于自動(dòng)化測(cè)試、自動(dòng)化部署等。
網(wǎng)頁(yè)爬蟲:使用無(wú)頭瀏覽器可以模擬瀏覽器行為,可以用于網(wǎng)頁(yè)爬蟲、數(shù)據(jù)采集等。
數(shù)據(jù)分析:使用無(wú)頭瀏覽器可以獲取網(wǎng)頁(yè)數(shù)據(jù),可以用于數(shù)據(jù)分析、機(jī)器學(xué)習(xí)等。
使用chromedp
chromedp
是一個(gè)基于Chrome或Chromium瀏覽器的DevTools協(xié)議的庫(kù),可以方便地控制瀏覽器進(jìn)行截圖、模擬用戶操作等功能。
以下是使用chromedp
庫(kù)實(shí)現(xiàn)無(wú)頭瀏覽器截圖的示例代碼:
package?main import?( ???"context" ???"io/ioutil" ???"log" ???"time" ???"github.com/chromedp/cdproto/page" ???"github.com/chromedp/chromedp" ) func?main()?{ ???//?創(chuàng)建一個(gè)上下文 ???ctx,?cancel?:=?chromedp.NewContext(context.Background()) ???defer?cancel() ???//?設(shè)置瀏覽器選項(xiàng) ???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)建一個(gè)瀏覽器實(shí)例 ???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?{ ??????//?獲取頁(yè)面截圖 ??????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
庫(kù)創(chuàng)建了一個(gè)無(wú)頭瀏覽器實(shí)例,并導(dǎo)航到百度首頁(yè)。
然后使用page.CaptureScreenshot()
函數(shù)獲取頁(yè)面截圖,并將截圖保存到screenshot.png
文件中。
運(yùn)行演示
把我上面的代碼復(fù)制到main.go
文件中,安裝依賴直接運(yùn)行即可:
go mod tidy
go run main.go
執(zhí)行效果如下:
需要注意的是,使用chromedp
庫(kù)需要先安裝Chrome或Chromium瀏覽器,并將其添加到系統(tǒng)的環(huán)境變量中。
使用rod庫(kù)
rod
是另一個(gè)基于Chrome或Chromium瀏覽器的DevTools協(xié)議的庫(kù),可以方便地控制瀏覽器進(jìn)行截圖、模擬用戶操作等功能。
以下是使用rod
庫(kù)實(shí)現(xiàn)無(wú)頭瀏覽器截圖的示例代碼:
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() ?//簡(jiǎn)單模式,默認(rèn)截圖設(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
庫(kù)創(chuàng)建了一個(gè)無(wú)頭瀏覽器實(shí)例,并導(dǎo)航到百度首頁(yè)。
然后使用page.MustScreenshot()
函數(shù)獲取頁(yè)面截圖,并將截圖保存到my.png
文件中。
同樣演示了使用page.Screenshot
自定義截圖,并將自定義截圖保存到了my.jpg
文件中。
需要注意的是,使用rod
庫(kù)需要先安裝Chrome或Chromium瀏覽器,并將其添加到系統(tǒng)的環(huán)境變量中。
運(yùn)行方式
rod
庫(kù)示例代碼的運(yùn)行方式和chromedp
基本一致,略有區(qū)別的是我們需要根據(jù)提示,運(yùn)行多次go run main.go
安裝需要的插件:
碰到上面提示不用慌,再執(zhí)行一次go run main.go
即可
執(zhí)行效果如下:
注意
再?gòu)?qiáng)調(diào)一遍,不管是使用chromedp
庫(kù)還是rod
庫(kù),都需要先安裝Chrome或Chromium瀏覽器,并將其添加到系統(tǒng)的環(huán)境變量中。
我文章中的演示是基于Mac OS。
總結(jié)
本文介紹了如何使用Golang實(shí)現(xiàn)無(wú)頭瀏覽器截圖的功能。
通過(guò)使用chromedp
和rod
庫(kù),可以方便地控制瀏覽器進(jìn)行截圖、模擬用戶操作等功能。
使用Golang實(shí)現(xiàn)無(wú)頭瀏覽器截圖的優(yōu)勢(shì)包括:
高效性:Golang是一種高效的編程語(yǔ)言,可以快速地處理大量數(shù)據(jù)和請(qǐng)求。
可擴(kuò)展性:Golang具有良好的可擴(kuò)展性,可以方便地?cái)U(kuò)展和修改代碼。
跨平臺(tái)性:Golang可以在多個(gè)平臺(tái)上運(yùn)行,可以方便地進(jìn)行跨平臺(tái)開發(fā)和部署。
安全性:Golang具有良好的安全性,可以有效地防止代碼注入和攻擊。
綜上所述,使用Golang實(shí)現(xiàn)無(wú)頭瀏覽器截圖可以在很多場(chǎng)景下發(fā)揮作用,具有高效性、可擴(kuò)展性、跨平臺(tái)性和安全性等優(yōu)勢(shì)。
到此這篇關(guān)于通過(guò)Golang實(shí)現(xiàn)無(wú)頭瀏覽器截圖的文章就介紹到這了,更多相關(guān)Golang瀏覽器截圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang 64位linux環(huán)境下編譯出32位程序操作
這篇文章主要介紹了golang 64位linux環(huán)境下編譯出32位程序操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12深入理解Golang中的Protocol Buffers及其應(yīng)用
本篇文章將深入探討 Go 語(yǔ)言中使用 Protobuf 的基礎(chǔ)知識(shí)、常見應(yīng)用以及最佳實(shí)踐,希望能幫大家了解如何在項(xiàng)目中高效利用 Protobuf2024-11-11Go單體服務(wù)開發(fā)最佳實(shí)踐總結(jié)
這篇文章主要介紹了Go單體服務(wù)開發(fā)最佳實(shí)踐,通過(guò)本文詳細(xì)跟大家分享一下如何使用?go-zero?快速開發(fā)一個(gè)有多個(gè)模塊的單體服務(wù),需要的朋友可以參考下2022-04-04在Visual Studio Code中配置GO開發(fā)環(huán)境的詳細(xì)教程
這篇文章主要介紹了在Visual Studio Code中配置GO開發(fā)環(huán)境的詳細(xì)教程,需要的朋友可以參考下2017-02-02詳解Go并發(fā)編程時(shí)如何避免發(fā)生競(jìng)態(tài)條件和數(shù)據(jù)競(jìng)爭(zhēng)
大家都知道,Go是一種支持并發(fā)編程的編程語(yǔ)言,但并發(fā)編程也是比較復(fù)雜和容易出錯(cuò)的。比如本篇分享的問(wèn)題:競(jìng)態(tài)條件和數(shù)據(jù)競(jìng)爭(zhēng)的問(wèn)題2023-04-04Go語(yǔ)言tunny的workerWrapper使用教程示例
這篇文章主要為大家介紹了Go語(yǔ)言tunny的workerWrapper使用教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07詳解Go是如何優(yōu)雅的進(jìn)行內(nèi)存管理
Go語(yǔ)言拋棄C/C++中的開發(fā)者管理內(nèi)存的方式,實(shí)現(xiàn)了主動(dòng)申請(qǐng)與主動(dòng)釋放管理,增加了逃逸分析和垃圾回收,將開發(fā)者從內(nèi)存管理中釋放出來(lái),作為進(jìn)階的Go開發(fā),了解掌握Go的內(nèi)存管理還是很有必要的2023-09-09Go語(yǔ)言學(xué)習(xí)之new函數(shù)的用法詳解
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中new()函數(shù)的相關(guān)知識(shí)以及具體用法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-05-05