Web scraping
Le web scraping est une méthode qui permet de récupérer des données d’un site internet. Cette technique analyse le code HTML des pages web pour en extraire les éléments utiles. Les données collectées par le web scraping sont riches et exploitables à des fins variées. Par exemple, Google utilise le web scraping pour indexer les sites web et retourner les résultats les plus pertinents d’une recherche. Les comparateurs de prix ont par ce biais accès aux tarifs actualisés des produits. De même l’intelligence artificielle utilise le web scraping pour entraîner ses modèles sur différents types de textes…
De par sa nature qui consiste à extraire les données issues du travail d’autrui, le web scraping se situe dans une zone particulièrement grise, et de nombreux conflits concernant le droit d’auteur existent. Il est donc essentiel avant de faire du scraping d’un site de s’assurer que le scraping est toléré par le webmaster de ce site.
Scraping d’une page web par requête
Faire du web scraping par requête consiste à lancer une requête http à l’url choisie et décomposer le contenu HTML retourné. (C’est ce que fait entre autres un navigateur web comme chrome en interne). Une page web est composée de balises html. Le scraping consiste donc à extraire de ces balises le texte que l’on souhaite. Par exemple dans ce bloc html nous voulons extraire le titre de l’article et son prix.
<article class="article-1">
<h1>Veste en cuir</h1>
<p>Prix: <span class="prix">30</span></p>
</article>
L’outil de scraping devra chercher la première balise article qui a pour classe article-1 et à l’intérieur de celle-ci:
- le titre: le contenu de la balise h1
- le prix: le contenu du span qui a pour classe prix
Limites du web scraping par requête sur des sites dynamiques
Dans les sites modernes qui utilisent intensivement des frameworks javascript tels que react, vue.js etc. Les balises HTML sont générées dynamiquement par javascript. Or lors du scraping le code javascript n’est pas executé, et le contenu HTML est en premier lieu incomplet. Voici un exemple de page HTML retournée sur une application en javascript avec vue.js.
<script>
new Vue({
el: '#app'
...
</script>
<div id="app">
</div>
Ici toute la génération du contenu est cédée au framework vue.js: ce dernier va initialiser une application dynamique dans le div app, et se chargera de construire la balise article avec le titre, le prix etc.
Toujours-est-il qu’avec seulement le contenu html précédent notre outil de scraping ne peut pas trouver le prix de notre article… Pour combler cela il existe des scrapers plus sophistiqués qui interprètent le javascript ou qui tout simplement lance un navigateur.
Scraping via émulation d’un navigateur
La manière la plus directe pour faire du scraping est tout simplement de lancer un navigateur comme chrome et de récupérer les informations sur la page via javascript. Dans le cas des sites dynamiques si le contenu n’est pas présent au démarrage il suffit de dire au navigateur d’attendre. Des frameworks tels que Selenium permettent de réaliser cela.
let article = await driver.wait(until.elementLocated(By.className('article-1')),10000);
Ce code Selenium dit à notre navigateur (driver) d’attendre jusqu’à ce que l’élément HTML qui a pour class article-1 soit définie! Ensuite une fois que nous avons l’élément article-1 il sera aisé de récupérer le titre et le prix.
Bien qu’il soit plus facile de faire du scraping avec un navigateur, le lancement d’un navigateur est coûteux en performance ce qui nuit à la scalabilité de cette solution. A l’inverse d’une requête http qui est bien plus légère…
En résumé le domaine du web scraping à grande échelle est un domaine complexe et demande une véritable expertise.