什么是無頭瀏覽器?用Go模擬用戶操作、實現(xiàn)網(wǎng)頁瀏覽和截圖

前言
在Web開發(fā)中,有時需要對網(wǎng)頁進(jìn)行截圖,以便進(jìn)行頁面預(yù)覽、測試等操作。

而使用無頭瀏覽器來實現(xiàn)截圖功能,可以避免手動操作的繁瑣和不穩(wěn)定性。

這篇文章將介紹:使用Golang進(jìn)行無頭瀏覽器的截圖,輕松實現(xiàn)頁面預(yù)覽、測試和模擬用戶操作。

什么是無頭瀏覽器
無頭瀏覽器(Headless Browser)是一種沒有圖形用戶界面的瀏覽器,它可以在后臺運(yùn)行,并通過編程接口來控制和操作瀏覽器。

無頭瀏覽器通常用于自動化測試、網(wǎng)頁截圖、爬蟲等場景,可以幫助我們更方便地進(jìn)行網(wǎng)頁操作和數(shù)據(jù)采集。

常見的無頭瀏覽器包括Chrome Headless、PhantomJS、Puppeteer等。

在Golang中,可以使用chromedp和rod等庫來實現(xiàn)無頭瀏覽器截圖的功能。

更多場景
使用Golang實現(xiàn)無頭瀏覽器截圖可以在很多場景下發(fā)揮作用,以下是一些常見的場景:

網(wǎng)頁截圖:使用無頭瀏覽器可以方便地對網(wǎng)頁進(jìn)行截圖,可以用于生成網(wǎng)頁快照、監(jiān)控網(wǎng)頁變化等。

自動化測試:使用無頭瀏覽器可以模擬用戶操作,可以用于自動化測試、自動化部署等。

網(wǎng)頁爬蟲:使用無頭瀏覽器可以模擬瀏覽器行為,可以用于網(wǎng)頁爬蟲、數(shù)據(jù)采集等。

數(shù)據(jù)分析:使用無頭瀏覽器可以獲取網(wǎng)頁數(shù)據(jù),可以用于數(shù)據(jù)分析、機(jī)器學(xué)習(xí)等。

使用chromedp
chromedp是一個基于Chrome或Chromium瀏覽器的DevTools協(xié)議的庫,可以方便地控制瀏覽器進(jìn)行截圖、模擬用戶操作等功能。

以下是使用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文件中。

251213bk-1.png

screenshot.png
運(yùn)行演示
把我上面的代碼復(fù)制到main.go文件中,安裝依賴直接運(yùn)行即可:

go mod tidy

go run main.go
執(zhí)行效果如下:

251213bk-2.png

需要注意的是,使用chromedp庫需要先安裝Chrome或Chromium瀏覽器,并將其添加到系統(tǒng)的環(huán)境變量中。

使用rod庫
rod是另一個基于Chrome或Chromium瀏覽器的DevTools協(xié)議的庫,可以方便地控制瀏覽器進(jìn)行截圖、模擬用戶操作等功能。

以下是使用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()

 //簡單模式,默認(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庫創(chuàng)建了一個無頭瀏覽器實例,并導(dǎo)航到百度首頁。

然后使用page.MustScreenshot()函數(shù)獲取頁面截圖,并將截圖保存到my.png文件中。

251213bk-3.png

同樣演示了使用page.Screenshot自定義截圖,并將自定義截圖保存到了my.jpg文件中。

251213bk-4.png

需要注意的是,使用rod庫需要先安裝Chrome或Chromium瀏覽器,并將其添加到系統(tǒng)的環(huán)境變量中。

運(yùn)行方式
rod庫示例代碼的運(yùn)行方式和chromedp基本一致,略有區(qū)別的是我們需要根據(jù)提示,運(yùn)行多次go run main.go安裝需要的插件:

251213bk-5.png

碰到上面提示不用慌,再執(zhí)行一次go run main.go即可

251213bk-6.png

執(zhí)行效果如下:

251213bk-7.png

注意
再強(qiáng)調(diào)一遍,不管是使用chromedp庫還是rod庫,都需要先安裝Chrome或Chromium瀏覽器,并將其添加到系統(tǒng)的環(huán)境變量中。

我文章中的演示是基于Mac OS。

總結(jié)
本文介紹了如何使用Golang實現(xiàn)無頭瀏覽器截圖的功能。

通過使用chromedp和rod庫,可以方便地控制瀏覽器進(jìn)行截圖、模擬用戶操作等功能。

使用Golang實現(xiàn)無頭瀏覽器截圖的優(yōu)勢包括:

高效性:Golang是一種高效的編程語言,可以快速地處理大量數(shù)據(jù)和請求。

可擴(kuò)展性:Golang具有良好的可擴(kuò)展性,可以方便地擴(kuò)展和修改代碼。

跨平臺性:Golang可以在多個平臺上運(yùn)行,可以方便地進(jìn)行跨平臺開發(fā)和部署。

安全性:Golang具有良好的安全性,可以有效地防止代碼注入和攻擊。

綜上所述,使用Golang實現(xiàn)無頭瀏覽器截圖可以在很多場景下發(fā)揮作用,具有高效性、可擴(kuò)展性、跨平臺性和安全性等優(yōu)勢。




請前往:http://lygongshang.com/TeacherV2.html?id=365