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.
En gros : j'arrive a visiter un élément prédéfini du tableau nodes (ici l'indice 3).
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();
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.
Partager