puppeteer实现html截图的示例代码


Posted in Javascript onJanuary 10, 2019

puppeteer是谷歌官方出品的一个通过 DevTools 协议控制 headless Chrome 的Node库。可以通过Puppeteer的提供的api直接控制Chrome模拟大部分用户操作来进行UI Test或者作为爬虫访问页面来收集数据。

安装

直接运行安装命令:

npm install puppeteer

如果出现无法安装的问题,可以使用淘宝镜像。

puppeteer实现滑动截图

在我 puppeteer 使用截全屏的过程中发现有些图片无法截取到,而实际上是因为有些图片是懒加载的,如果你没有滑动到图片的位置,那么这个图片是不会加载。

现在我的方式是采用模拟浏览器滚动条滑动的方式滑动底部来使图片加载出来。

代码如下:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    headless: false
  });
  const page = await browser.newPage();
  await page.goto('https://www.cnblogs.com/morethink/p/6525216.html');
  await page.setViewport({
    width: 1200,
    height: 800
  });

  await autoScroll(page);

  await page.screenshot({
    path: '1.png',
    fullPage: true
  });

  await browser.close();
})();


function autoScroll(page) {
  return page.evaluate(() => {
    return new Promise((resolve, reject) => {
      var totalHeight = 0;
      var distance = 100;
      var timer = setInterval(() => {
        var scrollHeight = document.body.scrollHeight;
        window.scrollBy(0, distance);
        totalHeight += distance;
        if (totalHeight >= scrollHeight) {
          clearInterval(timer);
          resolve();
        }
      }, 100);
    })
  });
}

动图如下:

puppeteer实现html截图的示例代码

puppeteer 实现 html element 截图

在某些情况下我们只想要针对html的某个位置进行截图而不是针对页面截全屏。

puppeteer提供了ElementHandle.screenshot 方法,该方法参数和page.screenshot 一样。而ElementHandle 对象是页面内的Dom对象。可以帮助我对 html element进行截图。这样的话你想截取页面的哪部分就截取页面的哪部分。

代码如下:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    headless: false
  });
  const page = await browser.newPage();
  await page.goto('https://www.cnblogs.com/morethink/p/6525216.html');
  await page.setViewport({
    width: 1200,
    height: 800
  });
  //获取页面Dom对象
  let body = await page.$('#cnblogs_post_body');
  //调用页面内Dom对象的 screenshot 方法进行截图
  await body.screenshot({
    path: '2.png'
  });
  await browser.close();
})();

参考文档:

https://github.com/GoogleChrome/puppeteer/blob/v1.11.0/docs/api.md#elementhandlescreenshotoptions

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 对象的定义方法
Jan 10 Javascript
javascript addBookmark 加入收藏 多浏览器兼容
Aug 15 Javascript
JS实现根据出生年月计算年龄
Jan 10 Javascript
AngularJS中的模块详解
Jan 29 Javascript
jquery.mobile 共同布局遇到的问题小结
Feb 10 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐二)
Jul 12 Javascript
BootStrap 图片样式、辅助类样式和CSS组件的实例详解
Jan 20 Javascript
jQuery Easyui Treegrid实现显示checkbox功能
Aug 08 jQuery
jQuery实现的弹幕效果完整实例
Sep 06 jQuery
JS实现table表格固定表头且表头随横向滚动而滚动
Oct 26 Javascript
微信小程序实现人脸识别
May 25 Javascript
Layui数据表格 前后端json数据接收的方法
Sep 19 Javascript
其实你可以少写点if else与switch(推荐)
Jan 10 #Javascript
微信小程序提取公用函数到util.js及使用方法示例
Jan 10 #Javascript
浅谈JavaScript 代码简洁之道
Jan 09 #Javascript
react组件从搭建脚手架到在npm发布的步骤实现
Jan 09 #Javascript
微信小程序公用参数与公用方法用法示例
Jan 09 #Javascript
微信小程序实现的日期午别医生排班表功能示例
Jan 09 #Javascript
Windows下Node爬虫神器Puppeteer安装记
Jan 09 #Javascript
You might like
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
解决php表单重复提交实现方法
2015/09/29 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
2016/02/26 PHP
PHP中Cookie的使用详解(简单易懂)
2017/04/28 PHP
js AppendChild与insertBefore用法详细对比
2013/12/16 Javascript
深入理解Javascript中this的作用域
2014/08/12 Javascript
AngularJS实现表单验证
2015/01/28 Javascript
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
js提示框替代系统alert,自动关闭alert对话框的实现方法
2016/11/07 Javascript
webpack学习笔记之优化缓存、合并、懒加载
2017/08/24 Javascript
javascript中new Array()和var arr=[]用法区别
2017/12/01 Javascript
vue项目实现github在线预览功能
2018/06/20 Javascript
vue实现节点增删改功能
2019/09/26 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
JavaScript实现单点登录的示例
2020/09/23 Javascript
详解Python中内置的NotImplemented类型的用法
2015/03/31 Python
Python批量修改文本文件内容的方法
2016/04/29 Python
Python 用Redis简单实现分布式爬虫的方法
2017/11/23 Python
Python中Proxypool库的安装与配置
2018/10/19 Python
python读取csv和txt数据转换成向量的实例
2019/02/12 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
python语言线程标准库threading.local解读总结
2019/11/10 Python
matplotlib.pyplot画图并导出保存的实例
2019/12/07 Python
基于h5py的使用及数据封装代码
2019/12/26 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
使用python-cv2实现视频的分解与合成的示例代码
2020/10/26 Python
Python调用ffmpeg开源视频处理库,批量处理视频
2020/11/16 Python
CSS3 Backgrounds属性相关介绍
2011/05/11 HTML / CSS
html5 canvas绘制放射性渐变色效果
2018/01/04 HTML / CSS
应届生如何写自荐信
2014/01/05 职场文书
机关作风整顿个人剖析材料
2014/10/06 职场文书
计划生育诚信协议书
2014/11/02 职场文书
先进人物事迹材料
2014/12/29 职场文书
导游词之台湾安平古堡
2019/12/25 职场文书
javascript进阶篇深拷贝实现的四种方式
2022/07/07 Javascript