一、前期准备
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