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 通用全屏网页截图方案(二)常用参数实现

相关文章
npm install 报错 npm ERR! puppeteer@1.20.0 install: `node install.js`
npm install 报错 npm ERR! puppeteer@1.20.0 install: `node install.js`
357 0
|
3月前
|
数据采集 Web App开发 JavaScript
Puppeteer的高级用法:如何在Node.js中实现复杂的Web Scraping
随着互联网的发展,网页数据抓取已成为数据分析和市场调研的关键手段。Puppeteer是一款由Google开发的无头浏览器工具,可在Node.js环境中模拟用户行为,高效抓取网页数据。本文将介绍如何利用Puppeteer的高级功能,通过设置代理IP、User-Agent和Cookies等技术,实现复杂的Web Scraping任务,并提供示例代码,展示如何使用亿牛云的爬虫代理来提高爬虫的成功率。通过合理配置这些参数,开发者可以有效规避目标网站的反爬机制,提升数据抓取效率。
302 4
Puppeteer的高级用法:如何在Node.js中实现复杂的Web Scraping
|
1月前
|
数据采集 存储 JavaScript
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
本文介绍了如何使用Puppeteer和Node.js爬取大学招生数据,并通过代理IP提升爬取的稳定性和效率。Puppeteer作为一个强大的Node.js库,能够模拟真实浏览器访问,支持JavaScript渲染,适合复杂的爬取任务。文章详细讲解了安装Puppeteer、配置代理IP、实现爬虫代码的步骤,并提供了代码示例。此外,还给出了注意事项和优化建议,帮助读者高效地抓取和分析招生数据。
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
|
3月前
|
数据采集 存储 JavaScript
Puppeteer的高级用法:如何在Node.js中实现复杂的Web Scraping
在现代Web开发中,数据采集尤为重要,尤其在财经领域。本文以“东财股吧”为例,介绍如何使用Puppeteer结合代理IP技术进行高效的数据抓取。Puppeteer是一个强大的Node.js库,支持无头浏览器操作,适用于复杂的数据采集任务。通过设置代理IP、User-Agent及Cookies,可显著提升抓取成功率与效率,并以示例代码展示具体实现过程,为数据分析提供有力支持。
130 2
Puppeteer的高级用法:如何在Node.js中实现复杂的Web Scraping
|
数据采集 Web App开发 资源调度
如何使用Puppeteer在Node JS服务器上实现动态网页抓取
Puppeteer的核心功能是提供了一个Browser类,它可以启动一个Chrome或Chromium浏览器实例,并返回一个Browser对象。Browser对象可以创建多个Page对象,每个Page对象对应一个浏览器标签页,可以用来加载和操作网页。Page对象提供了一系列的方法,可以模拟用户的各种行为,如输入、点击、滚动、截图、PDF等。Page对象还可以监听网页上的事件,如请求、响应、错误、加载等。通过这些方法和事件,可以实现对动态网页的抓取。
442 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 高并发请求原理有更深一些的理解,特意写一篇文章来巩固一下相关的知识点。
897 0
解秘 Node.js 单线程实现高并发请求原理,以及串联同步执行并发请求的方案
下一篇
DataWorks