IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

[CasperJS] Scrapping avec CasperJS. then(), des click() et des back()


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 29
    Par défaut [CasperJS] Scrapping avec CasperJS. then(), des click() et des back()
    Bonjour,

    Pas satisfait de l'interface d'un site de petites annonces (voir code ci-joint), je cherche un moyen de récupérer dans un fichier JSON les infos publiées sur ce site à l'aide d'un programme batch.
    Plus a l'aise en Java, je me suis orienté vers jSoup pour scrapper le site.
    Mais très vite j'ai été bloqué par l'aspect dynamique du site, et google m'a conseillé d'utiliser le combo PhantomJS - CasperJS.

    J'ai phantomjs-1.9.7-windows et capserjs-1.1-b3 installés.
    J’exécute mon script en ligne de commande DOS.

    Mais je suis coincé par la syntaxe/ la logique de casper et plus généralement de javascript.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    var casper = require('casper').create({
      verbose: false,
      logLevel: 'debug',
      clientScripts: ["includes/jquery-2.1.0.min.js"] // activer jQuery
    });
     
    var startUrl = 'http://www.lacentrale.fr/cote-voitures-alfa+romeo-159---.html';
    var selector1 = 'div.CoteListMillesime a';
    var selector;
    var nodes;
     
    casper.start(startUrl, function() {
      // on affiche l'url courante (possible redirection)
      console.log('location is ' + this.getCurrentUrl()+"\n selector1 : " + selector1);
     
      // ajouter une classe unique "link_nnn" à toutes les balises <a> de la page
      var indiceSuivant = 0;
      this.evaluate( function() { // fonction jQuery
        $( "a" ).each(function(index) {    
          $( this ).addClass("link_"+index);
        }); 
      });
     
      nodes = this.getElementsInfo(selector1);
     
    });
     
    // DEBUT de boucle < 
    casper.then(function() {
      // click sur le node[3] 
      var i = 3;
      selector = "a."+nodes[i].attributes.class;
      var url = nodes[i].attributes.href;
      console.log("selector = '" + selector +"' -> " + url);
     
      this.click(selector); // clicker sur le lien courant
      console.log('avant then.click, location :' + this.getCurrentUrl());
    });
     
    casper.then(function() {
      // visiter indice 3
      console.log('apres then.click, location :' + this.getCurrentUrl());
      this.capture(selector+".png");
      this.back();
      console.log('avant then.back, location :' + this.getCurrentUrl());
    });
     
    casper.then(function() {
      // back from indice courrant
      console.log('apres then.back, location :' + this.getCurrentUrl());
      this.capture("back1.png");
    });
    // FIN de boucle >
     
    casper.run();
    En gros : j'arrive a visiter un élément prédéfini du tableau nodes (ici l'indice 3).
    Je n'arrive pas a comprendre comment écrire une boucle pour visiter l'ensemble du tableau de nodes en gardant les casper.then( function()) - indispensable pour que les click() et les back() soient pris en compte.

    Une idée, une piste ?

    Une fois passé ce problème je devrai pouvoir "facilement" descendre plus loin dans le site jusqu'à obtenir tout ce qui m'intéresse.

    EDIT : toute suggestion constructive sur mon code est bien venue.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 29
    Par défaut
    OK, j'ai résolu tout seul.

    Pour ceux qui voudraient savoir comment : il faut utiliser Casper.prototype.each(array, fn)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    var casper = require('casper').create({
      verbose: false,
      logLevel: 'debug',
      clientScripts: ["includes/jquery-2.1.0.min.js"] // activer jQuery
    });
     
    var startUrl = 'http://www.lacentrale.fr/cote-voitures-alfa+romeo-159---.html';
     
    var selectors = ['div.CoteListMillesime a','td.QuotMarque a'];
    var level = 0;
     
    var nodes;
     
    casper.start( startUrl, function(){
      console.log('start : ');
      // on affiche l'url courante (possible redirection)
      console.log('location asked ' + startUrl );
      console.log('location is ' + this.getCurrentUrl() );
     
    });
     
    casper.then( function(){
      console.log('* then1 ');
      this.evaluate( function() { // fonction jQuery
        $( "a" ).each(function(index) {    
          $( this ).addClass("link_"+index);
        }); 
      });
    });
     
    casper.then(function(){
      console.log('* then2 ');
      nodes =  this.getElementsInfo(selectors[level]);
      console.log("nodes.length : " + nodes.length);
    });
     
    casper.then(function(){
      casper.each(nodes, function(self, node){
        //console.log('* each ');
        this.then(function(){
     
          this.click('a.' + node.attributes.class);
          level++;
          this.then(function(){
            console.log('location is ' + this.getCurrentUrl() ); 
     
            console.log("niveau "  + level + " nombre de liens : " + this.getElementsInfo(selectors[level]).length)
     
            this.back();
            level--;
          });
     
          this.then(function(){
     
            this.evaluate( function() { // fonction jQuery
              $( "a" ).each(function(index) {    
                $( this ).addClass("link_"+index);
              }); 
            });
          });
     
        });
      });   
    });
     
     
    casper.run();

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/10/2009, 10h36
  2. Trigger pour mettre des droits sur des procedures et des vues
    Par briino dans le forum Développement
    Réponses: 3
    Dernier message: 23/09/2009, 09h44
  3. Réponses: 3
    Dernier message: 13/09/2007, 18h11
  4. Réponses: 3
    Dernier message: 23/01/2007, 08h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo