脚本嵌入式抓取引擎

J2SE 6.0 (有些地方也叫1.6)增加了脚本嵌入,使JAVA可以模拟动态语言的方式运行。这个类是ScriptEngineManager,被添加在javax.script命名空间中。执行脚本的程序很简单,看以下代码:

        ScriptEngineManager m = new ScriptEngineManager();
        ScriptEngine engine 
= m.getEngineByExtension("js");
        
try {
            engine.eval("java.lang.System.out.println(\"测试脚本输出\");");
        } 
catch (ScriptException e) {
            log.Log(
"执行脚本错误:" + file.getFileName());
            log.Log(e.getMessage());

        }
在java执行的javascript代码中也可以调用java对象。这样就可以由java提供一些API,由javascript来组织逻辑部分。
比如,可以让上面的代码执行以下脚本:
var Crawler = com.cnblogs.yurow.engin.Crawler;
var StreamWriter = com.cnblogs.yurow.engin.StreamWriter;
var RAMFile = com.cnblogs.yurow.engin.RAMFile;
var out = java.lang.System.out;
var starturl = "http://www.cnblogs.com/birdshover/default.html?page=";


for(var i = 435112;i<435212;i++){
    
var tempurl = starturl + i;
    
var content = new Crawler(tempurl).getResponse("utf-8");
    
if(content != null){
        
var file = new RAMFile(tempurl,content);
        StreamWriter.Save(
"result/" + i + ".html",file,"utf-8",true);
    }
}
其中Crawler是抓取类,StreamWriter是用来保存文件的,RAMFile是内存中文件的组织结构。这些都是自己定义的java类。
我包装了一个JCrawler.jar,读取当前目录下的js文件以确定需要执行的脚本。这些脚本可能被存放在不同的目录。读取到这个目录列表,然后执行目录列表中每个javascript的逻辑。
演示抓取程序:
执行其中的bat文件就可以执行抓取,默认把抓取到的文件保存在result目录下。
写javascript的时候要注意脚本文件的注释最好不要使用单行只是“//”,而是要“/*  */”。运行环境需要jre6.0。
posted @ 2009-01-19 12:51  Birdshover  阅读(2576)  评论(3编辑  收藏  举报