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

Le guide complet du web scraping avec Java

Le guide complet du web scraping avec Java

Contrairement à la mentalité du XXe siècle selon laquelle « le temps, c'est de l'argent », aujourd'hui, tout tourne autour des données. Au cours de la dernière décennie en particulier, les robots d'extraction de données ont connu un essor fulgurant. Il n'est pas difficile de comprendre pourquoi : Internet regorge d'informations précieuses qui peuvent faire ou défaire une entreprise.

À mesure que les entreprises prennent conscience des avantages de l'extraction de données, de plus en plus de personnes apprennent à créer leur propre scraper. En plus d'offrir un potentiel de croissance pour les entreprises, cela peut également constituer un projet intéressant pour les développeurs souhaitant améliorer leurs compétences en codage.

Si vous faites partie de l'équipe Java, mais que votre travail n'a rien à voir avec le web scraping, vous découvrirez un nouveau créneau où vous pourrez mettre vos compétences à profit. Cet article vous propose un tutoriel étape par étape pour créer un simple scraper web en Java afin d'extraire des données de sites web et de les enregistrer localement au format CSV.

Comprendre le web scraping

Qu'entend-on par web scraping ? De nombreux sites ne fournissent pas leurs données via des API publiques ; les web scrapers extraient donc les données directement depuis le navigateur. Cela s'apparente beaucoup à la copie manuelle de texte, mais s'effectue en un clin d'œil.

Quand on considère qu'une meilleure intelligence économique permet de prendre de meilleures décisions, ce processus est plus précieux qu'il n'y paraît à première vue. Les sites web produisent de plus en plus de contenu, il n'est donc plus conseillé d'effectuer cette opération entièrement à la main.

Vous vous demandez peut-être : « Que vais-je faire de ces données ? ». Eh bien, voyons quelques cas d'utilisation où le web scraping peut vraiment s'avérer utile :

  • Génération de prospects : une entreprise en activité a besoin de générer des prospects pour trouver des clients.
  • Veille tarifaire : la décision d'une entreprise concernant la tarification et la commercialisation de ses produits s'appuie sur les prix pratiqués par ses concurrents.
  • Apprentissage automatique : pour que les solutions basées sur l'IA fonctionnent correctement, les développeurs doivent fournir des données d'entraînement.

Des descriptions détaillées et d'autres cas d'utilisation sont disponibles dans cet article bien rédigé qui traite de l'intérêt du web scraping.

Même si vous comprenez comment fonctionne le web scraping et comment il peut améliorer l'efficacité de votre entreprise, créer un scraper n'est pas si simple. Les sites web disposent de nombreux moyens pour identifier et empêcher les bots d'accéder à leurs données.

En voici quelques exemples :

  • Tests de Turing publics entièrement automatisés (CAPTCHA) : ces problèmes logiques sont relativement faciles à résoudre pour les humains, mais constituent un véritable casse-tête pour les scrapers.
  • Blocage d'IP : si un site web détecte que plusieurs requêtes proviennent de la même adresse IP, il peut bloquer l'accès à ce site ou considérablement ralentir votre connexion.
  • Honeypots : des liens invisibles aux humains mais visibles pour les robots ; une fois que les robots tombent dans le piège, le site web bloque leur adresse IP.
  • Géoblocage : le site web peut géoblocer certains contenus. Par exemple, vous pouvez recevoir des informations spécifiques à une région lorsque vous demandez des informations provenant d'une autre zone (par exemple, les prix des billets d'avion).

Surmonter tous ces obstacles n'est pas une mince affaire. En effet, s'il n'est pas trop difficile de créer un bot correct, il est sacrément difficile de concevoir un excellent outil de web scraping. C'est pourquoi les API de web scraping sont devenues l'un des sujets les plus en vogue de la dernière décennie.

WebScrapingAPI collecte le contenu HTML de n'importe quel site web et résout automatiquement les problèmes que j'ai mentionnés plus haut. De plus, nous utilisons Amazon Web Services, ce qui garantit rapidité et évolutivité. Cela vous intéresse ? Commencez votre essai gratuit de WebScrapingAPI, et vous pourrez effectuer 5 000 appels API pendant les 14 premiers jours.

Comprendre le Web

Pour comprendre le Web, vous devez comprendre le protocole de transfert hypertexte (HTTP), qui explique comment un serveur communique avec un client. Un message contient plusieurs éléments d'information qui décrivent le client et la manière dont il traite les données : la méthode, la version HTTP et les en-têtes.

Les scrapers Web utilisent la méthode GET pour les requêtes HTTP, ce qui signifie qu'ils récupèrent des données depuis le serveur. Certaines options avancées incluent également les méthodes POST et PUT. Pour plus de détails, vous pouvez consulter ici une liste détaillée des méthodes HTTP.

Les en-têtes HTTP fournissent plusieurs détails supplémentaires sur les requêtes et les réponses. Vous pouvez consulter la liste complète de ces en-têtes, mais ceux qui sont pertinents pour le web scraping sont les suivants :

  • User-Agent : indique l'application, le système d'exploitation, le logiciel et la version ; les scrapers Web s'appuient sur cet en-tête pour rendre leurs requêtes plus réalistes.
  • Host : le nom de domaine du serveur auquel vous avez accédé.
  • Referrer : contient le site source visité par l'utilisateur ; par conséquent, le contenu affiché peut varier, ce qui doit également être pris en compte.
  • Cookie : conserve des informations confidentielles concernant une requête et le serveur (telles que des jetons d'authentification).
  • Accept : garantit que la réponse du serveur est d'un type spécifique (ex. : text/plain, application/json, etc.).

Comprendre Java

Java, un langage open source orienté objet, est l'un des langages de programmation les plus populaires. Près de deux décennies se sont écoulées depuis notre première rencontre avec Java, et ce langage de programmation est devenu de plus en plus accessible.

De nombreuses modifications apportées à Java visaient à réduire les dépendances liées à l'implémentation du code. C'est pourquoi de nombreux développeurs privilégient ce langage, mais il présente également d'autres avantages :

  • Il est open source ;
  • Il offre une grande variété d'API ;
  • Il est multiplateforme, ce qui lui confère une plus grande polyvalence ;
  • Il dispose d'une documentation détaillée et d'un soutien communautaire fiable.

Créer son propre scraper web

Nous pouvons maintenant aborder l'extraction de données. Tout d'abord, nous avons besoin d'un site web qui fournit des informations utiles. Pour ce tutoriel, nous avons choisi de scraper cette page web qui partage des recettes italiennes.

Étape 1 : Configurer l'environnement

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

  • Java 8 : même si Java 11 est la version la plus récente avec support à long terme (LTS), Java 8 reste la norme de production préférée des développeurs.
  • Gradle : il s'agit d'un outil open source flexible d'automatisation de la construction, doté d'un large éventail de fonctionnalités, notamment la gestion des dépendances (nécessite Java 8 ou une version supérieure) ;
  • Un IDE Java : dans ce guide, nous utiliserons IntelliJ IDEA, car il facilite grandement l'intégration avec Gradle.
  • HtmlUnit : permet de simuler des événements de navigateur tels que les clics et l'envoi de formulaires lors du scraping et prend en charge JavaScript.

Après l'installation, nous devons vérifier si nous avons correctement suivi les guides officiels. Ouvrez un terminal et exécutez les commandes suivantes :

> java -version
> gradle -v

Celles-ci devraient vous indiquer les versions de Java et de Gradle installées sur votre machine :

Si aucune erreur n'apparaît, nous sommes prêts à commencer.

Créons maintenant un projet afin de pouvoir commencer à écrire le code. Heureusement pour nous, JetBrains propose un tutoriel bien rédigé sur la manière de démarrer avec IntelliJ et Gradle, ce qui nous évitera de nous perdre dans les configurations.

Une fois le projet créé, veillez à laisser l'IDE terminer la première compilation, car vous obtiendrez ainsi une arborescence de fichiers générée automatiquement.

Une fois cela fait, ouvrez votre fichier « build.gradle » et ajoutez la ligne suivante dans le bloc « dependencies » :

implementation('net.sourceforge.htmlunit:htmlunit:2.51.0')

Cela installera HtmlUnit dans notre projet. N'oubliez pas de cliquer sur le bouton « Reload » dans la boîte à outils Gradle située à droite afin de faire disparaître tous les avertissements « Not found ».

Étape 2 : Inspectez la page que vous souhaitez extraire

Super, continuons ! Accédez à la page que vous souhaitez extraire, cliquez avec le bouton droit n'importe où dessus, puis sélectionnez « Inspecter l'élément ». La console de développement s'affichera, 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 HtmlUnit, qui renverra le document. Retournons dans l'IDE et traduisons cette idée en code.

Commencez par écrire les importations nécessaires pour utiliser HtmlUnit :

import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.html.*;
import java.io.IOException;
import java.util.List;

Ensuite, nous initialisons un WebClient et envoyons une requête HTTP au site web qui renverra une HtmlPage. Il est important de ne pas oublier de fermer la connexion après avoir reçu la réponse, car le processus continuera à s’exécuter.

WebClient webClient = new WebClient(BrowserVersion.CHROME);

try {
   HtmlPage page = webClient.getPage("https://foodnetwork.co.uk/italian-family-dinners/");

   webClient.getCurrentWindow().getJobManager().removeAllJobs();
   webClient.close();
   recipesFile.close();

} catch (IOException e) {
   System.out.println("An error occurred: " + e);
}

Il convient de mentionner que HtmlUnit affichera une multitude de messages d'erreur dans la console, ce qui vous fera croire que votre PC va exploser. Mais n'ayez crainte, car vous pouvez ignorer 98 % d'entre eux sans risque.

Ils sont principalement causés par HtmlUnit qui tente d'exécuter le code JavaScript depuis le serveur du site web. Cependant, certains d'entre eux peuvent être de véritables erreurs indiquant un problème dans votre code, il est donc préférable d'y prêter attention lorsque vous exécutez votre programme.

Vous pouvez éviter d'afficher une partie de ces erreurs inutiles en configurant certaines options de votre WebClient :

webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setPrintContentOnFailingStatusCode(false);

Étape 4 : Extraire des sections spécifiques

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

Commençons par de petits pas : extrayons le titre du site web. Nous pouvons le faire à l'aide de la méthode intégrée getTitleText :

String title = page.getTitleText();
System.out.println("Page Title: " + title);

Passons à l'étape suivante : extrayons tous les liens du site web. Pour cela, nous disposons des méthodes intégrées getAnchors et getHrefAttribute qui extrairont toutes les balises <a> du code HTML, puis récupéreront la valeur de l'attribut href :

List<HtmlAnchor> links = page.getAnchors();
for (HtmlAnchor link : links) {
   String href = link.getHrefAttribute();
   System.out.println("Link: " + href);
}

Comme vous pouvez le constater, HtmlUnit fournit de nombreuses méthodes intégrées et intuitives qui vous évitent de passer des heures à lire la documentation.

Prenons un exemple plus concret. Nous devons extraire toutes les recettes du site web, plus précisément leur titre et leur adresse.

Si vous examinez l'une des fiches de recette, vous constaterez que toutes les informations dont nous avons besoin se trouvent dans les attributs du lien, ce qui signifie qu'il suffit de rechercher les liens ayant la classe « card-link » et d'extraire leurs attributs.

List<?> anchors = page.getByXPath("//a[@class='card-link']");
for (int i = 0; i < anchors.size(); i++) {
   HtmlAnchor link = (HtmlAnchor) anchors.get(i);
   String recipeTitle = link.getAttribute("title").replace(',', ';');
   String recipeLink = link.getHrefAttribute();
}

Cette fois-ci, nous utilisons une expression XPath pour rechercher des liens à n'importe quel niveau de profondeur dans le document HTML. Ensuite, nous parcourons la liste des résultats et extrayons le titre et l'attribut href de chacun d'entre eux.

É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 de recettes 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 :

import java.io.FileWriter;

Ensuite, nous initialisons notre FileWriter qui créera le fichier CSV en mode « append » :

FileWriter recipesFile = new FileWriter("recipes.csv", true);
recipesFile.write("id,name,link\n");

Une fois le fichier créé, nous écrivons également la première ligne du CSV, qui constituera l'en-tête du tableau. Nous revenons maintenant à la boucle précédente, où nous avons analysé toutes les fiches de recettes, et nous la terminons par la ligne suivante :

recipesFile.write(i + "," + recipeTitle + "," + recipeLink + "\n");

Nous avons terminé l'écriture dans le fichier, il est donc temps de le fermer :

recipesFile.close();

Super, c'est tout ! Nous pouvons désormais consulter toutes les données analysées de manière claire, intuitive et facile à partager.

Conclusion et alternatives

Voilà qui conclut notre tutoriel. J'espère que cet article vous a été utile et vous a permis de mieux comprendre le web scraping.

Comme vous pouvez l'imaginer, cette technologie peut faire bien plus qu'alimenter des agrégateurs de recettes. C'est à vous de trouver les bonnes données et de les analyser pour créer de nouvelles opportunités.

Mais, comme je l’ai dit au début de l’article, les web scrapers doivent faire face à de nombreux défis. Les développeurs peuvent trouver passionnant de résoudre ces problèmes avec leur propre web scraper, car c’est une excellente expérience d’apprentissage et très amusant. Cependant, si vous avez un projet à mener à bien, vous voudrez peut-être éviter les coûts associés à cela (temps, argent, personnel).

Il sera toujours plus facile de résoudre ces problèmes avec une API dédiée. Malgré tous les obstacles potentiels tels que le rendu Javascript, les proxys, les CAPTCHA, etc., WebScrapingAPI les surmonte tous et offre une expérience personnalisable. Il existe également une option d'essai gratuit, alors si vous n'êtes pas encore tout à fait sûr, pourquoi ne pas l'essayer ?

À 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.