前言

在本文中将介绍使用 golang 进行加载某个网站并进行截图。

chromedp

我们将使用 chromedp 通过浏览器驱动来加载网页并截图。 具体的步骤如下:

1 启动 chrome 浏览器 2 加载网页 (还可进行其他浏览器操作) 3 截图并保存

需要注意的是项目使用了 Chrome 的驱动,如果没有 Chrome 将不能顺利运行,需要运行 https://hub.docker.com/r/chromedp/headless-shell/ 来进行 或运行其他 版本的 Chrome 。

安装

1
go get -u github.com/chromedp/chromedp

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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 还有许多功能等待你们的发掘。

参考