2013-07-01 130 views
22

我已经花了一天时间就研发了可用于图书馆刮完成以下任务:Android网络与模拟浏览器

  • 在后台检索网页的完整内容,就像没有渲染结果到视图。
  • lib应该支持页面,这些页面会在加载例如初始HTML之后触发ajax请求来加载一些额外的结果数据。
  • 从生成的html我需要抓住xpath或css选择器窗体中的元素。
  • 在将来,我还可能需要导航到下一个页面(脱火事件,提交按钮/链接等)

这里是我没有成功尝试:

  • Jsoup:工程伟大的,但对JavaScript/AJAX(所以它不会加载整个页面)
  • 的Android内置的HttpEntity不支持:同样的问题与JavaScript/AJAX作为jsoup
  • 的HtmlUnit:看起来正是我需要的,但下班后不能得到它在和工作roid(其他用户尝试加载价值12MB的jar文件失败。我自己加载了完整的源代码,并将其引用为项目库,以发现诸如Applets和java.awt(由HtmlUnit使用)之类的东西在Android中不存在)。
  • 犀牛 - 我觉得这很混乱,不知道如何让它在Android中工作,即使它是我正在寻找的。
  • 硒驱动程序:看起来像它可以工作,但你没有一种直接的方式来实现它在一个无头的方式,使你没有实际的HTML显示到一个视图。

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

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

在此先感谢!

+1

似乎没有什么可用于我的方案。我已经开始研究HTMLUnit的Android端口,并希望能够尽快开展工作。一旦我检入了任何人都可以下载的HtmlUnit分支,我就会在这里发布。希望我能得到HtmlUnit开发者的参与,因为它似乎对Android端口有很大的兴趣。 – Pierre

+0

仅供参考:[PhantomJS.org](http://phantomjs.org)可能对其他人有帮助,就“无头浏览器”而言 – MiStr

+0

已经有4年了,我们还在这里!我面对同样的问题! – mehulmpt

回答

19

确定两周后我承认失败,并且正在使用一种解决方法,此时对我很有帮助。

问题:
将HTMLUnit移植到Android(或者至少具有我的专业水平)太困难。我相信它是一个有价值的项目(对于有经验的java程序员来说并不那么耗时)。我通过电子邮件向HTMLUnit发送电子邮件,他们评论说他们没有关注端口或将涉及哪些工作,但建议任何想从这个项目开始的人都应该发送一条消息到他们的邮件列表中,让更多的开发人员参与(http://htmlunit.sourceforge.net/mail-lists.html) 。

解决方法:
我使用android内置的WebView并覆盖了Webview类的onPageFinished方法,以便在页面完全加载后注入抓取所有html的Javascript。 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; 
    } 
} 
+0

我也试图创建一个android应用程序,但我需要先刮网站才能继续,并且该网站也启用了JavaScript(动态加载),有什么建议吗?谢谢! – ZdaR

+2

这个问题仍然没有解决,htmlunit端口为android将是一个梦想,因为你可以从页面中获取元素并运行.click()方法来生成新页面,无论如何,你可以使用android webview来做到这一点? –