zoukankan      html  css  js  c++  java
  • puppeteer截图

    puppeteer

    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({
             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-screenshot

    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({
             1200,
            height: 800
        });
        //获取页面Dom对象
        let body = await page.$('#cnblogs_post_body');
        //调用页面内Dom对象的 screenshot 方法进行截图
        await body.screenshot({
            path: '2.png'
        });
        await browser.close();
    })();
    

    参考文档

    1. https://github.com/GoogleChrome/puppeteer/blob/v1.11.0/docs/api.md#elementhandlescreenshotoptions
  • 相关阅读:
    找回感觉的练习
    第四次博客作业-结对项目
    zookeeper启动脚本
    docker自己制作centos7-jdk1.8-tomcat8
    Docker运行springboot的项目
    从list中模糊查询字符串
    Java实现文件下载
    hadoop的HA集群搭建
    oauth2 feign 报401的错误
    SpringBoot mybatis 自定义分页插件 注解版
  • 原文地址:https://www.cnblogs.com/morethink/p/10246716.html
Copyright © 2011-2022 走看看