使用无头浏览器进行安卓网页抓取 [已关闭]

2022-09-01 06:57:11

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

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

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

  • Jsoup:工作得很好,但不支持javascript/ajax(所以它不会加载整页)
  • Android内置于HttpEntity:javascript/ajax与jsoup的问题相同
  • HtmlUnit:看起来正是我需要的,但几个小时后无法让它在Android上工作(其他用户尝试加载12MB +的jar文件失败。我自己加载了完整的源代码并将其作为项目库引用,却发现诸如Applets和java.awt(由HtmlUnit使用)之类的东西在Android中不存在。
  • 犀牛 - 我发现这非常令人困惑,不知道如何让它在Android中工作,即使它是我正在寻找的。
  • Selenium驱动程序:看起来它可以工作,但你没有一种直接的方法以无头的方式实现它,这样你就不会将实际的html显示到视图中。

我真的希望HtmlUnit工作,因为它似乎最适合我的解决方案。有没有适合我需求的方法或至少另一个我错过的图书馆?

我目前正在使用Android Studio 0.1.7,如果需要,可以移动到Ellipse。

提前致谢!


答案 1

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

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

解决方法:
我使用Android内置的WebView,并覆盖了Webview类的onPageFinished方法,以注入Javascript,该Javascript在页面完全加载后抓取所有html。Webview还可用于调用进一步的javascript操作,单击按钮,填写表单等。

法典:

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

答案 2

我已经采用了上面提到的实现(注入JavaScript),这对我有用。我所要做的就是简单地将Web视图的可见性设置为隐藏在其他UI元素下。我也在考虑用硒做同样的事情。我在Python中使用了硒和Chrome,它很棒,但就像你提到的,不显示浏览器窗口并不容易。但我认为有可能只是在Android中不显示该组件。我得试试。


推荐