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 更新 JavaScript 数组的 uniq 方法
Jan 23 Javascript
JS setCapture 区域外事件捕捉
Mar 18 Javascript
JavaScript实现页面实时显示当前时间的简单实例
Jul 20 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
Sep 06 Javascript
JavaScript 基础函数_深入剖析变量和作用域
May 18 Javascript
Javascript缓存API
Jun 14 Javascript
Bootstrap基本组件学习笔记之进度条(15)
Dec 08 Javascript
jQuery实现扑克正反面翻牌效果
Mar 10 Javascript
js 数字、字符串、布尔值的转换方法(必看)
Apr 07 Javascript
微信小程序多张图片上传功能
Jun 07 Javascript
jquery ajaxfileupload异步上传插件
Nov 21 jQuery
JavaScript实现登录窗体
Jun 22 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
人族 Terran 基本策略
2020/03/14 星际争霸
php json_encode()函数返回json数据实例代码
2014/10/10 PHP
ThinkPHP路由机制简介
2016/03/23 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
2017/10/13 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
使用bootstrap插件实现模态框效果
2017/05/10 Javascript
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
详解基于vue-cli配置移动端自适应
2018/01/13 Javascript
使用RxJS更优雅地进行定时请求详析
2019/06/02 Javascript
微信小程序 导入图标实现过程详解
2019/10/11 Javascript
微信小程序保存图片到相册权限设置
2020/04/09 Javascript
Element InputNumber 计数器的实现示例
2020/08/03 Javascript
Python多线程编程(一):threading模块综述
2015/04/05 Python
python版简单工厂模式
2017/10/16 Python
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
Python爬虫框架Scrapy常用命令总结
2018/07/26 Python
Python实现的读取/更改/写入xml文件操作示例
2018/08/30 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
pygame用blit()实现动画效果的示例代码
2020/05/28 Python
基于python实现可视化生成二维码工具
2020/07/08 Python
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
幼师岗位求职简历的自荐信格式
2013/09/21 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
物业消防安全责任书
2014/07/23 职场文书
教师节活动总结
2014/08/29 职场文书
公司向个人借款协议书范本
2014/10/09 职场文书
2015大学生实训报告
2014/11/05 职场文书
2019年健身俱乐部的创业计划书
2019/08/26 职场文书
两行代码解决Jupyter Notebook中文不能显示的问题
2021/04/24 Python
JavaScript模拟实现网易云轮播效果
2022/04/04 Javascript