+-
golang快速实现网页截图
首页 专栏 golang 文章详情
0

golang快速实现网页截图

xx19941215 发布于 3 月 2 日

golang是近几年发展非常迅猛的一款服务器端的语言,其生态也日益丰富。对于使用golang实现网页截图这个需求,笔者在经过一番调研之后发现大家有推荐Selenium方案,但是这一方案问题较多:

需要安装Selenium或是PhantomJS PhantomJS已经停止维护了 Selenium的运行需要安装chromedriver chromedriver对chrome的版本有一定要求

还有推荐headless chrome方案的,但是这一方案也需要自行在服务器端安装一款浏览器,对服务器的压力比较大,并发性能也不好,所以最后笔者直接选用了一款第三方API的截图服务。

该服务有如下特点:

支持多线路 支持登录截图 支持UA变换 支持Cookie注入 实现登录截图 支持自定义宽高 支持网页滚动截图 支持设定截图前的延迟时间

使用方式也很简单,我们打开它的首页 https://www.screenshotmaster.com/ 注册一个账号,然后你会在用户中心获取到一个唯一的Token,保存好这个Token 不要泄漏!

下面来看看它支持的参数:

您可以前往API文档页面查看更多的参数。

使用golang调用截屏大师的接口获取截图:

package main

import (
    "fmt"
    "io"
    "io/ioutil"
    "net/http"
    url2 "net/url"
    "os"
)

func main() {
    // 参数
    token := "YOUR_API_TOKEN"
    url := url2.QueryEscape("https://www.baidu.com")
    width := 1280
    height := 800
    full_page := 1

    // 构造URL
    query := "https://www.screenshotmaster.com/api/v1/screenshot"
    query += fmt.Sprintf("?token=%s&url=%s&width=%d&height=%d&full_page=%s",
        token, url, width, height, full_page)

    // 调用API
    resp, err := http.Get(query)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    // 检查是否调用成功
    if resp.StatusCode != 200 {
        errorBody, _ := ioutil.ReadAll(resp.Body)
        panic(fmt.Errorf("error while calling api %s", errorBody))
    }

    // 保存截图
    file, err := os.Create("./screenshot.png")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    _, err = io.Copy(file, resp.Body)
    if err != nil {
        panic(err)
    }
}
golang 网页截图
阅读 144 发布于 3 月 2 日
收藏
分享
本作品系原创, 采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
Web开发笔记
Web开发笔记
关注专栏
avatar
xx19941215

// 刻意练习 每日精进

2.2k 声望
247 粉丝
关注作者
0 条评论
得票 时间
提交评论
avatar
xx19941215

// 刻意练习 每日精进

2.2k 声望
247 粉丝
关注作者
宣传栏
目录

golang是近几年发展非常迅猛的一款服务器端的语言,其生态也日益丰富。对于使用golang实现网页截图这个需求,笔者在经过一番调研之后发现大家有推荐Selenium方案,但是这一方案问题较多:

需要安装Selenium或是PhantomJS PhantomJS已经停止维护了 Selenium的运行需要安装chromedriver chromedriver对chrome的版本有一定要求

还有推荐headless chrome方案的,但是这一方案也需要自行在服务器端安装一款浏览器,对服务器的压力比较大,并发性能也不好,所以最后笔者直接选用了一款第三方API的截图服务。

该服务有如下特点:

支持多线路 支持登录截图 支持UA变换 支持Cookie注入 实现登录截图 支持自定义宽高 支持网页滚动截图 支持设定截图前的延迟时间

使用方式也很简单,我们打开它的首页 https://www.screenshotmaster.com/ 注册一个账号,然后你会在用户中心获取到一个唯一的Token,保存好这个Token 不要泄漏!

下面来看看它支持的参数:

您可以前往API文档页面查看更多的参数。

使用golang调用截屏大师的接口获取截图:

package main

import (
    "fmt"
    "io"
    "io/ioutil"
    "net/http"
    url2 "net/url"
    "os"
)

func main() {
    // 参数
    token := "YOUR_API_TOKEN"
    url := url2.QueryEscape("https://www.baidu.com")
    width := 1280
    height := 800
    full_page := 1

    // 构造URL
    query := "https://www.screenshotmaster.com/api/v1/screenshot"
    query += fmt.Sprintf("?token=%s&url=%s&width=%d&height=%d&full_page=%s",
        token, url, width, height, full_page)

    // 调用API
    resp, err := http.Get(query)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    // 检查是否调用成功
    if resp.StatusCode != 200 {
        errorBody, _ := ioutil.ReadAll(resp.Body)
        panic(fmt.Errorf("error while calling api %s", errorBody))
    }

    // 保存截图
    file, err := os.Create("./screenshot.png")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    _, err = io.Copy(file, resp.Body)
    if err != nil {
        panic(err)
    }
}