后端使用phantomjs对页面进行截图

news2024/11/16 10:50:59

最近碰到这样一些需求,后端需要对某个图表页面进行动态截图,将截图通过邮件发送到指定邮箱进行每日提醒。

这就需要用到无界浏览器进行此类操作。常见的无界浏览器有以下几种,知识来源于chatgpt3.5:

Headless Chrome - Google Chrome 浏览器的一个无界面版本,支持大部分 Chrome 浏览器的特性和 API。

Puppeteer - 使用 Node.js 调用 Headless Chrome 进行自动化测试的高级库,提供了便捷的 API,可以方便地控制 Chrome 浏览器的各种行为。

SlimerJS - 基于 Gecko 引擎的无头浏览器,可以用来模拟用户行为,渲染 Javascript 应用。

Splash - 一款基于 Python 的,专门用于爬虫和自动化测试的浏览器。它使用 WebKit 渲染引擎,并且有一个强大的 Lua API,可以很方便地控制浏览器的行为。

HtmlUnit - 一款 Java 的 Open-Source 的无界面浏览器,以模拟浏览器的方式来执行 HTML、CSS、JavaScript 代码,适用于自动化测试。

PhantomJS - 一个基于 WebKit 渲染引擎的无界面、使用 JavaScript 脚本编写的脚本able浏览器。它支持大部分的 Web 标准,包括 CSS, DOM, SVG, Canvas 和 XMLHttpRequest 等,能够在不需要 GUI 界面的情况下进行页面渲染和脚本执行。

本文基于PhantomJS ,介绍如何使用后台截图功能。PS:PhantomJS 的开发由 PhantomJS 社区组织负责,采用了 BSD 许可证。因为其长期未更新,而且有一些安全漏洞,官方已经于 2020 年停止了对 PhantomJS 的开发和维护,并建议用户转移到其他无头浏览器或使用 Pupeteer 来代替之。

一、下载安装phantomjs

Download PhantomJS

选择适用的执行环境,下载二进制包。

二、编写截图脚本

function screenshot(url, save_name) {
    var page = require('webpage').create();
    page.viewportSize = {width: 1280, height: 1024};

    page.onAlert = page.onPrompt = page.onConfirm = page.onError = function () {
    };

    page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36';
    page.settings.resourceTimeout = 1000*15;


    var cnt = 0;
    page.onNavigationRequested = function (url2, type, willNavigate, main) {
        cnt += 1;
        if (main && url2 !== url && cnt < 7) {
            page.close();

            setTimeout(function () {
                screenshot(url2, save_name)
            }, 100);
        }
    };


    page.open(url, function (status) {
        //console.debug(status);
        if (status === "success") {
            return window.setTimeout(pageRender, 100);
        } else {
            return window.setTimeout(pageRender, 100);
        }
    });


    window.setTimeout(pageRender, 60*1.2*1000);
    function pageRender() {
        page.evaluate(function () {
            document.body.bgColor = 'white';
        });

        page.clipRect = {
            top: 0,
            left: 0,
            width: 1280,
            height: 1024
        };

        page.render(save_name, {format: 'jpeg', quality: '100'});
        phantom.exit(0);
    }

}


function main() {

    var system = require('system');
    var p_url = new RegExp('-u=(.*)');
    var p_save_name = new RegExp('-s=(.*)');
    for (var i = 0; i < system.args.length; i++) {
        if (p_url.test(system.args[i]) === true) {
            var url = p_url.exec(system.args[i])[1];
        }

        if (p_save_name.test(system.args[i]) === true) {
            var save_name = p_save_name.exec(system.args[i])[1];
        }

    }

    if (typeof(url) === 'undefined' || url.length == 0 || typeof(save_name) === 'undefined' || save_name.length == 0) {
        console.log("Usage: phantomjs screenshot.js -u=http://swww.baidu.com/ -s=baidu.jpg ");

        phantom.exit(1);
    }

    screenshot(url, save_name)
}

main();

需要注意的是,截图如需要截完整的话,有两种方式:

1.设置哟个固定的大的viewPortSize值:page.viewportSize = {width: 1280, height: 1024};  

2.通过BOM方法操作滚动条,可以把滚动条滚动到一个很大的值:window.scrollTo(0,10000);

笔记中使用第一个方式进行操作。

三、执行命令行截图

phantomjs --ignore-ssl-errors true --ssl-protocol any --ssl-ciphers ALL screenshot.js -u=https://www.baidu.com -s=1.png

phantomjs会自动截图,并保存文件:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/504897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NC – 靶向特定功能的神经元细胞类型治疗脑部疾病

神经元是大脑的主要功能单位。这些细胞中传递的信号——以电波的形式——导致所有思维、感觉、运动、记忆和情感。 塞达斯-西奈医学中心的研究人员利用计算机模型来弥合“试管”神经元数据和这些细胞在大脑中的功能之间的差距。他们的研究有助于开发靶向特定功能的神经元类型治…

如何吸引主流媒体报道,强势刷屏?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好 五一小长假已经过去好几天了&#xff0c;大家渐渐的从假期舒适的闲暇转到正常的工作生活中了&#xff0c;但利用五一热点宣传的余温还在继续&#xff0c;今天胡老师就i注意到一篇题为&#xff1a;【强势刷屏&#xff01;“…

【笔记】【HTTP】《图解HTTP》第2章 简单的HTTP协议

前言 有输入就要有产出&#xff0c;该笔记是本人看完《图解HTTP》后对每章涉及到的知识进行汇总博客将会已书的每章为一篇发布&#xff0c;下一篇博客发布时间不确定笔记中有些个人理解后整理的笔记&#xff0c;可能有所偏差&#xff0c;也恳请读者帮忙指出&#xff0c;谢谢。…

Java每日一练(20230509) 下一个排列、分隔链表、随机指针链表

目录 1. 下一个排列 &#x1f31f;&#x1f31f; 2. 分隔链表 &#x1f31f;&#x1f31f; 3. 复制带随机指针的链表 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日…

操作系统—— 精髓与设计原理--期末复习

一、计算机系统概述 1、基本构成 计算机有四个主要的结构化部件&#xff1a; ①处理器&#xff08;Processor&#xff09;&#xff1a;控制计算机的操作&#xff0c;执行数据处理功能。当只有一个处理器时&#xff0c;它通常指中央处理器&#xff08;CPU&#xff09; ②内存…

VINS_FUSION的EVO评价

一、虚拟机和windows桌面可以复制粘贴的方法 1&#xff09;sudo apt-get autoremove open-vm-tools 2&#xff09;sudo apt-get insall open-vm-tools-desktop 3&#xff09;reboot 二、算法精度评价工具EVO 安装参考博文&#xff1a; 视觉SLAM基础&#xff1a;算法精度评…

计算机二级java经典题目及其解析

解析: 栈的存储空间为S(1:50)&#xff0c;初始状态为top51&#xff0c;表示栈的可用空间从S(1)到S(50)&#xff0c;栈顶指针初始指向S(51)的位置&#xff0c;表示当前栈为空。 经过一系列正常的入栈与退栈操作后&#xff0c;top50&#xff0c;表示栈顶指针已经向下移动了一个位…

微信小程序学习实录6(百度经纬度采集、手动调整精度、H5嵌入小程序、百度地图jsAPI、实时定位、H5更新自动刷新)

百度经纬度采集 一、H5页面开发1.手机端外部JS库2.地图容器3.数据表单4.地图加载5.回调封装函数自动定位 二、微信小程序核心代码1.lnglat.wxml2.lnglat.js3.lnglat.json 三、版本发布遇见的问题 一、H5页面开发 1.手机端外部JS库 viewport&#xff0c;手机端的适配&#xff…

【软考数据库】第九章 非关系型数据库NOSQL

目录 9.1 概述 9.2 理论基础 9.3 分区方法 9.4 存储分布 9.5 查询模型 9.6 存储模式 前言&#xff1a; 笔记来自《文老师软考数据库》教材精讲&#xff0c;精讲视频在b站&#xff0c;某宝都可以找到&#xff0c;个人感觉通俗易懂。 9.1 概述 传统的关系数据库在应付Web …

Listener监听器,实现一个显示在线用户人数

Listener监听器&#xff0c;实现一个显示在线用户人数 每博一文案 关于后半身&#xff0c;脾气越温&#xff0c;福报越深。 师傅说&#xff1a;惜命最好的方式不是养生&#xff0c;而是管好自己的情绪。 坏毛病都是惯出来的&#xff0c;但好脾气都是磨出来的&#xff0c;与人生…

《小钊记》项目启动前期工作相关记录:VUE、powerdesigner建模、虚拟机密码重置、代码生成

目录 VUE镜像基本命令vue 不是内部或外部命令路径配置路由 powerdesigner 建模栏位添加注释id设置自增导出sql 虚拟机root密码重置&#xff08;centos7&#xff09;生成代码工具安装EasyCode插件连接数据库生成代码可以自定义模板复制现有的模板&#xff0c;在其基础上进行改造…

MathType7简体中文版数学公式编辑器下载安装教程

MathType一款专业的数学公式编辑器&#xff0c;理科生专用的必备工具&#xff0c;可应用于教育教学、科研机构、工程学、论文写作、期刊排版、编辑理科试卷等领域。2018年2月&#xff0c;MathType 7简体中文版正式发布&#xff0c;给用户带来全新的体验。MathType 是Windows和M…

二分查找的两种形式(C++实现)

现在有一个这样的问题需要求解 题目要求&#xff1a;给定一个n个元素的&#xff08;升序&#xff09;整型数组nums和一个目标值target&#xff0c;写一个函数搜索nums中的target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回-1 示例 输入: nums [-1,0,3,5,9,12] …

解密银行客户经理展业利器系列一:商机共享、创收增长

2023年银行业面临存款、贷款、利润三大变局&#xff0c;与此同时&#xff0c;商业银行的数字化转型正延展至前台建设&#xff0c;期望通过科技手段布局应对&#xff0c;数字化重装身处一线的客户经理&#xff0c;带动单位时间创收提升&#xff0c;更有力地支撑银行业务战略发展…

数字设计小思 - 谈谈复位那些事

写在前面 本系列整理数字系统设计的相关知识体系架构&#xff0c;为了方便后续自己查阅与求职准备。在FPGA和ASIC设计中&#xff0c;对于复位这个问题可以算是老生常谈了&#xff0c;但是也是最容易忽略的点。本文结合FPGA的相关示例&#xff0c;再谈一谈复位。 &#xff08;本…

带着Java基础对比学习C#基本语法

文章目录 一.引包二.构造函数三.析构函数四.C#数据类型1.值类型2.引用类型分类 五.加框(boxing)和消框(unboxing&#xff09;六.运算符七.控制语句八.类的继承九.方法参数的种类十. 操作符重载十一.this关键字十二.类的多态十三.抽象类和抽象方法十四.密封类和密封方法十五.接口…

Web3中文|乱花渐欲meme人眼,BRC-20总市值逼近10亿美元

现在的Web3加密市场&#xff0c;用“乱花渐欲meme人眼”来形容再合适不过了。 何为meme&#xff1f; “meme”这个词大概很多人都不知道如何正确发音&#xff0c;并且一看到它就会和狗狗币Dogecoin等联系在一起。那它究竟从何而来呢&#xff1f; Meme&#xff1a;[mi:m]&#x…

算法:迷宫问题

描述 定义一个二维数组 N*M &#xff0c;如 5 5 数组下所示&#xff1a; int maze[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走的路&#xff0c;只能横着走或…

JVM致命错误日志(hs_err_pid.log)分析

当jvm出现致命错误时&#xff0c;会生成一个错误文件 hs_err_pid<pid>.log&#xff0c;其中包括了导致jvm crash的重要信息&#xff0c;可以通过分析该文件定位到导致crash的根源&#xff0c;从而改善以保证系统稳定。当出现crash时&#xff0c;该文件默认会生成到工作目…

vue项目部署后提示用户有新版本

你可能在浏览器见到过上面这种UI&#xff0c;这是在vue项目重新build在服务端部署后&#xff0c;浏览器刷新页面弹出的提示&#xff0c;这时如果用户点击更新就会重载页面&#xff0c;清除之前的缓存获取最新内容。 这是怎样发生的呢&#xff1f;你可能会想到下面的方式&#x…