Using Node.js, I’m scraping a few different websites.
I can’t retrieve all the information I need on all the pages
I have little knowledge of Puppeteer, yet I tried to do it, watch lots of tutorials/forums
Can you help me?
const puppeteer = require('puppeteer');
const { MongoClient } = require('mongodb');
let queue = [
'https://www.maxiscoot.com/fr/moto-50cc/haut-moteur/kit-cylindre/',
'https://www.maxiscoot.com/fr/moto-50cc/haut-moteur/kit-cylindre/?p=1',
'https://www.maxiscoot.com/fr/moto-50cc/haut-moteur/kit-cylindre/?p=2',
'https://www.maxiscoot.com/fr/moto-50cc/haut-moteur/kit-cylindre/?p=3',
]
async function scrapeData() {
const browser = await puppeteer.launch()
const page = await browser.newPage()
let url
while(url = queue.shift()){
await page.goto(url)
}
// Naviguer vers la page cible
// await page.goto('https://www.maxiscoot.com/fr/moto-50cc/haut-moteur/kit-cylindre/');
// Attendre que les éléments contenant les données des produits soient chargés sur la page
await page.waitForSelector('.element_artikel__price');
await page.waitForSelector('.element_artikel__img');
await page.waitForSelector('.element_artikel__description');
await page.waitForSelector('.element_artikel__availability');
await page.waitForSelector('.element_artikel__brand');
await page.waitForSelector('.element_artikel__sku');
// Extraire les données des produits en utilisant une fonction de la page
const productsData = await page.evaluate(() => {
const priceElements = document.querySelectorAll('.element_artikel__price');
const imageElements = document.querySelectorAll('.element_artikel__img');
const titleElements = document.querySelectorAll('.element_artikel__description');
const stockElements = document.querySelectorAll('.element_artikel__availability');
const brandElements = document.querySelectorAll('.element_artikel__brand');
const referenceElements = document.querySelectorAll('.element_artikel__sku');
const products = [];
for (let i = 0; i < priceElements.length; i++) {
const price = priceElements[i].textContent;
const imageUrl = imageElements[i].getAttribute('src');
const title = titleElements[i].textContent;
const instock = stockElements[i].textContent;
const brand = brandElements[i].textContent;
const reference = referenceElements[i].textContent;
products.push({ price, imageUrl, title, instock, brand, reference });
}
return products;
});
// Fermer le navigateur
await browser.close();
return productsData;
}
[1,2,3].map(() => scrapeData())
// Fonction pour enregistrer les données dans MongoDB
async function saveDataToMongoDB(data) {
const uri = 'mongodb://127.0.0.1:27017'; // Changez cette URL en fonction de votre configuration MongoDB
const client = new MongoClient(uri);
try {
await client.connect();
console.log('Connecté à MongoDB');
const database = client.db('scraped_data');
const collection = database.collection('testing');
// Supprimer les données existantes dans la collection
await collection.deleteMany({});
// Insérer les données dans la collection
await collection.insertMany(data);
console.log('Données enregistrées avec succès dans MongoDB');
} catch (error) {
console.error('Une erreur est survenue lors de la connexion ou de l'enregistrement dans MongoDB:', error);
} finally {
// Fermer la connexion MongoDB
await client.close();
}
}
// Appeler la fonction de scraping, enregistrer les données dans MongoDB et afficher les données des produits
scrapeData()
.then((data) => {
saveDataToMongoDB(data);
console.log(data);
})
.catch((error) => console.error('Une erreur est survenue lors du scraping:', error));
I have tried almost everything and would like to retrieve information such as price, product title, part number, and image URL, and store everything on a database (MongoDB).
Edit :
it’s fine on all pages, but it doesn’t save all the information I need in my database
const puppeteer = require('puppeteer');
const { MongoClient } = require('mongodb');
process.setMaxListeners(0)
const BASE_URL = "https://www.maxiscoot.com/fr/moto-50cc/haut-moteur/kit-cylindre";
const PAGES = 4;
async function scrapeData(url) {
const browser = await puppeteer.launch({headless: false})
const page = await browser.newPage()
//await page.goto(url)
for (let i = 0; i < PAGES; i++) {
await page.goto(`${BASE_URL}${i === 0 ? "/" : `/?p=${i}`}`);
await page.waitForTimeout(6 * 1000);
}
// Naviguer vers la page cible
// await page.goto('https://www.maxiscoot.com/fr/moto-50cc/haut-moteur/kit-cylindre/');
// Attendre que les éléments contenant les données des produits soient chargés sur la page
await page.waitForSelector('.element_artikel__price');
await page.waitForSelector('.element_artikel__img');
await page.waitForSelector('.element_artikel__description');
await page.waitForSelector('.element_artikel__availability');
await page.waitForSelector('.element_artikel__brand');
await page.waitForSelector('.element_artikel__sku');
// Extraire les données des produits en utilisant une fonction de la page
const productsData = await page.evaluate(() => {
const priceElements = document.querySelectorAll('.element_artikel__price');
const imageElements = document.querySelectorAll('.element_artikel__img');
const titleElements = document.querySelectorAll('.element_artikel__description');
const stockElements = document.querySelectorAll('.element_artikel__availability');
const brandElements = document.querySelectorAll('.element_artikel__brand');
const referenceElements = document.querySelectorAll('.element_artikel__sku');
const products = [];
for (let i = 0; i < priceElements.length; i++) {
const price = priceElements[i].textContent;
const imageUrl = imageElements[i].getAttribute('src');
const title = titleElements[i].textContent;
const instock = stockElements[i].textContent;
const brand = brandElements[i].textContent;
const reference = referenceElements[i].textContent;
products.push({ price, imageUrl, title, instock, brand, reference });
}
return products;
});
// Fermer le navigateur
await browser.close();
return productsData;
}
// Fonction pour enregistrer les données dans MongoDB
async function saveDataToMongoDB(data) {
const uri = 'mongodb://127.0.0.1:27017'; // Changez cette URL en fonction de votre configuration MongoDB
const client = new MongoClient(uri);
try {
await client.connect();
console.log('Connecté à MongoDB');
const database = client.db('scraped_data');
const collection = database.collection('testing');
// Supprimer les données existantes dans la collection
await collection.deleteMany({});
// Insérer les données dans la collection
await collection.insertMany(data);
console.log('Données enregistrées avec succès dans MongoDB');
} catch (error) {
console.error('Une erreur est survenue lors de la connexion ou de l'enregistrement dans MongoDB:', error);
} finally {
// Fermer la connexion MongoDB
await client.close();
}
}
// Appeler la fonction de scraping, enregistrer les données dans MongoDB et afficher les données des produits
scrapeData()
.then((data) => {
saveDataToMongoDB(data);
console.log(data);
})
.catch((error) => console.error('Une erreur est survenue lors du scraping:', error));
2
Answers
I think you are giving your function too much responsibility at the moment by keeping track of the URL. I would move this out of the function and save the base URL in a variable to prevent duplication:
Tried your code, it either brings me random number of elements between 7 and 60, out of the 200 it should return, so here is a re-write of your code, pay attention to notes in the
scrapeData
functionCode : result