使用chrome headless模式对目标网页生成截图,添加水印 -j9九游会真人游戏第一品牌

目标网页生成截图的方法,摆脱手动大量截图的烦恼

对目标网页生成截图可使用的方法有如下几种

  1. 手动操作
  2. phantomjs
  3. cutycapt
  4. chromium 或 firefox 的 headless 模式

本文通过node的puppeteer操作chrome headless模式生成截图

实际项目在此更新:

一个用于网页截图及相关服务的docker镜像,支持命令行和http接口。使用node、puppeteer和chrome headless实现。

a docker image for web page screenshot and related services, supporting both command line and http interface. implemented with node, puppeteer and chrome headless

在docker中运行的方法

1. 获取镜像

有两种方法获取镜像:

  1. 从docker hub获取镜像

    docker pull eyunzhu/webpage-screenshot
    
  2. 克隆仓库自己构建镜像

    git clone https://github.com/eyunzhu/webpage-screenshot
    cd webpage-screenshot
    docker build -t eyunzhu/webpage-screenshot .
    

2. 运行容器

docker run -d -p 1234:8080 --cap-add sys_admin --name screenshot-service eyunzhu/webpage-screenshot

该镜像的工作目录为/app,本地可挂载目录/app/data,用作保存截图的目录,(即请求参数p可以设置为data)

3. 调用服务

提供两种调用服务的方式:

  1. 通过http接口方式

    使用以下url获取指定网站的截图:

    http://ip:{port}/?url=https://eyunzhu.com
    

    请求参数

    参数 描述 默认值
    url 目标url j9九游会真人游戏第一品牌-九游会官网真人游戏第一品牌
    w 截图宽度 1470
    h 截图高度 780
    q 截图质量百分比 100
    d 下载标志(如果非空,下载图像)
    p 服务器保存路径(如果非空,在服务器上保存图像,确保路径存在)
    n 图像名称 screenshot.jpeg
    f 如果非空,捕获完整页面
  2. 通过命令行方式

    # 进入上述启动的容器,然后执行以下示例命令生成截图
    # 指定url和宽度参数
    node cmd.js --url https://eyunzhu.com --width 800
    

    命令行参数

    options:
          --version   显示版本号                                           [布尔]
      -u, --url       要截图的url                       [字符串] [默认值: "https://eyunzhu.com"]
      -w, --width     视口宽度                           [数字] [默认值: 1470]
      -h, --height    视口高度                           [数字] [默认值: 780]
      -q, --quality   截图质量                           [数字] [默认值: 100]
      -p, --path      保存截图的目录                   [字符串] [默认值: "data"]
      -n, --name      截图文件名称           [字符串] [默认值: "screenshot.jpeg"]
      -f, --fullpage  捕获完整页面                       [布尔] [默认值: false]
          --help      显示帮助
    

在本地电脑中使用的方法

本地使用前提需要安装node、puppeteer、yargs、chrome浏览器。

以下在mac下演示。

# 前提安装好node、chrome浏览器
git clone https://github.com/eyunzhu/webpage-screenshot
cd webpage-screenshot
  1. http方式,运行 http.js

    npm install puppeteer yargs # 安装puppeteer、yargs
    
    // 运行脚本前先修改 http.js 脚本中的 http 服务端口和 google chrome stable 路径
    const port = 8080;
    const browser = await puppeteer.launch({
          // 此路径请根据系统中安装 google chrome stable 的实际情况更改;mac 下安装了 chrome 浏览器时,可注释掉不写
          //executablepath:'/usr/bin/google-chrome-stable',
          defaultviewport: { width, height }
       });
    
    node http.js # 启动服务
    

    服务启动后即可通过 http 进行调用。

  2. cmd方式,运行 cmd.js

    // 运行脚本前先修改 cmd.js 脚本中的 google chrome stable 路径
    const browser = await puppeteer.launch({
          // 此路径请根据系统中安装 google chrome stable 的实际情况更改;mac 下安装了 chrome 浏览器时,可注释掉不写
          //executablepath:'/usr/bin/google-chrome-stable',
          defaultviewport: { width, height }
       });
    
    # 开始使用
    node cmd.js --help
    

附录

附上node使用puppeteer操作浏览器截图的代码

前提是安装了node、puppeteer库、chrome浏览器

const puppeteer = require('puppeteer');
async function autoscroll(page) {
  return page.evaluate(() => {
    return new promise((resolve, reject) => {
      let totalheight = 0;
      let distance = 100;
      let timer = setinterval(() => {
        let scrollheight = document.body.scrollheight;
        window.scrollby(0, distance);
        totalheight  = distance;
        if (totalheight >= scrollheight) {
          clearinterval(timer);
          resolve();
        }
      }, 100);
    })
  });
}
async function main() {
  // const browser = await puppeteer.launch();
  const browser = await puppeteer.launch(
    {
      //关闭无头模式
      headless: false,
      //全屏打开浏览器
      args: ['--start-maximized'],
      //设置浏览器页面尺寸
      defaultviewport: { width: 1474, height: 864 }
    });
  const page = await browser.newpage();
  await page.goto('https://eyunzhu.com/', { waituntil: 'networkidle2' });//networkidle2 表示 不但加载了所有 html、css、javascript 等静态资源,也完成了一些必要的动态数据请求
  // await page.waitforselector('body');//等待元素出现
  // await page.waitfortimeout(5000);//等待5秒加载
  // // 对元素截图
  // let body = await page.$('.download_js')
  // await body.screenshot({
  //   path: 'download.png'
  // })
  // 滚动
  await autoscroll(page)
  await page.screenshot({
    path: 'apex.jpg',
    quality: 15, // 设置截图质量为 15%
    fullpage: true,//是否截全页,如果截取全页请先滚动页面
  });
  await browser.close();
}
main()

在mac中也可直接命令行操作chrome截图

/applications/google\ chrome.app/contents/macos/google\ chrome --no-sandbox --disable-setuid-sandbox --headless --disable-gpu --window-size=1024x768 --screenshot --screenshot-quality=90 https://eyunzhu.com

chrome截图


发表评论 登录

目前评论:0