Je suis assez novice en scraping mais je commence à me débrouiller notamment en javascript, j’ai malheureusement encore un peu de mal à faire des outputs propres et j’ai tendance à utiliser plusieurs technos pour un résultat final (exemple : pour un script, j’utilise casperjs pour sauvegarder l’html en local et je le charge via cheerio pour l’extraction). Du coup, j’aimerais bien écrire un script qui regroupe toute une série de lancement d’autres scripts; par exemple :
lancer script 1
attendre que script 1 soit terminé
lancer script 2
attendre que script 2 soit terminé
L’intérêt peut paraître limité mais si c’est pas long ça pourrait m’aider à m’organiser de manière un peu plus claire dans mes travaux. Je dois pas effectuer les bonnes requêtes sur google mais j’ai beaucoup de mal à trouver comment je peux effectuer ce genre de scripts, vous avez des tutos à me conseiller ?
Hello. Pourquoi ne pas directement charger cheerio au sein de ton script CasperJS, et faire l’extract proprement toujours au sein du même script, plutôt que le faire en deux fois?
C’était mon idée de base mais je pensais que c’était complètement impossible, ça m’apprendra à écouter ce qu’on me dit sans vérifier !
Je viens d’essayer de cette manière, mais ça ne donne rien :
var fs = require(‹ fs ›);
var casper = require(‹ casper ›).create({
mes paramètres
});
casper.start(target); // Start casper
var getContent = function() {
scroll tout en bas d’une page et la sauvegarde en html local
};
var extractIt = function() {
casper.then(function(){
var request = require("request");
var cheerio = require("cheerio");
var fs = require('fs');
var $ = cheerio.load(fs.readFileSync('/ le fichier sauvegardé'),{
mes paramètres
});
extraction + un console.log des données voulues
});
}
getContent();
extractIt();
casper.run();
A savoir que les deux scripts marchent indépendamment, je m’y prends mal ?
Si tu n’as plus deux scripts indépendants, alors il ne te sera plus nécessaire de passer par le stockage du HTML dans un fichier local, car là en gros tu fais getContent() -> save html to local file -> get html from local file -> extract().
Autant juste stocker le HTML dans une variable que tu passes direct à ton cheerio.
Ensuite, difficile à dire ce qu’il ne va pas dans ton code, je ne sais pas ce que tu as codé, ni comment tu gères le mécanismes d’appels à tes méthodes dans le contexte asynchrone. Assures toi simplement que chacune des séquences de ton code soit bien placée dans une step browser « casper.then ».
Si tu mets du code comme ceci:
bout de code 1,
bout de code 2,
bout de code 3,
bout de code 4,
On a pas la moindre idée de l’ordre d’exécution du script, n’oublies pas que ces bouts de codes peuvent être tous exécutés en même temps ou dans un ordre aléatoire, car tu es dans un contexte JS asynchrone.
D’où la nécessité de « wrapper » ton code, de telle sorte que:
casper.then(function(){ // bout de code 1 });
casper.then(function(){ // bout de code 2 });
casper.then(function(){ // bout de code 3 });
casper.then(function(){ // bout de code 4 });
Sache que lorsque tu lis ton fichier sauvegardé tu récupères simplement ton HTML. Tu pourrais à la place le passer directement en paramètre lors de la lecture de celui-ci.
Je n’utilise pas CasperJS mais quelque chose comme ça devrait fonctionner (@ScrapingExpert corrige moi si je me trompe ;)) :
const cheerio = require(‹ cheerio ›)
casper.then(function() {
let html = this.evaluate(function(){
return document.documentElement.outerHTML
})
let $ = cheerio.load(html)
return $(‹ html ›). // puis tu fais ce que tu veux (avec un return j’imagine)
}
Après tu parlais de sortir en clair de la donnée du HTML. Je t’invite à regarder un plugin que j’ai développé pour cheerio : https://github.com/gahabeen/jsonframe-cheerio. La doc comprend des exemples et est à jour pour la version 2.0.52 (npm install [email protected]). La version 3 (modulaire) est déjà en production et une documentation arrivera quand j’aurais le temps
J’aurais pas mieux dis … Ca fait limite qui veut imposer son langage de prédilection.
Sans oublier que si on prend le temps de lire le topic, on peut voir que notre ami @gvdh a dit « je commence à me débrouiller notamment en javascript ».
Bref, pour ce sujet, restons sur Javascript.
@gvdh: Vois avec ce que Gabin te donne comme conseil, il gère Cheerio & co
Effectivement je m’embête plus à sauvegarder en HTML puis recharger dans le même script ! J’essaye de me débrouiller depuis hier soir mais je bloque sur je-ne-sais-quoi, @mnmlstrntreprnr je me suis permis de t’envoyer un mp du coup sur les conseils de @ScrapingExpert !
Sinon effectivement @conquering_lion je suis sur javascript depuis le début et je préfère bien maîtriser une techno que « toucher un peu à tout » !