[英]Render JavaScript and HTML in (any) Java Program (Access rendered DOM Tree)?
什么是“完全下载任何网页并呈现内置 JavaScript,然后以编程方式访问呈现的网页(即 DOM 树!)并将 DOM 树作为“HTML 源”的最佳 Java 库? ?
(类似于 firebug 最后所做的事情,它呈现页面,我可以访问完全呈现的 DOM 树,就像页面在浏览器中的样子一样!相反,如果我点击“显示源代码”,我只能获得 JavaScript 源代码代码。这不是我想要的。我需要访问呈现的页面...)
(渲染我的意思是只渲染 DOM 树而不是视觉渲染......)
这不一定是一个单一的库,可以有多个库一起完成(一个下载,一个渲染……),但由于 JavaScript 的动态特性,JavaScript 库很可能也必须有某种下载器来完全呈现任何异步 JS ......
背景:
在“过去的美好时光”中,HttpClient(Apache 库)是构建您自己的非常简单的爬虫所需的一切。 (很多爬虫比如Nutch或者Heretrix还是围绕着这个核心原理构建的,主要是做Standard HTML解析,所以学不来)我的问题是需要爬一些依赖JavaScript的网站我无法使用 HttpClient 进行解析,因为我绝对需要在之前执行 JavaScript...
这有点开箱即用,但是如果您计划在可以完全控制环境的服务器中运行代码,它可能会起作用......
在你的机器上安装 Firefox(或 XulRunner,如果你想保持轻量级)。
使用 Firefox 插件系统,编写一个小插件,它加载给定的 URL,等待几秒钟,然后将页面的 DOM 复制到一个字符串中。
从此插件中,使用 Java LiveConnect API(请参阅http://jdk6.java.net/plugin2/liveconnect/和https://developer.mozilla.org/en/LiveConnect )将该字符串推送到公共静态函数在一些嵌入式 Java 代码中,它可以自己进行所需的处理,也可以将其转为一些更复杂的代码。
优点:您使用的是大多数应用程序开发人员针对的浏览器,因此观察到的行为应该具有可比性。 您还可以沿着正常的升级路径升级浏览器,这样您的库就不会随着 HTML 标准的变化而过时。
缺点:您需要获得在服务器上启动非无头应用程序的权限。 您还需要担心进程间通信的复杂性。
之前用插件API调用过Java,还是可以实现的。 如果您想要一些示例代码,您应该查看 XQuery 插件 - 它从 DOM 加载 XQuery 代码,将其传递给 Java Saxon 库进行处理,然后将结果推送回浏览器。 这里有一些关于它的细节:
您可以使用 JavaFX 2 WebEngine
。 下载JavaFX SDK (如果您安装了 JDK7u2 或更高版本,您可能已经拥有它)并尝试下面的代码。
它将使用处理过的 javascript 打印 html。 您也可以取消注释中间的行以查看渲染。
public class WebLauncher extends Application {
@Override
public void start(Stage stage) {
final WebView webView = new WebView();
final WebEngine webEngine = webView.getEngine();
webEngine.load("http://stackoverflow.com");
//stage.setScene(new Scene(webView));
//stage.show();
webEngine.getLoadWorker().workDoneProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
if (newValue.intValue() == 100 /*percents*/) {
try {
org.w3c.dom.Document doc = webEngine.getDocument();
new XMLSerializer(System.out, new OutputFormat(doc, "UTF-8", true)).serialize(doc);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
});
}
public static void main(String[] args) {
launch();
}
}
Selenium库通常用于测试,但确实可以让您远程控制大多数标准浏览器(IE、Firefox 等)以及无头、浏览器自由模式(使用 HtmlUnit)。 因为它旨在通过页面抓取进行 UI 验证,所以它很可能符合您的目的。
根据我的经验,它有时会遇到非常慢的 JavaScript,但通过小心使用“等待”命令,您可以获得非常可靠的结果。
它还具有您可以实际驱动页面的好处,而不仅仅是抓取它。 这意味着如果您在获得所需数据之前在页面上执行一些操作(单击搜索按钮,单击下一步,现在抓取),那么您可以将其编码到流程中。
我不知道您是否能够从 Selenium 以可导航的形式获取完整的 DOM,但它确实为页面的各个部分提供了 XPath 检索,这通常是抓取应用程序所需要的。
您可以在有或没有 Grails 的情况下使用 Java、Groovy。 然后使用 Webdriver、Selenium、Spock 和 Geb 这些用于测试目的,但这些库对您的情况很有用。 您可以实现一个不会打开新窗口而只是这些浏览器的运行时的爬虫。
MozSwing 可以帮助http://confluence.concord.org/display/MZSW/Home 。
你可以试试 JExplorer。 有关更多信息,请参阅http://www.teamdev.com/downloads/jexplorer/docs/JExplorer-PGuide.html
你也可以试试 Cobra,见http://lobobrowser.org/cobra.jsp
我还没有尝试过这个项目,但我已经看到了几个包含 javascript dom 操作的 node.js 实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.