Automatiser encore un peu plus !

Bonjour à tous !

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 :

  1. lancer script 1
  2. attendre que script 1 soit terminé
  3. lancer script 2
  4. 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 ?

Bonne semaine à tous :wink: !

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?

1 J'aime

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 ?

Plusieurs choses:

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 });

1 J'aime

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 jsonframe-cheerio@2.0.52). La version 3 (modulaire) est déjà en production et une documentation arrivera quand j’aurais le temps :slight_smile:

Amuse toi bien :wink:

1 J'aime

ruby ruby et ruby !!!
tu pourras tout faire, ouvrir un navigateur, scrapper les datas, les exporter au format que tu veux

Y’a eu plus constructif comme commentaire x)

Ce que tu énonces tu peux le faire concrètement dans n’importe quel langage :stuck_out_tongue_winking_eye:
Chacun ses préférences ensuite :slight_smile:

3 J'aimes

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

3 J'aimes

oula que d’agressivité ! ne vous méprenez pas sur mon message messieurs, il n’a pas pour but d’imposer quoique ce soit à qui que ce soit

sur ce je vous laisse scraper en toute tranquilité :wink:

Merci pour vos retours!

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 :relaxed:!

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 » :grinning: !

2 J'aimes