Cherche Crawler / Scraper pour structurer des données

Bonjour à tous,

Je suis débutant en développement (quelques notions php, javascript, mysql) et j’aimerais créer un crawler et scraper.
Cela me donne pas mal d’idées et m’intéresse bcp…

Aussi, j’ai pas mal parcouru les pages de Growthhacking.fr et je m’y perd un peu => phantomjs, scrapeBox, kimono, scrapy (vagrant) et j’en passe. J’aimerais avoir quelques conseils afin de ne pas trop m’éparpiller, ni de réinventer la roue.

J’aimerais qqch de gratuit si possible, quitte à mettre les mains dans ruby, java ou python.
-> crawler un site,
-> si la page visite répond à un critère (page produit par exemple)
-> cette pages est scrapée (comme le titre, une référence, une photo, un prix …)
-> puis on passe à une autre page…

Ce qui permettra de mettre en forme des données d’autres sites, de les croiser afin de créer un tout nouveau contenu, condensé, regroupant donc différentes sources.
Le format de sortie peut être un CSV tout bête.

Si une solution clé en main existe, comme un logiciel pourquoi pas, mais je n’ai pas trop de « budget »

Merci d’avance pour votre aide =)

1 J'aime

Salut @Marco2 ! Je te conseille Scrapy, un framework Python qui te permet de générer des parser/crawler/scraper précis, et ce facilement !

docs ici : https://scrapy.org/

EDIT: une liste plus complète d’outils en Python ici <3

2 J'aimes

Pour ma part, j’ai du créer un bot pour scrapper Linkedin, et j’ai utilisé la librairie open de phantom buster. La librairie s’appelle NickJs.
Elle te permet de simuler un navigateur, et de faire toutes les actions que ferais un utilisateur lambda. Résultat j’arrive à tout récupérer sur linkedin. Connexion, mail, fils d’actu. Je peux envoyer des demandes de connexion, des mail, liker des post etc …
Le plus tu peux simuler des temps de pause et autres actions aléatoire pour éviter de te faire épinglé comme Bots et simuler un comportement humain.
J’ai plug tout ca à un google spreadSheet pour enregistrer toutes les infos dont j’ai besoin et executer mes actions à faire.

Nickjs est vraiment assez simple à prendre main !

2 J'aimes

Le choix de la techno, ou du language, c’est vraiment une question de préférences personnelles, si on mets de coté les avantages/inconvénients propres à chaque solution.

La plupart font le boulot, sauf lorsque les sites auxquels tu t’attaques utilisent intensivement Javascript et AJAX pour charger dynamiquement leurs contenus et/ou nécessitent pléthores d’actions utilisateur sur pages webs pour afficher ces derniers.

Auquel cas, il est préférable de se diriger vers une techno de type « headless browser », dont les plus importants étaient PhantomJS+CasperJS , Selenium, NightmareJS,etc.

Je dis « étaient » car on assiste aujourd’hui à une explosion de nouvelles technos/libs, qui rajeunissent le paysage du Headless Browser. Sans compter que PhantomJS is dead, la lib n’est plus maintenue, et pour être tout à fait honnête ses performances laissaient à désirer.

Aujourd’hui, place à la nouvelle génération Headless Browsers, avec des solutions se basant par exemple sur Chromium Headless, qui s’intègre parfaitement avec Nodejs. (en prenant par exemple Puppeteer, la lib Headless Chrome Node API , maintenue par la Chrome DevTools team elle même). NickJS de PhantomBuster est d’ailleurs sans doute inspirée ou basée sur une de ces libs, la syntaxe étant plus que similaire.

Pour conclure, go vers du Chromium Headless, avec une librairie sous Nodejs.

Petit bémol toutefois, NickJS et similaires c’est bien mais pour la prise en main si on est pas à jour sur les dernières versions de Javascript (ECMAScript 6 & 7), on risque de galérer à bien comprendre les concepts de Promises, async/await, generators et autres nouveaux concepts qui sont d’une importance f-o-n-d-a-m-e-n-t-a-l-e.

3 J'aimes

@ScrapingExpert merci pour ces précisions !

1 J'aime

Merci beaucoup pour vos réponses.
Je vois que vous êtes tous passionnés et disponibles, ca fait plaisir !

On m’a aussi demandé de faire un crawler de site ce matin pour un projet, ca tombe bien =)

@ScrapingExpert tu me donne bcp bcp d’informations, pas facile pour un débutant mais je m’accroche.
J’ai quelques mini notions en java et avait testé rapidement PhantomJs. J’ai pu faire quelques captures d’écran, récupérer une liste de produits sur la page site. J’aimerais bien apprendre à utiliser les sélecteurs CSS dans le code afin de récupérer le contenu d’une balise title dans un DIV par exemple ou le lien qui s’y trouve =) et créer quelques boucles :slight_smile:

@Damien_Altman super intéressant et super poussé alors. Peut être que je n’ai pas un besoin aussi avancé que le tiens, du moins, pour le moment. En effet, l’idée de simuler un comportement humain m’intéressera sans doute par la suite : ne pas se faire prendre.

@gregory j’avais justement installé Python ainsi que Scrapy sur ma machine
Je tatonne bcp n’ayant pas de notions en python donc j’apprends les bases de Python pour l’instant.

Merci :slight_smile:

1 J'aime

@Marco2 : si tu souhaites un rapide exemple de comment extraire de la data en utilisant les sélecteurs CSS , essayes le tuto de Martin (PhantomBuster), rapide simple et efficace:

Avec le bout de code qui va avec ce que tu recherches:

await tab.open("news.ycombinator.com")
await tab.untilVisible("#hnmain") // Make sure we have loaded the page
await tab.inject("https://code.jquery.com/jquery-3.2.1.min.js") // We're going to use jQuery to scrape
const hackerNewsLinks = await tab.evaluate((arg, callback) => {
  // Here we're in the page context. It's like being in your browser's inspector tool
  const data = []
  $(".athing").each((index, element) => {
    data.push({
      title: $(element).find(".storylink").text(),
      url: $(element).find(".storylink").attr("href")
    })
  })
  callback(null, data)
})
1 J'aime

Merci pour le bout de code.
Il y a pas mal de similitudes, c’est sympa.
Va falloir que j’y passe du temps mais vais y arriver :slight_smile:

Sur PhantomJs j’avais fais ceci :

Exemple dans le code de la page