使用无头浏览器进行Android Web Scraping

Pie*_*rre 28 java selenium android htmlunit web-scraping

我花了一天时间研究一个可以用来完成以下工作的库:

  • 像在后台中一样检索网页的完整内容,而不将结果呈现给视图.
  • 例如,lib应该支持在初始HTML加载之后触发ajax请求以加载一些额外结果数据的页面.
  • 从生成的html我需要抓取xpath或css选择器表单中的元素.
  • 将来我也可能需要导航到下一页(关闭事件,提交按钮/链接等)

这是我没有成功的尝试:

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

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

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

提前致谢!

Pie*_*rre 26

好吧,2周后我承认失败并正在使用一种对我来说很有用的解决方法.

问题:
将HTMLUnit移植到Android(或至少具有我的专业水平)是非常困难的.我确信这是一个有价值的项目(而且对于经验丰富的java程序员来说并不耗费时间).我通过电子邮件发送了HTMLUnit上的人,他们评论说他们不是在寻找一个端口或者会涉及到什么样的努力,但是建议任何想要开始这样一个项目的人都应该向他们的邮件列表发送一条消息,让更多的开发人员参与其中(http: //htmlunit.sourceforge.net/mail-lists.html).

解决方法:
我使用了内置WebView的android并覆盖了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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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