Puppeteer + Nodejs 通用全屏网页截图方案(一)基本功能

简介: 学习一个网页截图程序的实现基本功能。

先来看看实现效果:

2022-06-22 10.38.49.gif

如上所示,此次实现的功能是输入网址后生成全屏截图,可用于生成图片版文章,也可以用做图片二维码海报的生成器,可以支持各种尺寸定义,下面讲解实现的一些技术细节。

实现截图

主要使用的是 puppeteer 这个库,最简单地实现一个网页截图,只需要几行代码即可:

const puppeteer = require('puppeteer') // 引入

    // 启动浏览器
    const browser = await puppeteer.launch({
      headless: false, // 本地测试先关掉无头模式
    })  
    // 创建一个页面
    const page = await browser.newPage()
    // 设置浏览器视窗
    page.setViewport({
      width: 300,
      height: 600,
    })
    // 输入网页地址
    await page.goto(url, { waitUntil: 'domcontentloaded' })
    // 开始截图,全屏截图的关键参数就是这个fullPage,页面会一直滚动到底
    await page.screenshot({ path: '{保存图片的路径}', fullPage: true })
    // 关闭浏览器
    await browser.close()

让网页接管截图动作

当我们使用浏览器截图方案作为内部业务方法使用的时候,为了保证生成图片的完整性,就需要等待异步操作执行完毕再开始截图,比如图片资源是否加载完成以及接口数据请求结果等判断,对于浏览器来说无能为力,而我们并不希望使用等待的方式来解决问题,而是让程序本身决定何时开始截图,这时我们可以通过 puppeteer 向页面注入一个全局方法,然后在目标页面中处理好资源的准备判断后,调用该方法,则可以实现页面对截图操作的控制。

c3d71e17-e9bf-49ae-9402-ccbd174bf5ce.png

//  puppeteer   注入全局方法
    
    await page.exposeFunction('loadFinishToInject', async () => {
      // console.log('-> 开始截图')
      await page.screenshot({ path, fullPage: true })
      // 关闭浏览器
      await browser.close()
    })
// 目标页面/业务页面/截图页面:

..... Some Preload Code Function ....

console.log('--> 可以开始截图')

    try {
     window.loadFinishToInject() // 触发截图方法
    } catch (err) {}

立即开始截图

通常情况下,我们可能只需要等待网页加载完成后就立即生成截图:

// 方法一:利用自带事件
await page.goto(url, { waitUntil: 'domcontentloaded' })
// console.log('-> 开始截图')
await page.screenshot({ path })
await browser.close()

waitUntil 说明:

  • load: window.onload 事件被触发时继续。
  • domcontentloaded: Domcontentloaded 事件触发时继续。
  • networkidle0: 在 500ms 内没有网络连接时(全部的request结束)则继续。
  • networkidle2: 500ms 内有不超过 2 个网络连接时就算成功(还有两个以下的request)则继续。
// 方法二:利用回调函数
    page.on('load', async () => {
        // 开始截图
        await page.screenshot({ path, fullPage: true })
        await browser.close()
    })

以上代码片段均是基于本地开发时的情况来写,后面将会介绍到服务器上部署的一些问题。

本服务默认使用Express作为框架,不展开介绍。

# Puppeteer + Nodejs 通用全屏网页截图方案(二)常用参数实现

相关文章
|
11月前
npm install 报错 npm ERR! puppeteer@1.20.0 install: `node install.js`
npm install 报错 npm ERR! puppeteer@1.20.0 install: `node install.js`
265 0
|
12月前
|
数据采集 Web App开发 资源调度
如何使用Puppeteer在Node JS服务器上实现动态网页抓取
Puppeteer的核心功能是提供了一个Browser类,它可以启动一个Chrome或Chromium浏览器实例,并返回一个Browser对象。Browser对象可以创建多个Page对象,每个Page对象对应一个浏览器标签页,可以用来加载和操作网页。Page对象提供了一系列的方法,可以模拟用户的各种行为,如输入、点击、滚动、截图、PDF等。Page对象还可以监听网页上的事件,如请求、响应、错误、加载等。通过这些方法和事件,可以实现对动态网页的抓取。
335 0
如何使用Puppeteer在Node JS服务器上实现动态网页抓取
|
存储 缓存 JavaScript
【Node.js 】开发中遇到的多进程‘keylog‘ 事件以及TLS/SSL的解决学习方案实战
【Node.js 】开发中遇到的多进程‘keylog‘ 事件以及TLS/SSL的解决学习方案实战
【Node.js 】开发中遇到的多进程‘keylog‘ 事件以及TLS/SSL的解决学习方案实战
|
数据采集 运维 资源调度
|
数据采集 缓存 编解码
|
数据采集 编解码 移动开发
Puppeteer + Nodejs 通用全屏网页截图方案(二)常用参数实现
学习如何对网页截图程序设计基本参数功能。
|
存储 SQL JavaScript
解秘 Node.js 单线程实现高并发请求原理,以及串联同步执行并发请求的方案
最近在做一个支持多进程请求的 Node 服务,要支持多并发请求,而且请求要按先后顺序串联同步执行返回结果。 对,这需求就是这么奇琶,业务场景也是那么奇琶。 需求是完成了,为了对 Node.js 高并发请求原理有更深一些的理解,特意写一篇文章来巩固一下相关的知识点。
851 0
解秘 Node.js 单线程实现高并发请求原理,以及串联同步执行并发请求的方案
|
JavaScript 内存技术
史上最详细nodejs版本管理器nvm的安装与使用(附注意事项和优化方案)
使用场景 在Node版本快速更新迭代的今天,新老项目使用的node版本号可能已经不相同了,node版本更新越来越快,项目越做越多,node切换版本号的需求越来越迫切,传统卸载一个版本在安装另一个版本的方式太过于麻烦,这也是nvm能够流行的原因。
2031 0
|
3天前
|
缓存 JavaScript 安全
2022年最新最详细的安装Node.js以及cnpm(详细图解过程、绝对成功)
这篇文章提供了2022年最新最详细的Node.js和cnpm安装教程,包括步骤图解、全局配置路径、cnpm安装命令、nrm的安装与使用,以及如何管理npm源和测试速度。
2022年最新最详细的安装Node.js以及cnpm(详细图解过程、绝对成功)
|
3天前
Mac 安装 Node Error: Could not symlink include/node/common.gypi
Mac 安装 Node Error: Could not symlink include/node/common.gypi
9 3