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 特殊字符
Apr 05 Javascript
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
Dec 27 Javascript
匹配任意字符的正则表达式写法
Apr 29 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
Sep 30 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
Nov 22 Javascript
怎么判断js脚本加载完成
Feb 28 Javascript
javascript校验价格合法性实例(必须输入2位小数)
May 05 Javascript
JavaScript中的全局对象介绍
Jan 01 Javascript
基于JavaScript代码实现自动生成表格
Jun 15 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
Sep 05 Javascript
BootStrap轻松实现微信页面开发代码分享
Oct 21 Javascript
在bootstrap中实现轮播图实例代码
Jun 11 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
德生S2000电路分析
2021/03/02 无线电
如何将数据从文本导入到mysql
2006/10/09 PHP
php将会员数据导入到ucenter的代码
2010/07/18 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
jQuery学习之prop和attr的区别示例介绍
2013/11/15 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
js获取select默认选中的Option并不是当前选中值
2014/05/07 Javascript
JS实现移动端实时监听输入框变化的实例代码
2017/04/12 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
浅析TypeScript 命名空间
2020/03/19 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
2020/04/13 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
python验证码识别的示例代码
2017/09/21 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
python scatter函数用法实例详解
2020/02/11 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
CSS3实现多样的边框效果
2018/05/04 HTML / CSS
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
人事助理自荐信
2014/02/02 职场文书
会计专业毕业自荐书范文
2014/02/08 职场文书
小学少先队活动方案
2014/02/18 职场文书
家长写给老师的建议书
2014/03/13 职场文书
企业文化标语大全
2014/06/10 职场文书
企业读书活动总结
2014/06/30 职场文书
2014年监理工作总结范文
2014/11/17 职场文书
2015企业年终工作总结范文
2015/05/27 职场文书
2019教师的学习计划
2019/06/25 职场文书
vue首次渲染全过程
2021/04/21 Vue.js
Python中time与datetime模块使用方法详解
2022/03/31 Python
macos系统如何实现微信双开? mac登录两个微信以上微信的技巧
2022/07/23 数码科技