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

简介: 学习如何对网页截图程序设计基本参数功能。

image.png

页面等待

有时我们可能希望让页面等待一段时间再执行截图,当使用await page.waitFor(1000)来让页面等待时会提示该方法将被弃用:

waitFor is deprecated and will be removed in a future release. See https://github.com/puppeteer/puppeteer/issues/6214 for details and how to migrate your code.

所以我们自己简单实现一个

// Puppeteer基于node环境,对js新语法支持度非常好,可以用promise实现
    function sleep(timeout = 10) {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve()
        }, timeout)
      })
    }

使用调用: await sleep(1000)

模拟设备

当目标页面是移动端网页时,有时可能需要对浏览器ua进行模拟才能访问真实的页面(有些H5网页可能是通过判断ua来进入不同项目,而不是自适应或响应式)

模拟UA方法:

// const ua = 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'
ua && page.setUserAgent(ua)

还有一种方法是模拟设备,该模式下会自动设置ua以及屏幕宽高等参数,可以创建自定义的设备,但是没必要,Puppeteer已经为我们做了很多预设,代码如下:

    // ua && page.setUserAgent(ua)
    // const devices = 'iPhone 6'
    if (devices) {
      devices = puppeteer.devices[devices]
      devices && (await page.emulate(devices))
    }

预设列表我也整理出来了:

const DevicesNames = [
    'Blackberry PlayBook',
    'Blackberry PlayBook landscape',
    'BlackBerry Z30',
    'BlackBerry Z30 landscape',
    'Galaxy Note 3',
    'Galaxy Note 3 landscape',
    'Galaxy Note II',
    'Galaxy Note II landscape',
    'Galaxy S III',
    'Galaxy S III landscape',
    'Galaxy S5',
    'Galaxy S5 landscape',
    'iPad',
    'iPad landscape',
    'iPad Mini',
    'iPad Mini landscape',
    'iPad Pro',
    'iPad Pro landscape',
    'iPhone 4',
    'iPhone 4 landscape',
    'iPhone 5',
    'iPhone 5 landscape',
    'iPhone 6',
    'iPhone 6 landscape',
    'iPhone 6 Plus',
    'iPhone 6 Plus landscape',
    'iPhone 7',
    'iPhone 7 landscape',
    'iPhone 7 Plus',
    'iPhone 7 Plus landscape',
    'iPhone 8',
    'iPhone 8 landscape',
    'iPhone 8 Plus',
    'iPhone 8 Plus landscape',
    'iPhone SE',
    'iPhone SE landscape',
    'iPhone X',
    'iPhone X landscape',
    'Kindle Fire HDX',
    'Kindle Fire HDX landscape',
    'LG Optimus L70',
    'LG Optimus L70 landscape',
    'Microsoft Lumia 550',
    'Microsoft Lumia 950',
    'Microsoft Lumia 950 landscape',
    'Nexus 10',
    'Nexus 10 landscape',
    'Nexus 4',
    'Nexus 4 landscape',
    'Nexus 5',
    'Nexus 5 landscape',
    'Nexus 5X',
    'Nexus 5X landscape',
    'Nexus 6',
    'Nexus 6 landscape',
    'Nexus 6P',
    'Nexus 6P landscape',
    'Nexus 7',
    'Nexus 7 landscape',
    'Nokia Lumia 520',
    'Nokia Lumia 520 landscape',
    'Nokia N9',
    'Nokia N9 landscape',
    'Pixel 2',
    'Pixel 2 landscape',
    'Pixel 2 XL',
    'Pixel 2 XL landscape'
  ]

设置像素比

针对移动端的页面,截图效果可能会比较模糊,我们可以通过提高像素比来增加分辨率,获得更好的图片效果(类似设备DPR),不过参数越高生成速度与性能消耗也会越大,建议加个阈值。

// 设置浏览器视窗
    page.setViewport({
      width: Number(width),
      height: Number(height),
      deviceScaleFactor: !isNaN(scale) ? (+scale > 4 ? 4 : +scale) : 1, // 默认为1,阈值为4
    })

对页面某个元素截图

实际项目中没有使用到的需求场景,简单做下记录

let [element] = await page.$x('/html/body/section[4]/div/div[2]')
await element.screenshot({ path: 'xxx.png' })

下一篇文章中将会介绍一些进阶的方法。

相关文章
|
2月前
|
Kubernetes 调度 容器
K8S 性能优化 -K8S Node 参数调优
K8S 性能优化 -K8S Node 参数调优
|
JavaScript 前端开发 Java
关于 Node.js 参数 max-old-space-size
Old space是 V8 托管(也称为垃圾收集)堆(即 JavaScript 对象所在的位置)中最大和最可配置的部分,而 --max-old-space-size 标志控制其最大大小。 随着内存消耗接近极限,V8 将花费更多时间在垃圾收集上,以释放未使用的内存。
936 0
|
8月前
|
JavaScript
node.js如何获取post和get请求的参数
node.js如何获取post和get请求的参数
65 0
|
4月前
【Node】—接收参数 插入数据 实现注册功能
【Node】—接收参数 插入数据 实现注册功能
|
6月前
|
JavaScript 前端开发 Java
关于 Node.js 参数 max-old-space-size
关于 Node.js 参数 max-old-space-size
120 0
|
存储 缓存 JavaScript
【Node.js 】开发中遇到的多进程‘keylog‘ 事件以及TLS/SSL的解决学习方案实战
【Node.js 】开发中遇到的多进程‘keylog‘ 事件以及TLS/SSL的解决学习方案实战
【Node.js 】开发中遇到的多进程‘keylog‘ 事件以及TLS/SSL的解决学习方案实战
|
数据采集 运维 资源调度
|
数据采集 缓存 编解码
|
数据采集 JavaScript
Puppeteer + Nodejs 通用全屏网页截图方案(一)基本功能
学习一个网页截图程序的实现基本功能。
|
存储 SQL JavaScript
解秘 Node.js 单线程实现高并发请求原理,以及串联同步执行并发请求的方案
最近在做一个支持多进程请求的 Node 服务,要支持多并发请求,而且请求要按先后顺序串联同步执行返回结果。 对,这需求就是这么奇琶,业务场景也是那么奇琶。 需求是完成了,为了对 Node.js 高并发请求原理有更深一些的理解,特意写一篇文章来巩固一下相关的知识点。
762 0
解秘 Node.js 单线程实现高并发请求原理,以及串联同步执行并发请求的方案