繁体   English   中英

在(任何)Java 程序(访问呈现的 DOM 树)中呈现 JavaScript 和 HTML?

[英]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 库进行处理,然后将结果推送回浏览器。 这里有一些关于它的细节:

https://developer.mozilla.org/en/XQuery

您可以使用 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 这些用于测试目的,但这些库对您的情况很有用。 您可以实现一个不会打开新窗口而只是这些浏览器的运行时的爬虫。

你可以试试 JExplorer。 有关更多信息,请参阅http://www.teamdev.com/downloads/jexplorer/docs/JExplorer-PGuide.html

你也可以试试 Cobra,见http://lobobrowser.org/cobra.jsp

我还没有尝试过这个项目,但我已经看到了几个包含 javascript dom 操作的 node.js 实现。

https://github.com/tmpvar/jsdom

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM