Le guide ultime du scraping Web avec Node.js

Alors, qu'est-ce que le web scraping? Il s'agit d'automatiser la tâche laborieuse de collecte d'informations sur les sites Web.

Il existe de nombreux cas d'utilisation pour le web scraping: vous voudrez peut-être collecter les prix de divers sites de commerce électronique pour un site de comparaison de prix. Ou peut-être avez-vous besoin des horaires de vol et des listes d'hôtels / AirBNB pour un site de voyage. Peut-être souhaitez-vous collecter des e-mails à partir de divers répertoires pour des prospects, ou utiliser des données d'Internet pour former des modèles d'apprentissage automatique / IA. Ou vous pourriez même vouloir créer un moteur de recherche comme Google!

Il est facile de démarrer avec le web scraping et le processus peut être divisé en deux parties principales:

  • l'acquisition des données à l'aide d'une bibliothèque de requêtes HTML ou d'un navigateur headless,
  • et analyser les données pour obtenir les informations exactes souhaitées.

Ce guide vous guidera tout au long du processus avec le module de demande-promesse populaire Node.js, CheerioJS et Puppeteer. En parcourant les exemples de ce guide, vous apprendrez tous les trucs et astuces dont vous avez besoin pour devenir un pro de la collecte des données dont vous avez besoin avec Node.js!

Nous allons rassembler une liste de tous les noms et anniversaires des présidents américains de Wikipédia et les titres de tous les articles sur la première page de Reddit.

Tout d'abord: installons les bibliothèques que nous utiliserons dans ce guide (Puppeteer prendra un certain temps à installer car il doit également télécharger Chromium).

Faire votre première demande

Ensuite, ouvrons un nouveau fichier texte (nommez le fichier potusScraper.js), et écrivons une fonction rapide pour obtenir le HTML de la page «Liste des présidents» de Wikipedia.

Production:

Utilisation de Chrome DevTools

Cool, nous avons obtenu le HTML brut de la page Web! Mais maintenant, nous devons donner un sens à cette goutte géante de texte. Pour ce faire, nous devrons utiliser Chrome DevTools pour nous permettre de rechercher facilement dans le code HTML d'une page Web.

Utiliser Chrome DevTools est simple: ouvrez simplement Google Chrome et faites un clic droit sur l'élément que vous souhaitez gratter (dans ce cas, je clique droit sur George Washington, car nous voulons obtenir des liens vers toutes les pages Wikipédia des présidents individuels) :

Maintenant, cliquez simplement sur inspecter et Chrome affichera son volet DevTools, vous permettant d'inspecter facilement le code HTML source de la page.

Analyse HTML avec Cheerio.js

Génial, Chrome DevTools nous montre maintenant le modèle exact que nous devrions rechercher dans le code (une «grande» balise avec un lien hypertexte à l'intérieur). Utilisons Cheerio.js pour analyser le code HTML que nous avons reçu précédemment afin de renvoyer une liste de liens vers les pages Wikipédia individuelles des présidents américains.

Production:

Nous vérifions qu'il y a exactement 45 éléments retournés (le nombre de présidents américains), ce qui signifie qu'il n'y a pas de balises "grandes" cachées supplémentaires ailleurs sur la page. Maintenant, nous pouvons parcourir et saisir une liste de liens vers les 45 pages Wikipédia présidentielles en les récupérant dans la section «attribs» de chaque élément.

Production:

Nous avons maintenant une liste des 45 pages Wikipédia présidentielles. Créons un nouveau fichier (nommé potusParse.js), qui contiendra une fonction pour prendre une page Wikipédia présidentielle et renvoyer le nom et l'anniversaire du président. Tout d'abord, récupérons le code HTML brut de la page Wikipedia de George Washington.

Production:

Utilisons à nouveau Chrome DevTools pour trouver la syntaxe du code que nous voulons analyser, afin que nous puissions extraire le nom et l'anniversaire avec Cheerio.js.

Nous voyons donc que le nom est dans une classe appelée «firstHeading» et que l'anniversaire est dans une classe appelée «bday». Modifions notre code pour utiliser Cheerio.js pour extraire ces deux classes.

Production:

Mettre tous ensemble

Parfait! Maintenant, emballons ceci dans une fonction et exportons-la à partir de ce module.

Revenons maintenant à notre fichier d'origine potusScraper.js et avons besoin du module potusParse.js. Nous l'appliquerons ensuite à la liste des wikiUrls que nous avons rassemblées précédemment.

Production:

Rendu des pages JavaScript

Voilà! Une liste des noms et des anniversaires des 45 présidents américains. Utiliser uniquement le module demande-promesse et Cheerio.js devrait vous permettre de gratter la grande majorité des sites sur Internet.

Récemment, cependant, de nombreux sites ont commencé à utiliser JavaScript pour générer du contenu dynamique sur leurs sites Web. Cela pose un problème pour request-promise et d'autres bibliothèques de requêtes HTTP similaires (telles que axios et fetch), car elles n'obtiennent que la réponse de la requête initiale, mais elles ne peuvent pas exécuter le JavaScript comme le peut un navigateur Web.

Ainsi, pour gratter les sites qui nécessitent l'exécution de JavaScript, nous avons besoin d'une autre solution. Dans notre prochain exemple, nous obtiendrons les titres de tous les articles de la première page de Reddit. Voyons ce qui se passe lorsque nous essayons d'utiliser request-promise comme nous l'avons fait dans l'exemple précédent.

Production:

Voici à quoi ressemble la sortie:

Hmmm… pas tout à fait ce que nous voulons. En effet, pour obtenir le contenu réel, vous devez exécuter le JavaScript sur la page! Avec Puppeteer, ce n'est pas un problème.

Puppeteer est un nouveau module extrêmement populaire présenté par l'équipe Google Chrome qui vous permet de contrôler un navigateur sans tête. C'est parfait pour le scraping par programme de pages qui nécessitent l'exécution de JavaScript. Récupérons le HTML de la page d'accueil de Reddit en utilisant Puppeteer au lieu de request-promise.

Production:

Agréable! La page est remplie avec le bon contenu!

Nous pouvons maintenant utiliser Chrome DevTools comme nous l'avons fait dans l'exemple précédent.

Il semble que Reddit place les titres dans des balises «h2». Utilisons Cheerio.js pour extraire les balises h2 de la page.

Production:

Ressources additionnelles

Et voilà la liste! À ce stade, vous devriez vous sentir à l'aise d'écrire votre premier grattoir Web pour collecter des données à partir de n'importe quel site Web. Voici quelques ressources supplémentaires qui pourraient vous être utiles pendant votre parcours de scraping Web:

  • Liste des services proxy de scraping Web
  • Liste des outils de scraping Web pratiques
  • Liste des astuces de scraping Web
  • Comparaison des proxies de scraping Web
  • Documentation Cheerio
  • Documentation du marionnettiste