Comment scraper les données d'un site Shopify ?
Article écrit le
Introduction
Dans le prolongement de notre précédent article sur le web scraping d'un site Prestashop avec Puppeteer, mon client a récemment demandé de l'aide pour scraper un site Shopify. L'un des défis majeurs de cette tâche est de récupérer les déclinaisons de chaque produit, en particulier les URLs des produits. Pour y parvenir, nous allons utiliser le sitemap du site, une méthode efficace pour collecter toutes les URLs des produits à scraper.
Installation des Dépendances
Avant de plonger dans le code, assurez-vous d'installer les dépendances nécessaires pour notre projet :
npm install puppeteer mysql2 axios xml2js
Configuration de la Connexion à la Base de Données
Nous allons établir une connexion à la base de données MySQL pour stocker les données des produits et de leurs variantes. Voici comment configurer la connexion :
const dbConfig = {
host: 'localhost',
user: 'scraper',
password: 'votre_mot_de_passe',
database: 'scraper'
};
Scraping des URLs de Produits depuis le Sitemap
Pour récupérer toutes les URLs de produits, nous utiliserons le sitemap XML du site. Le code suivant permet de parser le sitemap et d'extraire les URLs pertinentes :
const fetchProductUrlsFromSitemap = async (sitemapUrl) => {
try {
const response = await axios.get(sitemapUrl);
const xml = response.data;
const result = await parseStringPromise(xml);
const urls = [];
// Vérifiez si le sitemap contient des liens vers d'autres sitemaps
if (result.sitemapindex) {
const sitemapList = result.sitemapindex.sitemap;
for (const sitemap of sitemapList) {
const loc = sitemap.loc[0];
const nestedUrls = await fetchProductUrlsFromSitemap(loc);
urls.push(...nestedUrls);
}
} else if (result.urlset) {
const urlEntries = result.urlset.url;
for (const urlEntry of urlEntries) {
const loc = urlEntry.loc[0];
if (loc.includes('/products/')) {
urls.push(loc);
}
}
}
return urls;
} catch (error) {
console.error(\`Erreur lors de la récupération du sitemap \${sitemapUrl}:\`, error);
return [];
}
};
Scraping des Détails des Produits
Une fois que nous avons les URLs, nous utiliserons Puppeteer pour naviguer sur chaque page produit et extraire les informations nécessaires, y compris les déclinaisons. Voici un exemple de code pour scraper les détails d'un produit :
const scrapeProducts = async () => {
const productUrls = await getAllProductUrls();
const browser = await puppeteer.launch({ headless: true });
for (const productUrl of productUrls) {
const page = await browser.newPage();
await page.goto(productUrl);
const productInfo = {
name: await page.$eval('h1', el => el.innerText),
price: await page.$eval('.price', el => el.innerText),
variants: await scrapeVariants(page)
};
console.log(productInfo);
await page.close();
}
await browser.close();
};
const scrapeVariants = async (page) => {
const variants = [];
const variantElements = await page.$$('.variant-selector'); // Sélecteurs à ajuster selon le site
for (const element of variantElements) {
const variant = {
name: await element.$eval('.variant-name', el => el.innerText),
price: await element.$eval('.variant-price', el => el.innerText),
url: await element.$eval('a', el => el.href)
};
variants.push(variant);
}
return variants;
};
Conclusion
Le web scraping d'un site Shopify peut sembler complexe, mais avec Puppeteer et un bon plan d'action, il devient gérable. En utilisant le sitemap pour collecter les URLs des produits et en scrappant les informations avec Puppeteer, vous pouvez récupérer facilement les données de produits et leurs variantes. Ce projet montre comment allier puissance de scraping et gestion efficace des données dans une base de données.
Discussion (20)
Very straight-to-point article. Really worth time reading. Thank you! But tools are just the instruments for the UX designers. The knowledge of the design tools are as important as the creation of the design strategy.
Much appreciated! Glad you liked it ☺️
The article covers the essentials, challenges, myths and stages the UX designer should consider while creating the design strategy.
Thanks for sharing this. I do came from the Backend development and explored some of the tools to design my Side Projects.