Android Web Scraping avec un navigateur sans tête

j'ai passé une journée sur la recherche d'une bibliothèque qui peut être utilisée pour accomplir le suivant:

  • extraire le contenu complet d'une page Web comme en arrière-plan sans rendre le résultat à une vue.
  • la lib doit supporter les pages qui déclenchent des requêtes ajax pour charger des données de résultat supplémentaires après que le HTML initial ait été chargé par exemple.
  • à partir du html résultant, je dois saisir des éléments dans la forme de sélecteur xpath ou css.
  • Dans futur je peut-être aussi besoin d'accéder à une page suivante (feu désactiver les événements, en soumettant les boutons/liens etc)

Voici ce que j'ai essayé sans succès:

  • Jsoup: fonctionne très bien, mais pas de support pour javascript / ajax (donc il ne charge pas la page entière)
  • Android construit en HttpEntity: même problème avec javascript / ajax que jsoup
  • interface htmlunit: Ressemble exactement à ce dont j'ai besoin, mais après des heures impossible de le faire fonctionner sur Android (les Autres utilisateurs n'en j'essaie de charger les fichiers jar D'une valeur de 12 Mo+. J'ai moi-même chargé le code source complet et l'ai référencé comme une bibliothèque de projet seulement pour trouver que des choses telles que des Applets et java.awt (utilisé par HtmlUnit) n'existe pas sur Android).
  • Rhino - je trouve cela très déroutant et ne sais pas comment le faire fonctionner sur Android et même si c'est ce que je cherche.
  • pilote de sélénium: on dirait que ça peut marcher mais vous n'avez pas une façon simple de le mettre en œuvre d'une manière sans tête donc que vous n'avez pas le html affiché à la vue.

je veux vraiment que HtmlUnit fonctionne car il semble le mieux adapté à ma solution. Est-il possible ou au moins une autre bibliothèque que j'ai raté qui est adapté à mes besoins?

J'utilise actuellement Android Studio 0.1.7 et je peux me déplacer vers Ellipse si nécessaire.

Merci d'avance!

24
demandé sur Pierre 2013-07-01 11:06:07

1 réponses

Ok après 2 semaines j'admets la défaite et j'utilise une solution qui fonctionne très bien pour moi en ce moment.

Le problème:

Il est trop difficile de transférer HtmlUnit sur Android (ou du moins avec mon niveau d'expertise). Je suis sûr que c'est un projet intéressant (et pas si long pour programmeur expérimenté java) . J'ai envoyé un e-mail aux gars de HTMLUnit et ils ont commenté qu'ils ne sont pas à la recherche d'un port ou quel effort sera impliqué mais suggéré toute personne qui veut commencez avec un tel projet devrait envoyer un message à leur liste de diffusion pour obtenir plus de développeurs impliqués (http://htmlunit.sourceforge.net/mail-lists.html).

La solution:

J'ai utilisé android construit dans WebView et remplacé la méthode onPageFinished de la classe Webview pour injecter Javascript qui saisit tout le html après la page a pleinement chargé. Webview peut aussi être utilisé pour appeler des actions javascript, Cliquer des boutons, remplir des formulaires etc.

Code:

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;
    }
}
19
répondu Pierre 2014-06-08 17:56:00