Python et JavaScript dominent l’ensemble de l’industrie du scraping. Si vous avez besoin de performances ou de portabilité, Scala offre une alternative solide. Scala nous offre une base compilée, portable et fortement typée pour travailler.
Aujourd’hui, nous allons voir comment faire du scraping en utilisant Scala et jsoup. Bien qu’il ne soit pas écrit aussi souvent que le web scraping avec Python, Scala fournit une base solide et des outils de scraping décents.
Pourquoi Scala ?
Il y a plusieurs raisons de choisir Scala plutôt que Python ou JavaScript.
- Performance: Scala est compilé dans la JVM (Java Virtual Machine). Les compilateurs traduisent notre code en bytecode exécutable par la machine. Il est donc intrinsèquement plus rapide que Python.
- Typage statique: Le contrôle de type offre une couche supplémentaire de sécurité. De nombreux bogues courants sont détectés avant même que le programme ne s’exécute.
- Portabilité: Scala est compilé en bytecode JVM (Java Virtual Machine). Le bytecode JVM peut être exécuté partout où Java est installé.
- Entièrement compatible avec Java: Vous pouvez utiliser des dépendances Java dans votre code Scala. Cela élargit considérablement l’écosystème dont vous disposez.
Pour commencer
Avant de commencer, vous devez vous assurer que Scala est installé. Vous trouverez ci-dessous des instructions pour Ubuntu, macOS et Windows.
Vous pouvez consulter la documentation complète sur l’installation ici.
Ubuntu
curl -fL https://github.com/coursier/coursier/releases/latest/download/cs-x86_64-pc-linux.gz | gzip -d > cs && chmod +x cs && ./cs setup
macOS
brew install coursier && coursier setup
Fenêtres
Télécharger le programme d’installation de Scala pour Windows.
Création d’un grattoir
Créez un nouveau dossier de projet et accédez-y à l’aide d’un cédérom
.
mkdir quote-scraper
cd quote-scraper
Initialiser un nouveau projet Scala. La commande convertit notre nouveau dossier en projet Scala et crée un fichier build.sbt
pour contenir nos dépendances.
sbt new scala/scala3.g8
Maintenant, ouvrez le fichier build.sbt.
Vous devrez ajouter jsoup comme dépendance. Votre fichier de compilation complet devrait ressembler à ceci.
val scala3Version = "3.6.3"
lazy val root = project
.in(file("."))
.settings(
name := "quote-scraper",
version := "0.1.0-SNAPSHOT",
scalaVersion := scala3Version,
libraryDependencies += "org.scalameta" %% "munit" % "1.0.0" % Test,
libraryDependencies += "org.jsoup" % "jsoup" % "1.18.3"
)
Ensuite, copiez et collez le code ci-dessous dans votre fichier Main.scala.
import org.jsoup.Jsoup
import scala.jdk.CollectionConverters._
@main def QuotesScraper(): Unit =
val url = "http://quotes.toscrape.com"
try
val document = Jsoup.connect(url).get()
//find all objects on the page with the quote class
val quotes = document.select(".quote")
for quote <- quotes.asScala do
//find the first object with the class "text" and return its text
val text = quote.select(".text").text()
//find the first object with the class "author" and return its text
val author = quote.select(".author").text()
println(s"Quote: $text")
println(s"Author: $author")
println("-" * 50)
catch case e: Exception => println(s"Error: ${e.getMessage}")
Utilisation du grattoir
Pour lancer notre scraper, exécutez la commande suivante à partir de la racine du projet.
sbt run
Vous devriez obtenir un résultat similaire à celui ci-dessous.
Quote: “The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”
Author: Albert Einstein
--------------------------------------------------
Quote: “It is our choices, Harry, that show what we truly are, far more than our abilities.”
Author: J.K. Rowling
--------------------------------------------------
Quote: “There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”
Author: Albert Einstein
--------------------------------------------------
Quote: “The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”
Author: Jane Austen
--------------------------------------------------
Quote: “Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”
Author: Marilyn Monroe
--------------------------------------------------
Quote: “Try not to become a man of success. Rather become a man of value.”
Author: Albert Einstein
--------------------------------------------------
Quote: “It is better to be hated for what you are than to be loved for what you are not.”
Author: André Gide
--------------------------------------------------
Quote: “I have not failed. I've just found 10,000 ways that won't work.”
Author: Thomas A. Edison
--------------------------------------------------
Quote: “A woman is like a tea bag; you never know how strong it is until it's in hot water.”
Author: Eleanor Roosevelt
--------------------------------------------------
Quote: “A day without sunshine is like, you know, night.”
Author: Steve Martin
--------------------------------------------------
[success] Total time: 6 s, completed Feb 18, 2025, 8:58:04 PM
Sélection avec jsoup
Pour trouver des éléments de page avec jsoup, nous utilisons la méthode select()
. select()
renvoie une liste de tous les éléments correspondant à notre sélecteur. Voyons comment cela fonctionne dans notre projet Quote Scraper.
Dans cette ligne, nous utilisons document.select(".quote")
pour renvoyer tous les éléments de la page ayant la classe
quote
.
val quotes = document.select(".quote")
Nous pourrions également écrire ces sélecteurs avec plus de structure : element[attribute='some value'].
Cela nous permet d’appliquer des filtres plus puissants lors de la recherche d’objets sur la page.
La ligne ci-dessous renverrait toujours les mêmes objets de page, mais elle est beaucoup plus expressive.
val quotes = document.select("div[class='quote']")
Examinons quelques autres exemples de select()
dans notre code. Étant donné qu’il n’y a qu’un seul élément de texte
et un seul auteur
dans chaque citation, select()
ne renvoie qu’un seul objet de texte et un seul auteur. Si notre élément de citation contenait plusieurs textes ou auteurs, il renverrait tous les textes et auteurs pour chaque citation.
//find objects with the class "text" and return their text
val text = quote.select(".text").text()
//find objects with the class "author" and return their text
val author = quote.select(".author").text()
Extraction avec jsoup
Pour extraire des données avec jsoup, nous pouvons utiliser les méthodes suivantes :
text()
: Extrait le texte d’une liste d’éléments de la page. Lorsque vous récupérez des prix sur un site web, ils apparaissent sur la page sous forme de texte.attr()
: Extrait un attribut spécifique d’un seul élément de la page. Il s’agit d’éléments de données situés dans les balises HTML. Cette méthode est couramment utilisée pour extraire des liens d’un site web.
texte()
Nous en avons vu des exemples avec notre premier scraper. text()
renvoie le texte de tous les éléments sur lesquels il est appelé. Si l’exemple ci-dessous consistait à trouver deux auteurs, text()
extrairait leurs deux textes et les combinerait en une seule chaîne.
//find objects with the class "text" and return their text
val text = quote.select(".text").text()
//find objects with the class "author" and return their text
val author = quote.select(".author").text()
attr()
La méthode attr()
se comporte différemment de text()
. Cette méthode extrait un seul attribut d’un seul élément de la page.
//find link elements with the class "tag" and extract the "href" from the first one
val firstTagLink = quote.select("a[class='tag']").attr("href")
Avec cette ligne ajoutée, notre résultat ressemble maintenant à ceci.
Quote: “The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”
Author: Albert Einstein
First Tag Link: /tag/change/page/1/
--------------------------------------------------
Quote: “It is our choices, Harry, that show what we truly are, far more than our abilities.”
Author: J.K. Rowling
First Tag Link: /tag/abilities/page/1/
--------------------------------------------------
Quote: “There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”
Author: Albert Einstein
First Tag Link: /tag/inspirational/page/1/
--------------------------------------------------
Quote: “The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”
Author: Jane Austen
First Tag Link: /tag/aliteracy/page/1/
--------------------------------------------------
Quote: “Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”
Author: Marilyn Monroe
First Tag Link: /tag/be-yourself/page/1/
--------------------------------------------------
Quote: “Try not to become a man of success. Rather become a man of value.”
Author: Albert Einstein
First Tag Link: /tag/adulthood/page/1/
--------------------------------------------------
Quote: “It is better to be hated for what you are than to be loved for what you are not.”
Author: André Gide
First Tag Link: /tag/life/page/1/
--------------------------------------------------
Quote: “I have not failed. I've just found 10,000 ways that won't work.”
Author: Thomas A. Edison
First Tag Link: /tag/edison/page/1/
--------------------------------------------------
Quote: “A woman is like a tea bag; you never know how strong it is until it's in hot water.”
Author: Eleanor Roosevelt
First Tag Link: /tag/misattributed-eleanor-roosevelt/page/1/
--------------------------------------------------
Quote: “A day without sunshine is like, you know, night.”
Author: Steve Martin
First Tag Link: /tag/humor/page/1/
--------------------------------------------------
[success] Total time: 3 s, completed Feb 18, 2025, 10:29:30 PM
Outils alternatifs de récupération de données sur le Web
- Navigateur de récupération: Un navigateur à distance entièrement intégré avec des proxys que vous pouvez utiliser à partir de Playwright et de Selenium.
- API de scraper Web: Automatisez votre processus de scraping en appelant l’une de nos API. Lorsque vous appelez une API de scraper, nous scrapons un site et vous renvoyons les données.
- Pas de Code Scraper: Indiquez-nous le site que vous souhaitez récupérer et les données que vous voulez obtenir. Nous nous occupons du reste.
- Jeux de données: Nos ensembles de données sont peut-être les plus faciles à utiliser de toutes les méthodes d’extraction. Nous récupérons des centaines de sites et mettons nos bases de données à jour en permanence. Les jeux de données vous fournissent un ensemble de données propres, prêtes à être analysées.
Conclusion
Le scraping web est assez intuitif avec Scala. Vous avez appris à sélectionner des éléments de page et à extraire leurs données à l’aide de jsoup. Si le scraping n’est pas votre truc, vous pouvez toujours utiliser l’un de nos outils automatisés pour guider le processus ou sauter complètement le processus de scraping grâce à nos jeux de données prêts à l’emploi.
Inscrivez-vous maintenant et commencez votre essai gratuit dès aujourd’hui !
Aucune carte de crédit requise