java - 使用 headless 浏览器进行 Android 网页抓取

标签 java android selenium web-scraping htmlunit

我花了一天时间研究可用于完成以下任务的库:

  • 在后台检索网页的全部内容,而不向 View 呈现结果。
  • 例如,该库应支持在初始 HTML 加载后触发 ajax 请求以加载一些额外结果数据的页面。
  • 我需要从生成的 html 中抓取 xpath 或 css 选择器形式的元素。
  • 将来我可能还需要导航到下一页(触发事件、提交按钮/链接等)

这是我尝试过但没有成功的方法:

  • Jsoup:效果很好,但不支持 javascript/ajax(因此它不会加载整页)
  • Android 内置 HttpEntity:javascript/ajax 与 jsoup 存在相同问题
  • HtmlUnit:看起来正是我需要的,但下类后无法在 Android 上运行(其他用户尝试加载 12MB 以上的 jar 文件失败。我自己加载了完整的源代码并将其仅作为项目库引用发现诸如 Applets 和 java.awt(由 HtmlUnit 使用)之类的东西在 Android 中不存在)。
  • Rhino - 我觉得这很令人困惑,不知道如何让它在 Android 中运行,即使它是我正在寻找的。
  • Selenium 驱动程序:看起来它可以工作,但您没有直接的方法以 headless 方式实现它,因此您不会将实际的 html 显示到 View 中。

我真的希望 HtmlUnit 能够工作,因为它似乎最适合我的解决方案。有什么方法或至少我错过了另一个适合我需要的库吗?

我目前使用的是 Android Studio 0.1.7,如果需要可以迁移到 Ellipse。

提前致谢!

最佳答案

好的,2 周后我承认失败,并且正在使用目前对我来说非常有效的解决方法。

问题:
将 HTMLUnit 移植到 Android 太难了(或者至少以我的专业水平)。我确信它是一个有值(value)的项目(对于有经验的 Java 程序员来说并不那么耗时)。我给 HTMLUnit 的人发了电子邮件,他们评论说他们没有研究端口或将涉及什么工作,但建议任何想要开始这样的项目的人都应该向他们的邮件列表发送消息,以让更多的开发人员参与进来 (http://htmlunit.sourceforge.net/mail-lists.html) .

解决方法:
我使用 android 内置的 WebView 并覆盖了 Webview 类的 onPageFinished 方法来注入(inject)在页面完全加载后抓取所有 html 的 Javascript。 Webview 还可以用于调用更多的 javascript Action 、单击按钮、填写表单等。

代码:

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

webView.setWebViewClient(new WebViewClient() {

    @Override
    public void onPageFinished(WebView view, String url) {
       //Load HTML
       webView.loadUrl("javascript:window.HtmlViewer.showHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
    }

}

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

public class MyJavaScriptInterface {

    public String html;

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

关于java - 使用 headless 浏览器进行 Android 网页抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17399055/

相关文章:

android - 如何获取 Google Play 商店区域设置

java - Android如何以编程方式并排设置2个TextView?

相对布局中的android "layout_alignParentBottom"

java - Selenium 网络驱动程序 2 不起作用

java - 当某个元素突出显示时查找该元素的文本

java - JProgressBar 的替代品?

java - 使用一对一关系时如何修复 "A different object with the same identifier value was already associated with the session"错误

java - 如何使用 Scanner 类计算文件中的字数?

java - 未知的框架尺寸

selenium - 如何在Selenium远程WebDriver中禁用Flash