Si vous vous intéressez au scraping web, Crawlee peut vous aider. C’est un moteur de scraping rapide et interactif utilisé par les data scientists, les développeurs et les chercheurs pour collecter des données web. Crawlee est facile à configurer et offre des fonctionnalités telles que la rotation de proxy et la gestion de session. Ces fonctionnalités sont essentielles pour scraper des sites web volumineux ou dynamiques sans que votre adresse IP soit bloquée, garantissant une collecte de données fluide et ininterrompue.
Dans ce tutoriel, vous apprendrez à utiliser Crawlee pour le scraping web. Vous commencerez par un exemple basique et progresserez vers des concepts plus avancés, tels que la gestion de session et le scraping de pages dynamiques.
Comment faire du Scraping Web avec Crawlee
Avant de commencer ce tutoriel, assurez-vous que les prérequis suivants sont installés sur votre machine :
- Node.js
- npm
- Visual Studio Code
Scraping Web de base avec Crawlee
Une fois tous vos prérequis en place, commençons par scraper le site Books to Scrape, qui est idéal pour l’apprentissage car il offre une structure HTML simple.
Ouvrez votre terminal ou shell et commencez par initialiser un projet Node.js avec les commandes suivantes :
mkdir crawlee-tutorial
cd crawlee-tutorial
npm init -y
Ensuite, installez la bibliothèque Crawlee avec la commande suivante :
npm install crawlee
Pour scraper efficacement des données d’un site web, vous devez inspecter la page web que vous souhaitez scraper afin d’obtenir les détails des balises HTML du site. Pour ce faire, ouvrez le site dans votre navigateur et accédez aux Outils de développement en faisant un clic droit n’importe où sur la page web. Cliquez ensuite sur Inspecter ou Inspecter l’élément :

L’onglet Éléments devrait être actif par défaut et représente la structure HTML de la page web. Dans cet exemple, chaque livre affiché est placé dans une balise HTML article avec la classe product_pod. Au sein de chaque article, le titre du livre est contenu dans une balise h3. Le titre réel du livre est contenu dans l’attribut title de la balise a située dans l’élément h3. Le prix du livre est situé dans la balise p avec la classe price_color :

Dans le répertoire racine de votre projet, créez un fichier nommé scrape.js et ajoutez le code suivant :
const { CheerioCrawler } = require('crawlee');
const crawler = new CheerioCrawler({
async requestHandler({ request, $ }) {
const books = [];
$('article.product_pod').each((index, element) => {
const title = $(element).find('h3 a').attr('title');
const price = $(element).find('.price_color').text();
books.push({ title, price });
});
console.log(books);
},
});
crawler.run(['https://books.toscrape.com/']);
Dans ce code, vous utilisez CheerioCrawler de crawlee pour scraper les titres et les prix des livres depuis https://books.toscrape.com/. Le crawler récupère le contenu HTML, extrait les données des éléments <article class="product_pod"> à l’aide d’une syntaxe similaire à jQuery, et affiche les résultats dans la console.
Une fois le code précédent ajouté à votre fichier scrape.js, vous pouvez l’exécuter avec la commande suivante :
node scrape.js
Un tableau de titres et de prix de livres devrait s’afficher dans votre terminal :
…output omitted…
{
title: 'The Boys in the Boat: Nine Americans and Their Epic Quest for Gold at the 1936 Berlin Olympics',
price: '£22.60'
},
{ title: 'The Black Maria', price: '£52.15' },
{
title: 'Starving Hearts (Triangular Trade Trilogy, #1)',
price: '£13.99'
},
{ title: "Shakespeare's Sonnets", price: '£20.66' },
{ title: 'Set Me Free', price: '£17.46' },
{
title: "Scott Pilgrim's Precious Little Life (Scott Pilgrim #1)",
price: '£52.29'
},
…output omitted…
Rotation de Proxy avec Crawlee
Un Proxy est l’intermédiaire entre votre ordinateur et internet. Lorsque vous utilisez un Proxy, il envoie vos requêtes web au serveur proxy, qui les transmet au site web cible. Le serveur proxy renvoie la réponse du site web, masque votre adresse IP et vous protège contre les limitations de débit ou les bannissements d’IP.
Crawlee simplifie la mise en œuvre des proxies grâce à sa gestion intégrée, qui gère efficacement les nouvelles tentatives et les erreurs. Crawlee prend également en charge une gamme de configurations de proxy pour implémenter des proxies rotatifs.
Dans la section suivante, vous allez configurer un Proxy en obtenant d’abord un proxy valide. Ensuite, vous vérifierez que vos requêtes transitent bien par les proxies.
Configurer un Proxy
Les proxies gratuits sont généralement déconseillés car ils peuvent être lents et peu sécurisés, et ne disposent pas forcément du support nécessaire pour les tâches web sensibles. Envisagez plutôt d’utiliser Bright Data, un service de proxy sécurisé, stable et fiable. Il propose également des essais gratuits pour tester avant de s’engager.
Pour utiliser Bright Data, cliquez sur le bouton Essai gratuit sur leur page d’accueil et remplissez les informations requises pour créer un compte.
Une fois votre compte créé, connectez-vous au tableau de bord Bright Data, accédez à Proxies & Infrastructure de scraping, et ajoutez un nouveau proxy en sélectionnant Proxys résidentiels :

Conservez les paramètres par défaut et finalisez la création de votre proxy résidentiel en cliquant sur Ajouter.
Si vous êtes invité à installer un certificat, vous pouvez sélectionner Continuer sans certificat. Cependant, pour la production et les cas d’utilisation réels, vous devriez configurer le certificat afin d’éviter tout abus si vos informations de proxy venaient à être exposées.
Une fois créé, notez les identifiants du proxy, notamment l’hôte, le port, le nom d’utilisateur et le mot de passe. Vous en aurez besoin à l’étape suivante :

Dans le répertoire racine de votre projet, exécutez la commande suivante pour installer la bibliothèque axios :
npm install axios
Vous utilisez la bibliothèque axios pour effectuer une requête GET vers http://lumtest.com/myip.json, qui retourne les détails du proxy que vous utilisez à chaque exécution du script.
Ensuite, dans le répertoire racine de votre projet, créez un fichier nommé scrapeWithProxy.js et ajoutez le code suivant :
const { CheerioCrawler } = require("crawlee");
const { ProxyConfiguration } = require("crawlee");
const axios = require("axios");
const proxyConfiguration = new ProxyConfiguration({
proxyUrls: ["http://USERNAME:PASSWORD@HOST:PORT"],
});
const crawler = new CheerioCrawler({
proxyConfiguration,
async requestHandler({ request, $, response, proxies }) {
// Make a GET request to the proxy information URL
try {
const proxyInfo = await axios.get("http://lumtest.com/myip.json", {
proxy: {
host: "HOST",
port: PORT,
auth: {
username: "USERNAME",
password: "PASSWORD",
},
},
});
console.log("Proxy Information:", proxyInfo.data);
} catch (error) {
console.error("Error fetching proxy information:", error.message);
}
const books = [];
$("article.product_pod").each((index, element) => {
const title = $(element).find("h3 a").attr("title");
const price = $(element).find(".price_color").text();
books.push({ title, price });
});
console.log(books);
},
});
crawler.run(["https://books.toscrape.com/"]);
Remarque : Assurez-vous de remplacer
HOST,PORT,USERNAMEetPASSWORDpar vos identifiants.
Dans ce code, vous utilisez CheerioCrawler de crawlee pour scraper des informations depuis https://books.toscrape.com/ via un proxy spécifié. Vous configurez le proxy avec ProxyConfiguration ; ensuite, vous récupérez et affichez les détails du proxy via une requête GET vers http://lumtest.com/myip.json. Enfin, vous extrayez les titres et les prix des livres à l’aide de la syntaxe jQuery-like de Cheerio et affichez les données dans la console.
Vous pouvez maintenant exécuter et tester le code pour vous assurer que les proxies fonctionnent :
node scrapeWithProxy.js
Vous obtiendrez des résultats similaires à avant, mais cette fois, vos requêtes sont acheminées via les proxies Bright Data. Vous devriez également voir les détails du proxy dans la console :
Proxy Information: {
country: 'US',
asn: { asnum: 21928, org_name: 'T-MOBILE-AS21928' },
geo: {
city: 'El Paso',
region: 'TX',
region_name: 'Texas',
postal_code: '79925',
latitude: 31.7899,
longitude: -106.3658,
tz: 'America/Denver',
lum_city: 'elpaso',
lum_region: 'tx'
}
}
[
{ title: 'A Light in the Attic', price: '£51.77' },
{ title: 'Tipping the Velvet', price: '£53.74' },
{ title: 'Soumission', price: '£50.10' },
{ title: 'Sharp Objects', price: '£47.82' },
{ title: 'Sapiens: A Brief History of Humankind', price: '£54.23' },
{ title: 'The Requiem Red', price: '£22.65' },
…output omitted..
Si vous exécutez à nouveau le script avec node scrapingWithBrightData.js, vous devriez voir une adresse IP différente utilisée par le serveur proxy Bright Data. Cela valide que Bright Data fait tourner les emplacements et les IPs à chaque exécution de votre script de scraping, ce qui est essentiel pour contourner les blocages ou les bannissements d’IP des sites cibles.
Remarque : Dans la
proxyConfiguration, vous auriez pu passer différentes IPs de proxy, mais puisque Bright Data s’en charge pour vous, vous n’avez pas besoin de les spécifier.
Gestion des Sessions avec Crawlee
Les sessions permettent de maintenir l’état entre plusieurs requêtes, ce qui est utile pour les sites web utilisant des cookies ou des sessions de connexion.
Pour gérer une session, créez un fichier nommé scrapeWithSessions.js dans le répertoire racine de votre projet et ajoutez le code suivant :
const { CheerioCrawler, SessionPool } = require("crawlee");
(async () => {
// Open a session pool
const sessionPool = await SessionPool.open();
// Ensure there is a session in the pool
let session = await sessionPool.getSession();
if (!session) {
session = await sessionPool.createSession();
}
const crawler = new CheerioCrawler({
useSessionPool: true, // Enable session pool
async requestHandler({ request, $, response, session }) {
// Log the session information
console.log(`Using session: ${session.id}`);
// Extract book data and log it (for demonstration)
const books = [];
$("article.product_pod").each((index, element) => {
const title = $(element).find("h3 a").attr("title");
const price = $(element).find(".price_color").text();
books.push({ title, price });
});
console.log(books);
},
});
// First run
await crawler.run(["https://books.toscrape.com/"]);
console.log("First run completed.");
// Second run
await crawler.run(["https://books.toscrape.com/"]);
console.log("Second run completed.");
})();
Ici, vous utilisez CheerioCrawler et SessionPool de crawlee pour scraper des données depuis https://books.toscrape.com/. Vous initialisez un pool de sessions, puis configurez le crawler pour l’utiliser. La fonction requestHandler enregistre les informations de session et extrait les titres et prix des livres à l’aide des sélecteurs jQuery-like de Cheerio. Le code effectue deux exécutions de scraping consécutives et enregistre l’ID de session à chaque fois.
Exécutez et testez le code pour valider que différentes sessions sont utilisées :
node scrapeWithSessions.js
Vous devriez obtenir des résultats similaires à avant, mais cette fois, vous devriez également voir l’ID de session pour chaque exécution :
Using session: session_GmKuZ2TnVX
[
{ title: 'A Light in the Attic', price: '£51.77' },
{ title: 'Tipping the Velvet', price: '£53.74' },
…output omitted…
Using session: session_lNRxE89hXu
[
{ title: 'A Light in the Attic', price: '£51.77' },
{ title: 'Tipping the Velvet', price: '£53.74' },
…output omitted…
Si vous exécutez à nouveau le code, vous devriez voir qu’un ID de session différent est utilisé.
Gestion du Contenu Dynamique avec Crawlee
Si vous traitez des sites web dynamiques (c’est-à-dire des sites dont le contenu est généré par JavaScript), le scraping web peut être extrêmement complexe car vous devez exécuter JavaScript pour accéder aux données. Pour gérer ces situations, Crawlee s’intègre avec Puppeteer, un navigateur headless capable d’exécuter JavaScript et d’interagir avec le site cible comme le ferait un humain.
Pour illustrer cette fonctionnalité, nous allons scraper le contenu de cette page YouTube. Comme toujours, avant de scraper quoi que ce soit, assurez-vous de consulter les règles et conditions d’utilisation de la page.
Après avoir consulté les conditions d’utilisation, créez un fichier nommé scrapeDynamicContent.js dans le répertoire racine de votre projet et ajoutez le code suivant :
const { PuppeteerCrawler } = require("crawlee");
async function scrapeYouTube() {
const crawler = new PuppeteerCrawler({
async requestHandler({ page, request, enqueueLinks, log }) {
const { url } = request;
await page.goto(url, { waitUntil: "networkidle2" });
// Scraping first 10 comments
const comments = await page.evaluate(() => {
return Array.from(document.querySelectorAll("#comments #content-text"))
.slice(0, 10)
.map((el) => el.innerText);
});
log.info(`Comments: ${comments.join("n")}`);
},
launchContext: {
launchOptions: {
headless: true,
},
},
});
// Add the URL of the YouTube video you want to scrape
await crawler.run(["https://www.youtube.com/watch?v=wZ6cST5pexo"]);
}
scrapeYouTube();
Ensuite, exécutez le code avec la commande suivante :
node scrapeDynamicContent.js
Dans ce code, vous utilisez PuppeteerCrawler de la bibliothèque Crawlee pour scraper les commentaires d’une vidéo YouTube. Vous commencez par initialiser un crawler qui navigue vers une URL de vidéo YouTube spécifique et attend que la page soit entièrement chargée. Une fois la page chargée, le code évalue son contenu pour extraire les dix premiers commentaires en sélectionnant les éléments avec le sélecteur CSS #comments #content-text. Les commentaires sont ensuite affichés dans la console.
Votre résultat devrait inclure les dix premiers commentaires relatifs à la vidéo sélectionnée :
INFO PuppeteerCrawler: Starting the crawler.
INFO PuppeteerCrawler: Comments: Who are you rooting for?? US Marines or Ex Cons
Bro Mateo is a beast, no lifting straps, close stance.
ex convict doing the pushups is a monster.
I love how quick this video was, without nonsense talk and long intros or outros
"They Both have combat experience" is wicked
That military guy doing that deadlift is really no joke.. ...
One lives to fight and the other fights to live.
Finally something that would test the real outcome on which narrative is true on movies
I like the comradery between all of them. Especially on the Bench Press ... Both team members quickly helped out on the spotting to protect from injury. Well done.
I like this style, no youtube funny business. Just straight to the lifts
…output omitted…
Vous pouvez trouver tout le code utilisé dans ce tutoriel sur GitHub.
Conclusion
Dans cet article, vous avez appris à utiliser Crawlee pour le scraping web et vous avez vu comment il peut contribuer à améliorer l’efficacité et la fiabilité de vos projets de scraping web.
N’oubliez pas de toujours respecter le fichier robots.txt et les conditions d’utilisation du site cible lors de la collecte de données.
Prêt à faire passer vos projets de scraping web au niveau supérieur avec des données, des outils et des proxies de qualité professionnelle ? Explorez l’infrastructure complète de scraping web de Bright Data, proposant des jeux de données prêts à l’emploi et des services de proxy avancés pour optimiser votre collecte de données.
Inscrivez-vous maintenant et commencez votre essai gratuit !