JAVA实现利用phantomjs对URL页面(网页)进行转图片保存

一、前期准备

1、下载phantomjs工具
地址:https://phantomjs.org/download.html
解压到指定文件夹,后续代码要调用该工具,记住路径
2、准备好模板NetToPicMoban.js
用于给phantomjs提供需要执行的js,具体放在那看自己的需求,我放在:D:/template/NetToPicMoban.js内容:

var page = require('webpage').create();
page.open(url, function(success){if(success==='success'){console.log('success');page.render(savename);phantom.exit();}else{console.log('error');phantom.exit();}
});

二、代码分析

1、从测试的main函数看起

public static void main(String[] args){//目标网页String url = "https://www.baidu.com" ;//生成的图片名称String picname = System.currentTimeMillis()+"sina.png" ;//要构建的目标jsString jsname = "sina.js";//生成jsUrlToImgSaveUtil.reload( url, picname,jsname);//调用系统的cmd 执行phantomjs.exe// cdm 表示命令行 // /c 表示执行后关闭窗口  // F: 表示转到F盘 看你的phantomjs.exe工具放在哪个盘就要转到哪个盘,否则生成不了图片// && 表示多个命令行关联,即下面字符串待执行三个命令行// cd 表示转到某个文件夹下,现在要转到phantomjs的bin目录下//  phantomjs.exe  xxxxxx.js  表示工具执行某个js文件String cmd1 = "cmd /c F: && cd F:\\tools\\phantomjs-2.1.1-windows\\bin\\" ;String cmd  = cmd1 + " && phantomjs.exe " + "D:\\template\\"+jsname;//执行cmdUrlToImgSaveUtil.implcmd(cmd);}

2、生成目标js文件

/*** 构建js文件* @param url* @param picname* @param jsname*/public static void  reload(String url,String picname,String jsname){//这里面的路径都是相对路径String content = "";//netToPicMoban.js这个phantomjs 的一个js模版,修改相应的参数就可以实现我们要的功能String str = read(new File("D:/template/NetToPicMoban.js"));String content1 = str.replace("url", "'"+url+"'");content = content1.replace("savename", "'"+picname+"'");write(content,"D:/template/", jsname );}

3、文件读取和文件写法方法
(可以封装到一个工具类)

/*** 文件读取* @param file* @return*/public static String read(File file) {try (FileInputStream fis = new FileInputStream(file)) {byte[] b = new byte[(int) file.length()];fis.read(b);return new String(b, StandardCharsets.UTF_8);} catch (IOException e) {e.printStackTrace();}return "";}/*** 文件写入* @param content  文件内容* @param dirPath   保存路径* @param fileName   文件名称*/public static void write(String content, String dirPath, String fileName) {File file = createFile(dirPath, fileName);try (FileWriter writer = new FileWriter(file)) {writer.write(content);writer.flush();} catch (IOException e) {e.printStackTrace();}}/*** 创建文件* @param dirPath  文件路径* @param fileName  文件名称* @return*/private static File createFile(String dirPath, String fileName) {String filePath = "";if (Objects.isNull(dirPath) || dirPath.isEmpty()) {filePath = fileName;} else {if (dirPath.endsWith("/")) {filePath = dirPath + fileName;} else {filePath = dirPath + "/" + fileName;}File dir = new File(dirPath);if (!dir.exists()) {dir.mkdirs();}}File file = new File(filePath);if (!file.exists()) {try {file.createNewFile();} catch (IOException e) {e.printStackTrace();}}return file;}

4、执行cmd

/*** 执行cmd* @param cmd*/
public static void  implcmd(String cmd){//在java中调用执行cmd命令Process p;System.out.println(cmd);try {p = Runtime.getRuntime().exec(cmd);// 等待进程执行完成int exitCode = p.waitFor();//命令行运行内容打印BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}// 打印命令执行结果  为0表示成功System.out.println("Command executed with exit code: " + exitCode);} catch (IOException e) {System.out.println("e==="+e.getMessage());// TODO Auto-generated catch blocke.printStackTrace();} catch (InterruptedException e) {throw new RuntimeException(e);}
}

三、整体代码

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Objects;/*** @author Administrator*/
public class UrlToImgSaveUtil {/*** 构建js文件* @param url* @param picname* @param jsname*/public static void  reload(String url,String picname,String jsname){//这里面的路径都是相对路径String content = "";//netToPicMoban.js这个phantomjs 的一个js模版,修改相应的参数就可以实现我们要的功能String str = read(new File("D:/template/NetToPicMoban.js"));String content1 = str.replace("url", "'"+url+"'");content = content1.replace("savename", "'"+picname+"'");write(content,"D:/template/", jsname );}/*** 文件读取* @param file* @return*/public static String read(File file) {try (FileInputStream fis = new FileInputStream(file)) {byte[] b = new byte[(int) file.length()];fis.read(b);return new String(b, StandardCharsets.UTF_8);} catch (IOException e) {e.printStackTrace();}return "";}/*** 文件写入* @param content* @param dirPath* @param fileName*/public static void write(String content, String dirPath, String fileName) {File file = createFile(dirPath, fileName);try (FileWriter writer = new FileWriter(file)) {writer.write(content);writer.flush();} catch (IOException e) {e.printStackTrace();}}/*** 创建文件* @param dirPath* @param fileName* @return*/private static File createFile(String dirPath, String fileName) {String filePath = "";if (Objects.isNull(dirPath) || dirPath.isEmpty()) {filePath = fileName;} else {if (dirPath.endsWith("/")) {filePath = dirPath + fileName;} else {filePath = dirPath + "/" + fileName;}File dir = new File(dirPath);if (!dir.exists()) {dir.mkdirs();}}File file = new File(filePath);if (!file.exists()) {try {file.createNewFile();} catch (IOException e) {e.printStackTrace();}}return file;}/*** 执行cmd* @param cmd*/public static void  implcmd(String cmd){//在java中调用执行cmd命令Process p;System.out.println(cmd);try {p = Runtime.getRuntime().exec(cmd);// 等待进程执行完成int exitCode = p.waitFor();BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}// 打印命令执行结果System.out.println("Command executed with exit code: " + exitCode);} catch (IOException e) {System.out.println("e==="+e.getMessage());// TODO Auto-generated catch blocke.printStackTrace();} catch (InterruptedException e) {throw new RuntimeException(e);}}public static void main(String[] args){String url = "https://www.baidu.com" ;String picname = System.currentTimeMillis()+"sina.png" ;String jsname = "sina.js";//生成jsUrlToImgSaveUtil.reload( url, picname,jsname);//调用系统的cmd 执行phantomjs.exeString cmd1 = "cmd /c F: && cd F:\\tools\\phantomjs-2.1.1-windows\\bin\\" ;String cmd  = cmd1 + " && phantomjs.exe " + "D:\\template\\"+jsname;//执行cmdUrlToImgSaveUtil.implcmd(cmd);}
}

四、运行分析

1、代码运行打印
在这里插入图片描述

2、目标sina.js生成
在这里插入图片描述

3、图片位置在工具的bin目录下
在这里插入图片描述

五、注意事项

1、phantomjs工具安装位置
2、js模板和目标模板位置
3、cmd命令的写法与这些位置息息相关,注意细节
4、在linux处理的话要下载phantomjs的linux版本,具体命令执行方式、文件路径书写方式都与windows有差异

六、 参考资料:

https://blog.csdn.net/sh_c1991/article/details/37992055
https://blog.csdn.net/sunnyzyq/article/details/98726085

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

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

相关文章

51单片机STC89C52RC——3.1 数码管静态展示

目的 让数码管在指定位置显示指定数字 一,STC单片机模块 二,数码管 2.1 数码管位置 2.2 生活中用到的数目管 红绿灯 LED数码管在生活中随处可见,洗衣机、电饭煲、热水器、微波炉、冰箱、这些最基本的家用电器上基本都用到了这种7段LED数…

广告权重及出价解析

由于算法一直在不断改变,所以公式只能作为参考,不过核心是不变的。一、广告权重及出价解析 链接质量分CTR分值**CR分值(点击率*转化率)广告质量分广告出价*链接质量分我们的出价下一名产品的广告质量评分/我们的链接质量分0.01 …

Spring Bean详解

Spring Bean作用域 默认情况下,所有的 Spring Bean 都是单例的,也就是说在整个 Spring 应用中, Bean 的实例只有一个 如果我们需要创建多个实例的对象,那么应该将 Bean 的 scope 属性定义为 prototype,如果 Spring 需…

嵌入式linux系统中SPI子系统验证03

今天主要给大家分享一下,如何使用SPI总线进行验证的方法。 第一:SPI验证流程 1. echo 1 > /dev / spidev3.0 2.逻辑分析仪抓波形 3.十六进指转化为十进制 4.ASCII字符代码表匹配 第二:SPI验证结果 第三:设备…

“论数据访问层设计技术及其应用”写作框架,系统架构设计师

论文真题 在信息系统的开发与建设中,分层设计是一种常见的架构设计方法,区分层次的目的是为了实现“高内聚低耦合”的思想。分层设计能有效简化系统复杂性,使设计结构清晰,便于提高复用能力和产品维护能力。一种常见的层次划分模…

eclipse如何导入springboot项目

打开eclipse 找到你的springboot项目 点击finish即可 test02就已经导入进去了 配置一下maven 在将那个springboot项目刷新一下即可 运行成功

得物面试:什么是零复制?说说 零复制 底层原理?(吊打面试官)

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的零复制的问题: 说一说Rocketmq、是如何实现每秒上百万数据的超…

【C++11】详谈隐式类型转换

🎉博主首页: 有趣的中国人 🎉专栏首页: C进阶 🎉其它专栏: C初阶 | Linux | 初阶数据结构 小伙伴们大家好,本片文章将会讲解 C11中 隐式类型转换 的相关内容。 如果看到最后您觉得这篇文章写得…

实现跑马灯

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 跑马灯 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){Color[] colors { Color.Red, Color.Green, Color.Yellow };T…

JAVA每日作业day6.19

ok了家人们今天继续学习面向对象,话不多说看看今天学了什么 一.面向对象-封装 1,private private:私有的 权限修饰符 是一个成员修饰符,修饰成员变量 被private修饰的成员变量和成员方法只能在本类中使用 对外访问使用是 set XXX 和 get X…

IO流2.

字符流-->字符流的底层其实就是字节流 public class Stream {public static void main(String[] args) throws IOException {//1.创建对象并关联本地文件FileReader frnew FileReader("abc\\a.txt");//2.读取资源read()int ch;while((chfr.read())!-1){System.out…

pytorch库 02 Anaconda、Jupyter常用命令及操作

文章目录 一、Anaconda Prompt1、conda常用命令2、pip常用命令 二、Jupyter1、Jupyter常用命令及基本操作2、Jupyter代码补全插件安装 一、Anaconda Prompt 1、conda常用命令 下列命令可以在Anaconda Prompt中输入。 清屏: cls 查看帮助: conda -h 查…

海南聚广众达电子商务咨询有限公司抖音电商新引擎

在数字化浪潮席卷而来的今天,抖音电商作为新兴的商业模式,正以其独特的魅力和无限的潜力,引领着电子商务行业的革新与发展。海南聚广众达电子商务咨询有限公司,作为专注于抖音电商服务的领军企业,凭借其专业的团队、丰…

【IPython的使用技巧】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

u-modal自带的取消和确认按钮都在上面

添加&#xff1a;:show-cancel-button"true" <u-modal:show"showbut":show-cancel-button"true"title"提示":content"content"confirm"confirm"cancel"onModalCancel"confirmText"确认"c…

GRIT论文阅读笔记

一篇试图统一生成任务和编码任务的工作&#xff0c;就是把只能完成生成任务的GPT改成既能生成又能encode。思路其实很简单&#xff0c;就是在输入的时候添加instruction tokens来指引模型做representation还是generation&#xff0c;然后各自算损失。representation任务用的是d…

Certificate数字证书的有效性验证

1.证书相关概念 在讲证书有效性验证的逻辑之前&#xff0c;先了解几个概念。 证书颁发机构&#xff1a;一般为运营数字证书的机构&#xff0c;该机构负责证书的签发、吊销等生命周期管理。证书链&#xff1a;证书颁发机构一般会由多个组成&#xff0c;为树状层级&#xff0c;第…

JWT整合Gateway实现鉴权(RSA与公私密钥工具类)

一.业务流程 1.使用RSA生成公钥和私钥。私钥保存在授权中心&#xff0c;公钥保存在网关(gateway)和各个信任微服务中。 2.用户请求登录。 3.授权中心进行校验&#xff0c;通过后使用私钥对JWT进行签名加密。并将JWT返回给用户 4.用户携带JWT访问 5.gateway直接通过公钥解密JWT进…

数据库 | 试卷五试卷六试卷七

1. 主码不相同&#xff01;相同的话就不能唯一标识非主属性了 2.从关系规范化理论的角度讲&#xff0c;一个只满足 1NF 的关系可能存在的四方面问题 是&#xff1a; 数据冗余度大&#xff0c;插入异常&#xff0c;修改异常&#xff0c;删除异常 3.数据模型的三大要素是什么&…

15. STUN协议和ICE工作原理

NET介绍 NAT是一种地址转换技术&#xff0c;它可以将IP数据报文头中的IP地址转换为另一个IP地址&#xff0c;并通过转换端口号达到地址重用的目的。 在大多数网络环境中&#xff0c;我们都需要通过 NAT 来访问 Internet。 NAT作为一种缓解IPv4公网地址枯竭的过渡技术&#xff…