2013-07-01 8 views
22

ho passato una giornata sulla ricerca di una libreria che può essere utilizzato per realizzare il seguente:Android Web raschiando con un browser senza testa

  • Recupera l'intero contenuto di una pagina web, come in background senza rendering risultato a un vista.
  • La lib dovrebbe supportare pagine che attivano richieste Ajax per caricare alcuni dati di risultati aggiuntivi dopo che l'HTML iniziale ha caricato, ad esempio.
  • Dall'html risultante ho bisogno di prendere gli elementi nel modulo selettore xpath o css.
  • In futuro eventualmente anche bisogno di passare a una pagina successiva (sparare eventi, la presentazione pulsanti/link ecc)

Ecco quello che ho provato senza successo:

  • Jsoup: Opere grande, ma senza il supporto per JavaScript/AJAX (in modo da non caricare la pagina intera)
  • Android costruito nel HttpEntity: stesso problema con javascript/ajax come jsoup
  • HtmlUnit: appare esattamente quello che mi serve, ma dopo ore, non riesco a farlo lavorare su E roid (Altri utenti non sono riusciti tentando di caricare i file jar da 12 MB + in più. Io stesso ho caricato il codice sorgente completo e l'ho fatto riferimento come libreria di progetto solo per scoprire che cose come Applet e java.awt (usate da HtmlUnit) non esistono in Android).
  • Rhino - Trovo questo molto confuso e non so come farlo funzionare in Android e anche se è quello che sto cercando.
  • Driver selenio: sembra che funzioni, ma non si ha un modo semplice per implementarlo in modo headless in modo da non avere l'html effettivo visualizzato in una vista.

Desidero davvero che HtmlUnit funzioni come sembra il più adatto per la mia soluzione. C'è qualche modo o almeno un'altra biblioteca che ho perso che è adatto alle mie esigenze?

Attualmente sto utilizzando Android Studio 0.1.7 e posso passare a Ellipse se necessario.

Grazie in anticipo!

+1

Sembra che non c'è nulla che può essere utilizzato per il mio scenario. Ho iniziato a lavorare su una porta Android per HTMLUnit e spero di avere presto qualcosa a che fare. Inserirò qui non appena avrò controllato un ramo HtmlUnit che chiunque può scaricare. Spero di riuscire a coinvolgere gli sviluppatori HtmlUnit in quanto sembra che ci sia molto interesse per una porta Android. – Pierre

+0

FYI: [PhantomJS.org] (http://phantomjs.org) potrebbe essere utile per gli altri, in termini di "browser headless" – MiStr

+0

Sono passati 4 ANNI E STIAMO ANCORA QUI! STO AFFRONTANDO LO STESSO PROBLEMA! – mehulmpt

risposta

19

Ok dopo 2 settimane ammetto la sconfitta e sto usando una soluzione che funziona perfettamente per me al momento.

Il problema:
È troppo difficile trasferire HTMLUnit su Android (o almeno con il mio livello di esperienza). Sono sicuro che è un progetto utile (e non molto tempo per programmatore java esperto). Ho mandato un'email ai ragazzi di HTMLUnit e hanno commentato che non stanno cercando una porta o quale sforzo sarà coinvolto, ma hanno suggerito che chiunque voglia iniziare con un progetto del genere dovrebbe inviare un messaggio alla loro mailing list per ottenere più sviluppatori coinvolti (http://htmlunit.sourceforge.net/mail-lists.html) .

La soluzione:
ho usato Android di costruito in WebView e overrided il metodo onPageFinished di classe Webview per iniettare Javascript che afferra tutto il codice HTML dopo che la pagina è completamente caricata. Webview può anche essere usato per chiamare azioni javascript futher, fare clic sui pulsanti, compilare moduli ecc.

Codice:

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

Sto anche provando a creare un'app per Android ma ho bisogno di raschiare prima il sito web per procedere, e quel sito è anche abilitato per javascript (caricato dinamicamente), qualche suggerimento? Grazie! – ZdaR

+2

questo problema non è ancora risolto, htmlunit porta per android sarebbe un sogno come puoi raccogliere elementi dalla pagina ed eseguire un metodo .click() per generare una nuova pagina, è comunque possibile farlo utilizzando Android WebView ? –