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.
Спасибо заранее!
Ответы
Ответ 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. Я должен попробовать.
Ответ 3
проверьте это тоже, проект похож на обходной путь: https://github.com/daandtu/android-web-scraper
Ответ 4
Вы можете найти порт Android HtmlUnit 2.30 здесь:https://github.com/null-dev/HtmlUnit-Android