Рендеринг JavaScript и HTML в (любой) Java-программе (Access Rendered DOM Tree)? - PullRequest
14 голосов
/ 29 января 2010

Я знаю, что такого рода вопрос уже задавался здесь раньше, но в результате поиска я не нашел решения:

Мой вопрос таков: какие библиотеки Java лучше всего «полностью загрузить любую веб-страницу и отобразить встроенный JavaScript-код (-ы), а затем получить программный доступ к визуализированной веб-странице (то есть к DOM-дереву!) И получить дерево DOM как «HTML-источник».

(Что-то аналогично тому, что делает firebug в конце, он рендерит страницу, и я получаю доступ к полностью визуализированному дереву DOM, как выглядит страница в браузере! Исходный код JavaScript. Это не то, что я хочу. Мне нужен доступ к отображаемой странице ...)

(Под рендерингом я имею в виду только рендеринг дерева DOM , а не визуальный рендеринг ...)

Это не обязательно должна быть одна библиотека, вполне допустимо иметь несколько библиотек, которые могут выполнить это вместе (одну загрузку, одну визуализацию ...), но из-за динамической природы JavaScript, скорее всего, библиотека JavaScript также будет должен иметь какой-то загрузчик для полной визуализации любого асинхронного JS ...

Справочная информация: В «старые добрые времена» HttpClient (Apache Library) был всем необходимым для создания собственного очень простого сканера. (Многие злоумышленники, такие как Nutch или Heretrix, все еще строятся вокруг этого базового принципа, в основном фокусируясь на анализе стандартного HTML, поэтому я не могу учиться у них) Моя проблема в том, что мне нужно сканировать некоторые веб-сайты, которые сильно зависят от JavaScript, и что я не могу выполнить синтаксический анализ с HttpClient, поскольку мне обязательно нужно выполнить JavaScripts до ...

Спасибо большое !! Тим

Ответы [ 7 ]

4 голосов
/ 01 февраля 2012

Это немного нестандартно, но если вы планируете запускать свой код на сервере, где у вас есть полный контроль над вашей средой, он может работать ...

Установить Firefox (или XulRunner, если вы хотите, чтобы все было легковесно) на вашей машине.

Используя систему плагинов Firefox, напишите небольшой плагин, который загружает заданный URL-адрес, через несколько секунд копирует DOM страницы в строку.

из этого плагина, используйте API Java LiveConnect (см. http://jdk6.java.net/plugin2/liveconnect/ и https://developer.mozilla.org/en/LiveConnect), чтобы передать эту строку в общедоступную статическую функцию в некотором встроенном коде Java, который можетвыполнить необходимую обработку самостоятельно или перенести ее на более сложный код.

Преимущества: Вы используете браузер, на который ориентируется большинство разработчиков приложений, поэтому наблюдаемое поведение должно быть сопоставимым.Вы также можете обновить браузер по обычному пути обновления, чтобы ваша библиотека не устарела при изменении стандартов HTML.

Недостатки: Вам понадобится разрешение наЗапустите приложение без заголовка на вашем сервере.Вам также придется беспокоиться о сложности взаимодействия между процессами.

Я уже использовал API плагина для вызова Java раньше, и это вполне достижимо.Если вам нужен пример кода, вы должны взглянуть на плагин XQuery - он загружает код XQuery из DOM, передает его в библиотеку Java Saxon для обработки, а затем передает результат обратно в браузер.Вот некоторые подробности об этом здесь:

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

3 голосов
/ 06 февраля 2012

Вы можете использовать JavaFX 2 WebEngine. Загрузите JavaFX SDK (возможно, он уже есть, если вы установили JDK7u2 или более позднюю версию) и попробуйте следующий код.

Он напечатает HTML с обработанным JavaScript. Вы можете раскомментировать строки в середине, чтобы увидеть рендеринг.

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();
    }

}
2 голосов
/ 06 февраля 2012

Вы можете использовать Java, Groovy с Grails или без него. Затем используйте Webdriver, Selenium, Spock и Geb для тестирования, но библиотеки полезны для вашего случая. Вы можете внедрить Crawler, который не будет открывать новое окно, а будет работать только в обоих браузерах.

2 голосов
/ 01 февраля 2012

Библиотека Selenium обычно используется для тестирования, но дает вам удаленный контроль над большинством стандартных браузеров (IE, Firefox и т. Д.), А также безголовый режим без браузера (с помощью HtmlUnit). Поскольку оно предназначено для проверки пользовательского интерфейса путем очистки страниц, оно вполне может служить вашим целям.

По моему опыту, иногда он может бороться с очень медленным JavaScript, но при тщательном использовании команд "ожидания" вы можете получить довольно надежные результаты.

Он также имеет то преимущество, что вы можете управлять страницей, а не просто чистить ее. Это означает, что если вы выполните некоторые действия на странице, прежде чем получите нужные данные (нажмите кнопку поиска, нажмите кнопку Далее, сейчас очистить), вы можете внести это в процесс.

Я не знаю, сможете ли вы получить полный DOM в навигационной форме от Selenium, но обеспечивает извлечение XPath для различных частей страницы, что вам и нужно обычно требуется для очистки.

1 голос
/ 06 февраля 2012

Я не пробовал этот проект, но я видел несколько реализаций для node.js, которые включают в себя манипуляции с javascript dom.

https://github.com/tmpvar/jsdom

1 голос
/ 06 ноября 2010

Вы можете попробовать JExplorer. Для получения дополнительной информации см http://www.teamdev.com/downloads/jexplorer/docs/JExplorer-PGuide.html

Вы также можете попробовать Cobra, см. http://lobobrowser.org/cobra.jsp

1 голос
/ 29 января 2010

MozSwing может помочь http://confluence.concord.org/display/MZSW/Home.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...