Retour au blog
Guides
Raluca PenciucLast updated on Apr 22, 202610 min read

Le web scraping en Ruby : le tutoriel complet

Le web scraping en Ruby : le tutoriel complet

Ne nous voilons pas la face : au fil des années, le volume de données sur Internet ne fera que continuer à augmenter. La situation échappe à tout contrôle, mais est-ce vraiment une mauvaise chose ?

Au cours de la dernière décennie en particulier, le web scraping a connu un essor fulgurant. Pour réussir dans le monde des affaires d'aujourd'hui, les entreprises ont besoin de stratégies efficaces, qui nécessitent de disposer d'une grande quantité d'informations en très peu de temps. De plus, cela pourrait être un excellent moyen pour les développeurs d'améliorer leurs compétences en codage ET d'aider l'entreprise.

Si vous faites partie de l'équipe Ruby mais que vous n'avez pas beaucoup d'expérience en matière de web scraping, cet article vous ouvrira un nouveau domaine à explorer : la création de votre propre outil de web scraping.

Comprendre le web scraping

Prenons l'exemple d'une plateforme de comparaison de prix. Son rôle est de récupérer le prix d'une multitude d'articles auprès de plusieurs détaillants en ligne. Mais pourquoi s'arrêter aux produits physiques ? Les secteurs du transport aérien et de l'hôtellerie sont également devenus beaucoup plus conviviaux pour les consommateurs, grâce aux sites de comparaison. Alors, comment fonctionnent ces sites web ou applications magiques ? Grâce au web scraping, bien sûr !

Vous vous demandez sans doute : « Comment vais-je utiliser ces données ? ». Voyons donc quelques applications pratiques du web scraping :

Cet article bien rédigé sur le web scraping fournit des descriptions détaillées et des cas d'utilisation supplémentaires.

Les robots de web scraping ne sont pas faciles à créer, même si vous comprenez leur fonctionnement et les avantages potentiels qu’ils peuvent offrir. Les sites web disposent de nombreux moyens pour identifier et empêcher les robots d’accéder à leurs données.

En voici quelques exemples :

  • Géoblocage : vous pouvez voir s'afficher des résultats spécifiques à une région lorsque vous demandez des informations provenant d'une autre zone (par exemple, les prix des billets d'avion).
  • Blocage d'IP : un site web peut vous bloquer ou ralentir votre connexion s'il détecte que vous effectuez des requêtes répétées depuis une adresse IP particulière ;
  • Honeypots : les humains ne peuvent pas voir les liens honeypot, mais les bots le peuvent ; une fois que les robots tombent dans le piège, leur adresse IP est bloquée ;
  • CAPTCHA : les utilisateurs peuvent résoudre ces problèmes logiques simples relativement rapidement, mais les scrapers ont souvent du mal à le faire ;

Il n'est pas facile de surmonter tous ces obstacles. Il n'est pas si difficile de créer un simple bot, mais la création d'un excellent scraper web est un peu plus complexe. C'est pourquoi, au cours de la dernière décennie, les API de scraping web sont devenues l'un des sujets les plus en vogue.

Le contenu HTML de n'importe quel site web peut être collecté à l'aide de WebScrapingAPI, et tous les problèmes que nous avons mentionnés précédemment seront automatiquement résolus. De plus, nous utilisons Amazon Web Services pour garantir la vitesse et l'évolutivité. Ça a l'air intéressant, n'est-ce pas ? Eh bien, ne vous contentez pas d'en entendre parler ! Essayez-le par vous-même grâce aux 5 000 appels API gratuits dont vous bénéficiez dans le cadre de l'essai gratuit de WebScrapingAPI.

Comprendre le Web

Il est nécessaire de comprendre le protocole HTTP (Hypertext Transfer Protocol) pour comprendre le Web. Ce protocole explique comment un serveur et un client communiquent. Un message contient des informations qui décrivent le client et la manière dont il traite les données : méthode, version HTTP et en-têtes.

Pour les requêtes HTTP, les robots de scraping utilisent la méthode GET pour récupérer des données depuis le serveur. Il existe également des méthodes avancées telles que POST et PUT. Les méthodes HTTP sont détaillées ici à titre de référence.

Dans les en-têtes HTTP, on trouve diverses informations supplémentaires sur les requêtes et les réponses. Pour le web scraping, voici celles qui importent :

  • User-Agent : les web scrapers s'appuient sur cet en-tête pour rendre leurs requêtes plus réalistes ; il contient des informations telles que l'application, le système d'exploitation, le logiciel et la version.
  • Cookie : le serveur et la requête peuvent échanger des informations confidentielles (telles que des jetons d'authentification).
  • Referrer : contient le site source visité par l'utilisateur ; il est donc essentiel de tenir compte de ce fait.
  • Host : il identifie l'hôte auquel vous vous connectez.
  • Accept : fournit un type de réponse pour le serveur (par exemple, text/plain, application/json).

Comprendre Ruby

Ruby est un langage de programmation multiparadigme de haut niveau qui est également entièrement interprétable. Cela signifie que le code du programme est stocké en texte brut, puis transmis à l'interpréteur qui l'exécute.

En 1995, Yukihiro Matsumoto (également connu sous le nom de Matz dans la communauté Ruby) a combiné des fonctionnalités de différents langages de programmation tels que Perl, Lisp et Smalltalk pour en créer un nouveau axé sur la simplicité et la productivité.

C'est un langage de programmation de niche, dont le domaine naturel est celui des applications web. Voici les avantages significatifs dont vous bénéficiez en utilisant ce langage dans vos projets :

  • Il donne des résultats, rapidement. Associé au framework Rails, il permet de créer des logiciels relativement rapidement ; c'est pourquoi les startups préfèrent généralement Ruby pour développer rapidement leurs MVP (produits minimums viables).
  • Il est bien développé et maintenu par la communauté Ruby en pleine expansion.
  • Des outils et des bibliothèques utiles (appelés « gems ») garantissent qu'il est facile de suivre les meilleures pratiques de codage dans presque toutes les situations.

En revanche, ces avantages ne font pas de Ruby une solution universelle miracle pour tous les nouveaux logiciels. Vous devriez également tenir compte des caractéristiques suivantes du langage avant de prendre une décision :

  • À mesure que leur taille augmente, les applications développées avec Ruby deviennent plus lentes, ce qui pose des problèmes d'évolutivité.
  • Son domaine de prédilection est celui des applications web. Il n'est donc pas bien adapté aux applications de bureau ou mobiles.
  • Comme il utilise un interpréteur, un code orienté objet sera potentiellement plus lent.

Créer votre propre scraper web

Nous pouvons maintenant aborder l'extraction de données. Tout d'abord, nous avons besoin d'un site web fournissant des informations utiles.

Étape 1 : Configurer l'environnement

Pour créer notre scraper web Ruby, nous devons d'abord nous assurer que nous disposons de tous les prérequis :

  • La dernière version stable de Ruby : consultez le guide d'installation officiel pour choisir la méthode la mieux adaptée à votre système d'exploitation.
  • Un IDE : dans ce guide, nous utiliserons Visual Studio Code, car il est léger et ne nécessite aucune configuration supplémentaire, mais vous pouvez choisir l'IDE de votre choix.
  • Bundler : un outil Ruby de gestion des dépendances (également appelé gem) ;
  • Watir : un gem basé sur Selenium utilisé pour les tests automatisés, car il permet d'imiter le comportement d'un utilisateur sur un navigateur ;
  • Webdrivers : un gem recommandé par Watir qui télécharge automatiquement le dernier pilote pour une instance de navigateur ;
  • Nokogiri : un gem bien connu pour sa capacité à faciliter l'analyse des pages web. Il peut analyser le HTML et le XML, détecter les documents HTML corrompus et offre un accès aux éléments via des sélecteurs XPath et CSS3.

Après avoir configuré l'environnement Ruby, créez un nouveau répertoire n'importe où sur votre ordinateur et ouvrez-le avec l'IDE de votre choix. Exécutez ensuite la commande suivante dans une fenêtre de terminal pour installer notre premier gem :

> gem install bundler

Créez maintenant un fichier nommé Gemfile dans le répertoire racine de votre projet. Nous allons y ajouter le reste des gemmes en tant que dépendances :

source 'https://rubygems.org'

gem 'watir', '~> 6.19', '>= 6.19.1'
gem 'webdrivers', '~> 4.6'
gem 'nokogiri', '~> 1.11', '>= 1.11.7'

Revenez maintenant à la fenêtre de terminal et exécutez la commande suivante pour installer les gems que nous avons déclarées :

> bundle install

Super installation ! Pour finir, créez simplement un fichier « scraper.rb » pour contenir le code de notre scraper web. Tout ce que nous écrivons ici, nous pouvons l'exécuter avec la commande :

> ruby scraper.rb

Étape 2 : Inspectez la page que vous souhaitez scraper

Parfait, continuons ! Accédez à la page que vous souhaitez scraper, cliquez avec le bouton droit n'importe où dessus, puis sélectionnez « Inspecter l'élément ». La console de développement s'ouvrira, et vous devriez y voir le code HTML du site web.

Étape 3 : Envoyer une requête HTTP et extraire le code HTML

Maintenant, pour récupérer ce code HTML sur notre machine locale, nous devons envoyer une requête HTTP à l’aide de Watir afin de récupérer le document. Retournons dans l’IDE et traduisons cette idée en code.

Commencez par écrire les importations nécessaires :

require 'watir'
require 'webdrivers'
require 'nokogiri'

Ensuite, nous initialisons une instance de navigateur et accédons au site web que nous voulons extraire. Nous accédons ensuite au code HTML et le transmettons au constructeur Nokogiri, qui nous aidera à analyser le résultat.

browser = Watir::Browser.new
browser.goto 'https://blog.eatthismuch.com/latest-articles/'
parsed_page = Nokogiri::HTML(browser.html)

File.open("parsed.txt", "w") { |f| f.write "#{parsed_page}" }

browser.close

Nous avons également enregistré le résultat dans un fichier texte nommé « parsed.txt » afin de pouvoir examiner le code HTML. Il est important de fermer la connexion après avoir reçu la réponse, car le processus continuera à s’exécuter.

Étape 4 : Extraction de sections spécifiques

Nous disposons donc d’un document HTML, mais nous voulons des données, ce qui signifie que nous devons analyser la réponse précédente pour obtenir des informations lisibles par l’homme.

Commençons par de petits pas : extrayons le titre du site web. Une caractéristique remarquable de Ruby est que tout est un objet, à quelques exceptions près, ce qui signifie que même une simple chaîne de caractères peut avoir des attributs et des méthodes.

Nous pouvons donc simplement accéder à la valeur du titre du site web via les attributs de l'objet parsed_page.

puts parsed_page.title

Passons à l'étape suivante : extrayons tous les liens du site web. Pour cela, nous allons utiliser une méthode plus générique qui analyse des balises spécifiques, la méthode css.

links = parsed_page.css('a')
links.map {|element| element["href"]}

puts links

Nous utilisons également la méthode map pour ne conserver que les liens dotés d'un attribut href dans le code HTML.

Prenons un exemple plus concret. Nous devons extraire les articles du blog, leur titre, leur adresse et leur méta-description.

Si vous inspectez l’une des fiches d’article, vous pouvez voir que nous pouvons obtenir l’adresse et le titre de l’article grâce aux attributs du lien. De plus, la méta-description se trouve sous une balise <div> avec un nom de classe spécifique.

Bien sûr, il existe de nombreuses façons d’effectuer cette recherche. Celle que nous allons utiliser consistera à rechercher toutes les balises <div> ayant le nom de classe td_module_10, puis à parcourir chacune d’entre elles pour extraire les balises <a> et les balises internes ayant le nom de classe td-excerpt.

article_cards = parsed_page.xpath("//div[contains(@class, 'td_module_10')]")

article_cards.each do |card|
    title = card.xpath("div[@class='td-module-thumb']/a/@title")
    link = card.xpath("div[@class='td-module-thumb']/a/@href")
    meta = card.xpath("div[@class='item-details']/div[@class='td-excerpt']")
end

Oui, comme vous l'avez peut-être déjà deviné, c'est une expression XPath qui permet d'y parvenir, car nous recherchons des éléments HTML par leurs noms de classe et leurs ancêtres.

Étape 5 : Exporter les données au format CSV

Ce type d'extraction peut s'avérer utile lorsque les données doivent être transmises à une autre application, un agrégateur d'articles dans notre cas. Pour ce faire, nous devons donc exporter les données analysées vers un fichier externe.

Nous allons créer un fichier CSV, car il peut être facilement lu par une autre application et ouvert avec Excel pour un traitement ultérieur. Tout d'abord, encore une seule importation :

require 'csv'

Ensuite, nous allons créer le fichier CSV en mode « append » et intégrer le code précédent. Notre scraper ressemblera désormais à ceci :

CSV.open("articles.csv", "a+") do |csv|
    csv << ["title", "link", "meta"]

    article_cards = parsed_page.xpath("//div[contains(@class, 'td_module_10')]")
    article_cards.each do |card|

        title = card.xpath("div[@class='td-module-thumb']/a/@title")
        link = card.xpath("div[@class='td-module-thumb']/a/@href")
        meta = card.xpath("div[@class='item-details']/div[@class='td-excerpt']")

        csv << [title.first.value, link.first.value, meta.first.text.strip]
    end
end

Super, c'est tout ! Nous pouvons désormais voir toutes les données analysées sous une forme claire, intuitive et facile à transmettre.

Conclusion et alternatives

Nous avons maintenant terminé notre tutoriel. Félicitations ! Nous espérons que cet article vous a fourni de nombreuses informations sur le web scraping et vous a aidé à mieux le comprendre.

Il est évident que cette technologie peut faire bien plus qu'alimenter des agrégateurs d'articles. La clé est de trouver les bonnes données et de les analyser pour découvrir de nouvelles possibilités.

Cependant, comme je l'ai indiqué au début de l'article, les scrapers Web sont confrontés à de nombreux défis. En plus de dynamiser votre activité, c'est une excellente opportunité d'apprentissage pour les développeurs qui peuvent résoudre des problèmes en utilisant leurs propres scrapers Web. Néanmoins, vous souhaiterez peut-être réduire les coûts si vous devez mener à bien un projet (temps, argent, personnel).

Une API dédiée à la résolution de ces problèmes sera toujours plus facile à utiliser. Même en présence d'obstacles tels que le rendu Javascript, les proxys, les CAPTCHA et d'autres facteurs de blocage, WebScrapingAPI les surmonte tous et offre une expérience personnalisable. Si vous hésitez encore, pourquoi ne pas essayer l'option d'essai gratuit ?

À propos de l'auteur
Raluca Penciuc, Développeur full-stack @ WebScrapingAPI
Raluca PenciucDéveloppeur full-stack

Raluca Penciuc est développeuse Full Stack chez WebScrapingAPI ; elle conçoit des robots de collecte de données, améliore les techniques de contournement et recherche des moyens fiables de réduire le risque de détection sur les sites cibles.

Commencez à créer

Prêt à faire évoluer votre système de collecte de données ?

Rejoignez plus de 2 000 entreprises qui utilisent WebScrapingAPI pour extraire des données Web à l'échelle de l'entreprise, sans aucun coût d'infrastructure.