20 Aug 2022
在本文中将介绍使用 golang 进行加载某个网站并进行截图。
#chromedp
我们将使用 chromedp 通过浏览器驱动来加载网页并截图。 具体的步骤如下:
1 启动 chrome 浏览器
2 加载网页 (还可进行其他浏览器操作)
3 截图并保存
需要注意的是项目使用了 Chrome 的驱动,如果没有 Chrome 将不能顺利运行,需要运行 https://hub.docker.com/r/chromedp/headless-shell/ 来进行 或运行其他 版本的 Chrome 。
go get -u github.com/chromedp/chromedp
package main
import (
"context"
"io/ioutil"
"log"
"github.com/chromedp/chromedp"
)
func main() {
ctx, cancel := chromedp.NewContext(context.Background(), chromedp.WithDebugf(log.Printf))
defer cancel()
url := "https://www.minigame.vip/"
filename := "minigame.png"
var imageBuf []byte
if err := chromedp.Run(ctx, elementScreenshot(`https://pkg.go.dev/`, `img.Homepage-logo`, &imageBuf)); err != nil {
log.Fatal(err)
}
if err := ioutil.WriteFile("elementScreenshot.png", imageBuf, 0644); err != nil {
log.Fatal(err)
}
if err := chromedp.Run(ctx, ScreenshotTasks(url, &imageBuf)); err != nil {
log.Fatal(err)
}
if err := ioutil.WriteFile(filename, imageBuf, 0644); err != nil {
log.Fatal(err)
}
}
func elementScreenshot(urlstr, sel string, res *[]byte) chromedp.Tasks {
return chromedp.Tasks{
chromedp.Navigate(urlstr),
chromedp.Screenshot(sel, res, chromedp.NodeVisible),
}
}
func ScreenshotTasks(url string, imageBuf *[]byte) chromedp.Tasks {
return chromedp.Tasks{
chromedp.Navigate(url),
chromedp.FullScreenshot(imageBuf, 90),
}
}
上面的例子分别是对网页中的单个元素进行截图和对网页全局截图。
本文主要简单介绍使用 go 进行浏览器网页截图。 chromedp 还有许多功能等待你们的发掘。
- https://github.com/chromedp/chromedp
- https://github.com/chromedp/examples