对于Java实现网页截图这个问题,笔者在网上一番搜索之后,大概看到了如下三种实现方式。
- 使用Robot
- 利用JNI,调用第三方C/C++组件
- 自行解析HTML标记,并将其图像化
第一种方式无法同时处理大量数据,第二种方式增加了技术的复杂性,第三章方式中规中矩,但是开发费时,尤其时对于JavaScript的解析,难度会增大很多。所以,笔者放弃使用了前3种方式,直接使用了一个第三方截图服务,目前来看各方面都是很满意的。
该服务有如下特点:
- 支持多线路
- 支持登录截图
- 支持UA变换
- 支持Cookie注入 实现登录截图
- 支持自定义宽高
- 支持网页滚动截图
- 支持设定截图前的延迟时间
使用方式也很简单,我们打开它的首页 https://www.screenshotmaster.com/ 注册一个账号,然后你会在用户中心获取到一个唯一的Token,保存好这个Token 不要泄漏!
下面来看看它支持的参数:
您可以前往API文档页面查看更多的参数。
使用Java调用截屏大师的接口获取截图:
package main;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLEncoder;
public class Main {
public static void main(String[] args) {
try {
// 参数
String token = "YOUR_API_TOKEN";
String url = URLEncoder.encode("https://www.baidu.com");
int width = 1280;
int height = 800;
int full_page = 1;
// 构造URL
String query = "https://www.screenshotmaster.com/api/v1/screenshot";
query += String.format("?token=%s&url=%s&width=%d&height=%d&full_page=%s",
token, url, width, height, full_page);
URL apiUrl = new URL(query);
// 调用API并将结果保存进screenshot.png
InputStream inputStream = apiUrl.openStream();
OutputStream outputStream = new FileOutputStream("./screenshot.png");
inputStream.transferTo(outputStream);
inputStream.close();
outputStream.close();
} catch(Exception ex) {
ex.printStackTrace();
}
}
}