Scraper annonces automatiquement pour bdd

@mnmlstrntreprnr , @ScrapingExpert , @ctrl-s, @darkslategrey , @boristchangang ,
Bonjour la communauté, je me suis finalement calé sur casperJs et jsonframe-cheerio , par contre une petite question me derange toujours! comment faire pour que mon script une fois prêt et héberger tourne et rempli la base de donnée pré-indiqué en ligne sans mon intervention? Vu que actuellement pour exécuter mon script j’ai besoin de mon invite de commande et autre environnement!!! (comment je fais cette partie)


de passage y as t’il un tutoriel qui me permet d’avoir un model d’enregistrement dans base de donnée? ( le retour de mon script: les donnés collectées ?)

MERCI :raised_hands:

Pour cette partie, tu peux scheduler directement tes lignes de commandes via un cron (voir tuto pour crontab, exemple: cron [Wiki ubuntu-fr])

De cette manière, ton script pourra s’exécuter automatiquement tous les X jours / heures, selon la programmation de ton choix.

Pour se faire, tu peux soit:

  • 1 - Sauvegarder les retours de tes scripts dans des fichiers JSON en local, puis traiter ces fichiers JSONs directement depuis node js, PHP, Python (depuis la surcouche qui gère ta DB).

  • 2 - Créer un web service en local en surcouche de ta DB, que tu pourras appeler depuis ton script CasperJS pour injecter à la volée les données récupérées, via une injection de jQuery dans ton contexte Javascript du browser Casper, un peu comme cela:

thenPostData = function(jsondata) {

this.then(function() {

  this.evaluate(function(_jsondata) {

    $.ajax({
      type: "POST",
      url: 'http://localhost/API/rest/GhostJService?m=insertData&format=json',
      data: JSON.stringify({ jsondata: _jsondata }),
      contentType: "application/json; charset=utf-8",
      dataType: "json",
      crossDomain: true,
      success: function(data){
        console.log("Received data: " + JSON.stringify(data));
      },
      failure: function(errMsg) {
        console.log("failure - error : " + errMsg);
      }
    });
  }, jsondata);

});
};

Hope this helps :slight_smile:

3 « J'aime »

Super, thanck très gentils :+1:

Hello,

J’ai récemment scrapé à des fins de lead gen des annonces d’offres d’emploi. Le tout en Python.

Pour ce qui est du sign in, tu peux facilement l’automatiser avec Selenium + PhantomJS (qui en plus te permet de render le JS, utile pour les sites où le front query une API). Ensuite, tu passes le HTML à Beautiful Soup (plus lent que Scrapy, mais bien plus simple pour coder un proto ou un script vite).

Perso je trouve ça bien plus propre que de le faire en JS, mais c’est un avis subjectif. En soi, tu peux faire la même en JS (avec Casper) ou en Ruby (avec Nokogiri).

Si tu veux plus de détails, n’hésites pas :wink:

2 « J'aime »

@QuentinDty okey, je vois, le code est open souce? si oui donne moi le lien , tu sais on ne sais jamais!!! :stuck_out_tongue_winking_eye:

No problem, tout est open source !

Voici les liens vers les docs plutôt que les repos (histoire que tu puisses mettre au point un mvp rapidos):

Personellement, je te recommande de tester ton scraping avec Selenium (en utilisant PhantomJS) et BeautifulSoup. Si tu veux scraper vite et beaucoup de data, passe sur Scrapy et Splash. Après j’ai déjà réussi a scraper des sites entiers juste avec Selenium et BeautifulSoup, ça demande juste plus de ressources (et e temps) à ton ordi.

J’espère t’avoir aidé :wink:

1 « J'aime »

oK! Merci pour le partage! bon week!:+1:

Pour être tout à fait objectif et honnête, je ne vois pas l’intérêt de mettre du Selenium en surcouche de PhantomJS, alors que Phantom/CasperJS fait déjà super bien le job à lui tout seul.

Si c’est pour en arriver à devoir maitriser du Python + Selenium + JS + PhantomJS, je te raconte pas la galère…

Pour une personne comme toi qui est davantage branché JS, je te conseil de rester sur Phantom/CasperJS, ça sera 100 x plus simple.

@sem, voici un exemple de code avec CasperJS + ma lib GhostJS:

Tout l’aspect login automatique + gestion des boucles pour pages de listing de résultats avec pagination + parser data via une map label=>XPath est géré.

Bon faudrait un tuto pour expliquer le code, mais en gros c’est pour te donner un ordre d’idées de la puissance du truc :slight_smile:

1 « J'aime »

@ScrapingExpert j’ai lu le code, et je vois que c’est assez polyvalent , mais la LIB GhostJS fais quoi exactement ?

Le tuto de mon cher @boristchangang, m’a beaucoup aider en le prendre aussi en main tu peux faire un tour voir : https://medium.com/@boristchangang/scrapper-linkedin-avec-casperjs-pour-les-nuls-e962812734a6

@sem: Pour répondre à ta question, " GhostJS is a powerful wrapper and module for CasperJS"

Grossomodo, cette lib te permets d’écrire moins de code, avec des méthodes « wrapper » qui englobe des fonctions que l’on a l’habitude de sans cesse réutiliser.

Par exemple, quand tu fais du CasperJS, les 3/4 du temps les appels aux fonctions sont placés dans des casper.then(function(){....}); , à cause de la nature asynchrone de PhantomJS, ce qui te permet de fonctionner en terme de « step » grâce à CasperJS, et d’y gagner en lisibilité et compréhension dans ce contexte asynchrone. Du coup, tu dois souvent écrire ici et là des casper.then autour des appels aux méthodes, ce qui alourdi considérablement le code.

Il est alors bien plus simple d’utiliser des méthodes du type (dont les noms sont suffisamment explicites):

  • casper.thenWaitAndScreen
  • casper.thenWaitAndSendKeys
  • casper.clickOnLinkThenSavePageContentsThenBack

Exemple détaillé d’une méthode GhostJS:

/**
 * Ghost operations: THEN WAIT + THEN CLICK + THEN SCREEN
 * - Wait for a random time, defined by a min-max range, then click on a specific node element identified by its XPath, and take a screenshot
 * - The random time range (min and max values) is expressed in millisecond, the 'multiplyWait' parameter should be used as the range multiplier, example: for a random 2-3 seconds range, minWait=2, maxWait=3 and multiplyWait=1000
 * @param {number} minWait - The random time range min value (expressed in millisecond)
 * @param {number} maxWait - The random time range max value (expressed in millisecond)
 * @param {number} multiplyWait - The random time range multiplier value (should be 1000 if the time range is expressed in seconds)
 * @param {string} xpath - The XPath identifying the node element to click on
 * @param {string} screenName - The screenshot file name
 * @param {bool} onlywhenitemexists - Only process this step if the node identified by the XPath does exist
 */
 Ghost.prototype.thenWaitThenClickAndScreen =
/** @lends Ghost */
function(minWait, maxWait, multiplyWait, xpath, screenName, onlywhenitemexists) {

  onlywhenitemexists = (onlywhenitemexists===null || onlywhenitemexists===undefined || !onlywhenitemexists)? false: true;

  this.then(function() {
    if((this.xpathExists(xpath) && onlywhenitemexists) || !onlywhenitemexists ) {
      this.thenWaitThenClick(minWait, maxWait, multiplyWait, xpath);
      this.thenWaitAndScreen(1, 2, 1000, screenName);
    }
  });
 };

Voilà, c’est pour gagner du temps. La seule contrainte avant de pouvoir bien l’utiliser, c’est de maîtriser suffisamment les concepts de Phantom+CasperJS.

En effet les tutos de @boristchangang sont top :slight_smile:

2 « J'aime »

ah oui!! c’est plus complet et ça simplifie beaucoup la vie! ok bien

Bonjour à tous c’est mon tout premier post …Dans la moitié des cas wget est suffisant. Je crawl encore leboncoin avec wget (via un script perso qui me permet de faire une recherche simultanément dans plusieurs rayons de plusieurs régions + multi tags)