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 相关文章推荐
DWR实现模拟Google搜索效果实现原理及代码
Jan 30 Javascript
用JS实现3D球状标签云示例代码
Dec 01 Javascript
Javascript Ajax异步读取RSS文档具体实现
Dec 12 Javascript
jQuery中:empty选择器用法实例
Dec 30 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
Sep 26 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
Feb 11 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
May 26 Javascript
详解Vue微信公众号开发踩坑全记录
Aug 21 Javascript
详解angularJS+Ionic移动端图片上传的解决办法
Sep 13 Javascript
JavaScript编程设计模式之构造器模式实例分析
Oct 25 Javascript
vue修改对象的属性值后页面不重新渲染的实例
Aug 09 Javascript
如何实现iframe父子传参通信
Feb 05 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
php session处理的定制
2009/03/16 PHP
php银联网页支付实现方法
2015/03/04 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
关于PHP通用返回值设置方法
2017/03/31 PHP
用jscript启动sqlserver
2007/06/21 Javascript
关于viewport,Ext.panel和Ext.form.panel的关系
2009/05/07 Javascript
JS中动态添加事件(绑定事件)的代码
2011/01/09 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
jquery实现兼容浏览器的图片上传本地预览功能
2013/10/14 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
png在IE6 下无法透明的解决方法汇总
2015/05/21 Javascript
jquery滚动特效集锦
2015/06/03 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
2016/07/15 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
微信小程序 五星评分的实现实例
2017/08/04 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
2019/09/27 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
写了个监控nginx进程的Python脚本
2012/05/10 Python
python数组过滤实现方法
2015/07/27 Python
详解Python对JSON中的特殊类型进行Encoder
2019/07/15 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
python的等深分箱实例
2019/11/22 Python
python用TensorFlow做图像识别的实现
2020/04/21 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
python raise的基本使用
2020/09/10 Python
基于DOM+CSS3实现OrgChart组织结构图插件
2016/03/02 HTML / CSS
MYPROTEIN澳大利亚官方网站:欧洲运动营养品牌
2019/06/26 全球购物
汽车技术服务与贸易专业求职信
2014/07/20 职场文书
党员演讲稿
2014/09/04 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
教师工作表现自我评价
2015/03/05 职场文书
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python
vue+springboot实现登录验证码
2021/05/27 Vue.js