小编典典

使用无头浏览器的Android Web抓取

selenium

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

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

这是我尝试未成功的尝试:

  • Jsoup:效果很好,但不支持javascript / ajax(因此无法加载整页)
  • 内置于HttpEntity中的Android:与jsoup一样的javascript / ajax问题
  • HtmlUnit:完全可以满足我的需求,但数小时后却无法在Android上正常工作(其他用户尝试加载价值12MB以上的jar文件失败。我本人加载了完整的源代码,并将其引用为项目库,只是为了找到那个Android中不存在Applets和java.awt(由HtmlUnit使用)之类的东西。
  • Rhino-我觉得这很令人困惑,不知道如何在Android中运行它,即使它是我想要的。
  • Selenium Driver:看起来它可以工作,但是您没有直接实现它的直接方法,因此您没有在视图中显示实际的html。

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

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

提前致谢!


阅读 782

收藏
2020-06-26

共1个答案

小编典典

好吧,两周后,我承认失败了,目前正在使用一种对我来说非常有用的解决方法。

问题:
将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(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;
    }
}
2020-06-26