首页 > 基础资料 博客日记
Java根据url生成图片、截图
2025-01-14 07:30:11基础资料围观140次
说明
来都来了,别着急走,有些搞后端的同志看到使用了nodejs头也不回的就走了,我也是纯后端出身,接下来的内容和安装步骤我会以后端入门级开发都能看懂方式描述,简易程度堪比Hello Word
原理
nodejs可以直接在cmd命令窗格中通过命令直接运行,Java可以调用命令窗格执行某个命令;
使用nodejs脚本调用Puppeteer(Puppeteer是一个由Google Chrome团队官方提供的Node.js库)利用Puppeteer无感的调用Chrome浏览器抓取网页并截图,最后将图片转为标准输出流返给Java程序
环境准备
1.确保已经安装了node和npm运行环境
node -v
npm -v
可以执行上面的两个命令来检查,能看到输出版本号,表示环境没问题;如果没有安装可以访问nodejs官网,下载安装程序 傻瓜式下一步安装即可;安装完成后将镜像地址改成国内的
npm config set registry https://registry.npmmirror.com
2.确保安装了Chrome浏览器或基于Chrome内核开发的浏览器
如何使用
1.创建文件夹,打开cmd cd到新建的文件中执行下面的命令,这个过程大概需要3-5分钟
npm install puppeteer
执行完后的效果如下
2.新建screenshot.js文件,编写nodejs脚本
const puppeteer = require('puppeteer');
// 获取java传过来的参数
const url = process.argv[2];
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
// 设置视口大小
await page.setViewport({
width: 1920,
height: 1080,
deviceScaleFactor: 2, // 像素比,默认为 1。在高 DPI 屏幕上,可以将其设置为 2 或更高,以模拟高分辨率显示。
});
await page.goto(url);
const screenshotBuffer = await page.screenshot({
fullPage: true;//是否截全屏
});
// 输出截图的 Buffer 到标准输出流
process.stdout.write(screenshotBuffer);
await browser.close();
})();
效果如下
3.cmd在当前目录中执行下面的命令,测试抓取百度的页面
node screenshot.js https://www.baidu.com/
抓取成功后的效果
一堆乱码对吧,但是不要慌 这是正常的,因为脚本中是将文件流转成了标准的输出流
4.Java代码
package com.assoft.erms.common.utils;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
public class ScreenshotUtil {
public static void main(String[] args) {
//js脚本文件地址
String screenshotJs = "D:\\workspace\\javascript\\screenshot.js";
//要截图的网页(有拦截器,需要验证身份的不行)
String url = "http://politics.people.com.cn/n1/2024/1031/c1024-40350705.html";
//保存的文件名
String filePath = "screenshot.png";
try {
//两种返回类型,逻辑是一样的;只是返回类型不同 根据情况自行选择
// 模式一:获取截图的字节数组
byte[] screenshotBytes = ScreenshotUtil.captureScreenshotAsBytes(url,screenshotJs);
System.out.println("屏幕截图字节数组长度: " + screenshotBytes.length);
// 模式二:将截图保存到指定路径
ScreenshotUtil.captureScreenshotAsFile(url, filePath,screenshotJs);
System.out.println("屏幕截图已保存到: " + filePath);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取网页截图的字节数组
* @param url
* @return
* @throws Exception
*/
public static byte[] captureScreenshotAsBytes(String url,String screenshotJs) throws Exception {
Process process = Runtime.getRuntime().exec(new String[]{"node", screenshotJs, url});
// 获取 Process 的输入流
try (InputStream inputStream = process.getInputStream();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, length);
}
process.waitFor(); // 等待进程结束
return byteArrayOutputStream.toByteArray(); // 返回字节数组
}
}
/**
* 将网页截图保存到指定路径
* @param url
* @param filePath
* @throws Exception
*/
public static void captureScreenshotAsFile(String url, String filePath,String screenshotJs) throws Exception {
byte[] screenshotBytes = captureScreenshotAsBytes(url,screenshotJs); // 获取截图字节数组
// 将字节数组写入文件
try (FileOutputStream fileOutputStream = new FileOutputStream(filePath)) {
fileOutputStream.write(screenshotBytes);
}
}
}
5.最终的效果图如下
图片违规了。。。。
集成
Demo是写好了,怎么集成到自己的java工程中呢?
很简单只需要将node_modules和screenshot.js复制到自己的Java工程中,package.json、package-lock.json不需要
目录层级的说明:
screenshot.js会往上查找node_modules,以下是三个例子
可行
|-- node_modules
|-- screenshot.js
可行
|-- node_modules
|-- js
|-- screenshot.js
不可行
|-- screenshot.js
|-- static
|-- node_modules
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: