Le guide complet du Web Scraping avec Java
Raluca Penciuc le 08 Jul 2021
Contrairement à la mentalité du 20e siècle selon laquelle "le temps, c'est de l'argent", aujourd'hui, tout tourne autour des données. C'est surtout au cours de la dernière décennie que les racleurs de sites web sont devenus extrêmement populaires. Il n'est pas difficile de comprendre pourquoi : l'internet regorge d'informations précieuses qui peuvent faire le succès ou l'échec d'une entreprise.
Alors que les entreprises prennent conscience des avantages de l'extraction de données, de plus en plus de personnes apprennent à construire leur propre scraper. Outre le fait qu'il peut stimuler les affaires, ce projet peut également permettre aux développeurs d'améliorer leurs compétences en matière de codage.
Si vous faites partie de l'équipe Java, mais que votre travail n'a rien à voir avec le web scraping, vous découvrirez une nouvelle niche où vous pourrez mettre vos compétences à profit. L'article fournit un tutoriel étape par étape sur la création d'un simple scraper web utilisant Java pour extraire des données de sites web et les sauvegarder localement au format CSV.
Comprendre le web scraping
Qu'est-ce que le web scraping ? De nombreux sites ne fournissent pas leurs données dans le cadre d'API publiques, de sorte que les web scrapers extraient des données directement à partir du navigateur. C'est un peu comme si une personne copiait du texte manuellement, mais cela se fait en un clin d'œil.
Si l'on considère qu'une meilleure intelligence économique est synonyme 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, si bien qu'il n'est plus conseillé de faire cette opération entièrement à la main.
Vous vous demandez peut-être : "Que vais-je faire de ces données ?". Voyons quelques cas d'utilisation où le web scraping peut s'avérer très utile :
- Génération de leads: une activité permanente nécessite la génération de leads pour trouver des clients.
- Renseignements sur les prix: la décision d'une entreprise de fixer le prix de ses produits et de les commercialiser sera influencée par les prix pratiqués par les concurrents.
- Apprentissage automatique: pour que les solutions alimentées par 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 écrit qui parle de la valeur du web scraping.
Même si vous comprenez comment fonctionne le web scraping et comment il peut accroître l'efficacité de votre entreprise, la création d'un scraper n'est pas si simple. Les sites web disposent de nombreux moyens pour identifier et empêcher les robots d'accéder à leurs données.
Voici quelques exemples :
- Tests de Turing publics entièrement automatisés (CAPTCHA) : Ces problèmes logiques sont raisonnablement faciles à résoudre pour les personnes, mais constituent une véritable plaie pour les "scrapers".
- Blocage d'IP: si un site web détermine que plusieurs requêtes proviennent de la même adresse IP, il peut bloquer l'accès à ce site web ou vous ralentir considérablement.
- Honeypots: liens invisibles qui sont visibles pour les robots mais invisibles pour les humains ; une fois que les robots sont tombés dans le piège, le site web bloque leur adresse IP.
- Géo-blocage: le site web peut géo-bloquer certains contenus. Par exemple, vous pouvez recevoir des informations spécifiques à une région lorsque vous avez demandé des informations sur une autre région (par exemple, les prix des billets d'avion).
Faire face à tous ces obstacles n'est pas une mince affaire. En fait, s'il n'est pas trop difficile de créer un robot correct, il est extrêmement difficile de créer un excellent scraper web. C'est pourquoi les API pour le web scraping sont devenues l'un des sujets les plus brûlants de la dernière décennie.
WebScrapingAPI collecte le contenu HTML de n'importe quel site web et prend automatiquement en charge les problèmes que j'ai mentionnés précédemment. En outre, nous utilisons les services Web d'Amazon, ce qui garantit la rapidité et l'évolutivité. Cela vous intéresse ? Commencez votre essai gratuit de WebScrapingAPI, et vous pourrez effectuer 5000 appels API pendant les 14 premiers jours.
Comprendre le Web
Pour comprendre le Web, il faut 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 scrappeurs Web utilisent la méthode GET pour les requêtes HTTP, ce qui signifie qu'ils récupèrent les données du 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.
Plusieurs détails supplémentaires concernant les demandes et les réponses peuvent être trouvés dans les en-têtes HTTP. 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 racleurs de sites web s'appuient sur cet en-tête pour rendre leurs demandes plus réalistes.
- Hôte: le nom de domaine du serveur auquel vous avez accédé.
- Referrer: contient le site source que l'utilisateur a visité ; en conséquence, le contenu affiché peut être différent, il faut donc tenir compte de ce fait également.
- Cookie: conserve des informations confidentielles sur une requête et le serveur (comme les 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 est un langage orienté objet à code source ouvert, ce qui en fait l'un des langages de programmation les plus populaires. Près de vingt ans se sont écoulés depuis notre première rencontre avec Java, et le langage de programmation est devenu de plus en plus accessible.
Une grande partie des changements apportés à Java ont eu pour but de réduire les dépendances liées à l'implémentation du code. C'est pourquoi de nombreux développeurs privilégient ce langage, qui présente également d'autres avantages :
- Il s'agit d'un logiciel libre ;
- Il fournit une 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'une assistance communautaire fiable.
Fabriquer son propre scraper web
Nous pouvons maintenant commencer à parler de l'extraction des données. Tout d'abord, nous avons besoin d'un site web qui fournit des informations utiles. Pour ce tutoriel, nous avons choisi de récupérer cette page web qui partage des recettes italiennes.
Étape 1 : Mise en place de l'environnement
Pour construire 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 un support à long terme (LTS), Java 8 reste la norme de production préférée des développeurs.
- Gradle: est un outil d'automatisation de la construction flexible et open-source avec un large éventail de fonctionnalités, y compris la gestion des dépendances (nécessite Java 8 ou plus) ;
- Un IDE Java : dans ce guide, nous utiliserons IntelliJ IDEA, car il rend l'intégration avec Gradle assez simple.
- HtmlUnit: peut simuler les événements du navigateur tels que le clic et la soumission de formulaires lors du scraping et prend en charge JavaScript.
Après l'installation, nous devons vérifier si nous avons suivi les guides officiels correctement. Ouvrez un terminal et exécutez les commandes suivantes :
> java -version
> gradle -v
Ceux-ci devraient vous indiquer les versions de Java et de Gradle qui sont installées sur votre machine :


S'il n'y a pas d'erreur qui s'affiche, nous sommes prêts à partir.
Créons maintenant un projet afin de pouvoir commencer à écrire le code. Heureusement pour nous, JetBrains propose un tutoriel bien écrit sur la façon de démarrer avec IntelliJ et Gradle, afin que nous ne nous perdions pas dans les configurations.
Assurez-vous qu'une fois le projet créé, laissez l'IDE terminer la première construction, car vous aurez une arborescence de fichiers générée automatiquement.
Une fois que c'est 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 de droite afin de vous débarrasser de tous les avertissements "Not found".

Étape 2 : Inspecter la page que vous souhaitez récupérer
Cool, passons à autre chose ! Naviguez jusqu'à la page que vous voulez récupérer et faites un clic droit n'importe où sur celle-ci, puis cliquez sur "Inspecter l'élément". La console du développeur va s'ouvrir, où vous devriez voir le HTML du site web.

Étape 3 : Envoyer une requête HTTP et récupérer le code HTML
Maintenant, pour obtenir ce HTML sur notre machine locale, nous devons envoyer une requête HTTP en utilisant HtmlUnit, qui retournera le document. Revenons à l'IDE, et mettons cette idée en code.
Tout d'abord, écrivez les importations dont nous avons besoin 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 page Html. 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 va envoyer un tas de messages d'erreur dans la console qui vous feront penser que votre PC va exploser. N'ayez crainte, vous pouvez ignorer 98% d'entre eux.
Elles sont principalement causées par HtmlUnit qui tente d'exécuter le code Javascript depuis le serveur du site web. Cependant, certaines d'entre elles peuvent être des erreurs réelles qui montrent 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 : Extraction de 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 en informations lisibles par l'homme.
Commençons par les 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) ;
Moving forward, let’s extract all the links from the website. For this, we have the built-in getAnchors and getHrefAttribute methods that will extract all the <a> tags from the HTML and then will retrieve the value of the href attribute:
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 auto-explicatives qui vous épargnent des heures de lecture de la documentation.
Prenons un exemple plus réaliste. Nous devons extraire toutes les recettes du site web, leur titre et leur adresse plus précisément.

Si vous inspectez l'une des cartes de recettes, 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 qui ont la classe "lien-carte" et d'obtenir 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, nous utilisons une expression XPath pour rechercher des liens à n'importe quel niveau du document HTML. Nous parcourons ensuite 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 être utile lorsque les données doivent être transmises à une autre application, un agrégateur de recettes dans notre cas. Pour ce faire, nous devons 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, une dernière importation :
import java.io.FileWriter ;
Ensuite, nous initialisons notre FileWriter qui créera le CSV en mode "append" :
FileWriter recipesFile = new FileWriter("recipes.csv", true) ;
recipesFile.write("id,name,link\n") ;
Après la création, nous écrivons également la première ligne du CSV qui sera l'en-tête de la table. Nous revenons maintenant à la boucle précédente, où nous avons analysé toutes les fiches de recettes, et nous terminons par la ligne suivante :
recipesFile.write(i + "," + recipeTitle + "," + recipeLink + "\n") ;
Nous avons fini d'écrire dans le fichier, il est donc temps de le fermer :
recipeFile.close() ;
Cool, c'est tout ! Nous pouvons maintenant voir toutes les données analysées d'une manière propre, non effrayante et facile à comprendre.

Conclusion et alternatives
Voilà qui conclut notre tutoriel. J'espère que cet article a été instructif et qu'il vous a permis de mieux comprendre le web scraping.
Comme vous pouvez l'imaginer, cette technologie peut faire beaucoup plus que les agrégateurs de recettes de carburant. À 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, il y a de nombreux défis auxquels les scrapeurs web doivent faire face. Les développeurs peuvent trouver passionnant de résoudre ces problèmes avec leur propre scraper web, car c'est une grande expérience d'apprentissage et beaucoup de plaisir. Cependant, si vous avez un projet à terminer, vous voudrez peut-être éviter les coûts associés (temps, argent, personnel).
Il sera toujours plus facile de résoudre ces problèmes avec une API dédiée. Malgré tous les points de blocage possibles tels que le rendu Javascript, les proxies, les CAPTHA, etc., WebScrapingAPI les surmonte tous et fournit une expérience personnalisable. Il existe également une option d'essai gratuit, donc si vous n'êtes pas encore sûr, pourquoi ne pas essayer ?
Nouvelles et mises à jour
Restez au courant des derniers guides et nouvelles sur le web scraping en vous inscrivant à notre lettre d'information.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Articles connexes

Explorez les complexités du scraping des données de produits Amazon avec notre guide approfondi. Des meilleures pratiques aux outils tels que l'API Amazon Scraper, en passant par les considérations juridiques, apprenez à relever les défis, à contourner les CAPTCHA et à extraire efficacement des informations précieuses.


Explorez le pouvoir de transformation du web scraping dans le secteur financier. Des données sur les produits à l'analyse des sentiments, ce guide donne un aperçu des différents types de données web disponibles pour les décisions d'investissement.


Découvrez comment extraire et organiser efficacement des données pour le web scraping et l'analyse de données grâce à l'analyse de données, aux bibliothèques d'analyse HTML et aux métadonnées schema.org.
