脚本嵌入式抓取引擎
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());
}
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);
}
}
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。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?