Подтвердить что ты не робот

Android-скребок Android с безглавым браузером

Я потратил день на исследование библиотеки, которая может быть использована для выполнения следующих действий:

  • Получить полное содержимое веб-страницы, например, в фоновом режиме, без результата рендеринга.
  • Библиотека lib должна поддерживать страницы, которые запускают запросы ajax для загрузки некоторых дополнительных данных результата после загрузки исходного HTML.
  • Из полученного html мне нужно захватить элементы в форме выбора xpath или css.
  • В будущем мне также, возможно, потребуется перейти на следующую страницу (скрыть события, отправить кнопки/ссылки и т.д.)

Вот что я пробовал без успеха:

  • Jsoup: отлично работает, но не поддерживает javascript/ajax (поэтому он не загружает полную страницу)
  • Android построен в HttpEntity: та же проблема с javascript/ajax как jsoup
  • HtmlUnit: выглядит точно, что мне нужно, но после нескольких часов не может заставить его работать на Android (другим пользователям не удалось загрузить файлы с jar файлами размером 12 МБ+. Я сам загрузил полный исходный код и ссылался на него только как на библиотеку проекта чтобы найти такие вещи, как Applets и java.awt(используемые HtmlUnit), не существует в Android).
  • Rhino - я нахожу это очень запутанным и не знаю, как заставить его работать в Android, и даже если это то, что я ищу.
  • Selenium Driver: похоже, что он может работать, но у вас нет простого способа реализовать его безгласным способом, чтобы у вас не было фактического html, отображаемого для представления.

Я действительно хочу, чтобы HtmlUnit работал, поскольку он кажется лучшим для моего решения. Есть ли способ или, по крайней мере, другая библиотека, которую я пропустил, которая подходит для моих нужд?

В настоящее время я использую Android Studio 0.1.7 и могу при необходимости перейти на Ellipse.

Спасибо заранее!

4b9b3361

Ответ 1

Хорошо через 2 недели я допускаю поражение и использую обходной путь, который отлично работает для меня в данный момент.

Проблема:
Слишком сложно переносить HTMLUnit на Android (или, по крайней мере, с моим уровнем знаний). Я уверен, что это достойный проект (и не то, что нужно для опытного Java-программиста). Я отправил по электронной почте ребят в HTMLUnit, и они прокомментировали, что они не смотрят в порт или какие усилия будут задействованы, но предложили, чтобы любой, кто хочет начать с такого проекта, должен отправить сообщение в свой список рассылки, чтобы привлечь больше разработчиков (http://htmlunit.sourceforge.net/mail-lists.html).

Обходной путь:
Я использовал андроид, встроенный в WebView, и переопределил метод onPageFinished класса Webview, чтобы добавить Javascript, который захватывает весь html после полной загрузки страницы. Webview также может использоваться для вызова действий javascript, нажатия кнопок, заполнения форм и т.д.

Код:

webView.getSettings().setJavaScriptEnabled(true);
MyJavaScriptInterface jInterface = new MyJavaScriptInterface(context);
webView.addJavascriptInterface(jInterface, "HtmlViewer");

webView.setWebViewClient(new WebViewClient() {

@Override
public void onPageFinished(WebView view, String url) {

   //Load HTML
   webView.loadUrl("javascript:window.HtmlViewer.showHTML
       ('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
}

webView.loadUrl(StartURL);
ParseHtml(jInterface.html);   

public class MyJavaScriptInterface {

    private Context ctx;
    public String html;

    MyJavaScriptInterface(Context ctx) {
        this.ctx = ctx;
    }

    @JavascriptInterface
    public void showHTML(String _html) {
        html = _html;
    }
}

Ответ 2

Я взял упомянутую выше реализацию (внедрение JavaScript), и это работает для меня. Все, что я делаю, это просто устанавливаю видимость веб-просмотра, который будет скрыт под другими элементами пользовательского интерфейса. Я также думал сделать то же самое с селеном. Я использовал селен с Chrome в Python, и это здорово, но, как вы упомянули, нелегко не показать окно браузера. Но я думаю, что возможно было бы просто не показывать компонент в Android. Я должен попробовать.