最近项目中遇到这样一个需求,根据一个动态的URL来生成对应的网页快照。网上找了很多资料,最终采用如下方法解决。
生成原理:将动态URL的页面先生成HTML文件,然后再根据生成的HTML生成快照。生成的HTML中必须有值如:<div>test<div>,不能通过JS或JSON的方式给页面元素赋值,否则生成的(快照)图片会是空白的。
缺点:当点击按钮提交表单后,可能由于网络不畅通,造成请求超时从而造成生成快照失败;解决办法:可通过定时程序来生成图片解决此问题。
部分源码如下(附件中有完整源码):
/**
* JAVA线程根据给定URL生成网页快照
* User: GQ
* Date: 13-10-31
* Time: 下午10:45
* To change this template use File | Settings | File Templates.
*/
import snapshot.model.Page;
import java.util.Timer;
public class Test {
private TaskQueue<Page> queue;
private Timer timer;
protected void setUp() {
queue = new TaskQueue<Page>();
queue.put(new Page("微软", "http://www.microsoft.com/"));
queue.put(new Page("MOP", "http://www.mop.com/"));
queue.put(new Page("MSN", "http://www.msn.com/"));
queue.put(new Page("阿里巴巴", "http://www.alibaba.com/"));
queue.put(new Page("淘宝", "http://www.taobao.com/"));
queue.put(new Page("百度", "http://www.baidu.com/"));
queue.put(new Page("谷歌", "http://www.google.com/"));
queue.put(new Page("腾讯", "http://www.qq.com/"));
queue.put(new Page("新浪", "http://www.sina.com/"));
queue.put(new Page("SPRING", "http://www.springframework.org/"));
queue.put(new Page("网易", "http://www.163.com/"));
}
public void setRun() {
timer = new Timer();
SnapshotProcessorDeamon deamon = new SnapshotProcessorDeamon();
deamon.setAvgmax(2);
//File f = new File(this.getClass().getResource("/").getPath()); // 获取类加载的根路径 例如:D:/IdeaProjects/cdby_wan/WebRoot/WEB-INF/classes
//deamon.setExec(f.toString().replaceAll("\\\\","/")+"/IECapt.exe");
deamon.setExec("c:\\IECapt.exe");
deamon.setMax(5);
deamon.setImageRoot("c:/snapshot/");
deamon.setTaskQueue(queue);
deamon.setTime(1000l);
deamon.setTimeout(20000l);
timer.schedule(deamon, 10000, 10000);
do {
try {
Thread.sleep(11000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (deamon.getProcessorCount() > 0);
}
/**
* @param args
*/
public static void main(String[] args) {
long start = System.currentTimeMillis();
System.out.println("开始时间:" + start);
Test t = new Test();
t.setUp();
t.setRun();
long end = System.currentTimeMillis();
System.out.println("结束时间:" + end);
System.out.println("花费时间:" + (end - start) / 1000 + "秒");
}
}
根据动态URL生成HTML,请参考:http://gqsunrise.iteye.com/admin/blogs/1968228