Salut les kheys,
Je suis ce tuto pour faire un web scraper amazon. J'en suis rendu à la moitié mais je suis bloqué depuis plus d'une semaine à cause de Mongoose. En effet, aucun des produits scrapé n'est ajouté à la collection de la database, et ce malgré que le scraping soit réussi.
À noter que dans le terminal malgré la réussite du scraping j'ai tout de même un retour d'erreur que je ne réussi pas à faire partir (peut-être que le problème est là?)
Bref j'ai vraiment besoin d'aide :/ je compte sur vous
Mon code :
"use server"
import Product from "../models/product.model";
import { connectTodb } from "../mongoose";
import { scrapeAmazonProduct } from "../scraper";
import { getAveragePrice, getHighestPrice, getLowestPrice } from "../util";
import { revalidatePath } from "next/cache";
export async function scrapeAndStoreProduct(productURL: string) {
if (!productURL) return;
try {
connectTodb();
const scrapedProduct: any = await scrapeAmazonProduct(productURL);
if (!scrapedProduct) {
console.log("Failed to scrape product");
return; // Stop execution if product scraping failed
}
let product = scrapedProduct;
// Check if scrapedProduct is an object and has a url property
if (typeof scrapedProduct === 'object' && scrapedProduct !== null && 'url' in scrapedProduct) {
const existingProduct = await Product.findOne({ url: scrapedProduct.url });
if (existingProduct) {
const updatedPriceHistory : any = [
...existingProduct.priceHistory,
{ price: scrapedProduct.currentPrice }
]
product = {
...scrapedProduct,
priceHistory: updatedPriceHistory,
lowestPrice: getLowestPrice(updatedPriceHistory),
highestPrice: getHighestPrice(updatedPriceHistory),
averagePrice: getAveragePrice(updatedPriceHistory)
}
}
}
const newProduct = await Product.findOneAndUpdate(
{url: scrapedProduct.url},
product,
{upsert: true, new:true}
);
revalidatePath(`/products/${newProduct._id}`);
} catch (error: any) {
throw new Error(`Failed to create/update product: ${error.message}`)
}
}
export async function getProductById(productId: string){
try {
connectTodb();
} catch (error) {
}
}
import mongoose from "mongoose";
import { connectTodb } from "../mongoose";
const productSchema = new mongoose.Schema({
url: {type : String, required:true, unique:true},
currency: {type: String, required:true},
image: {type: String, required:true},
title: {type: String, required:true},
currentPrice: {type: Number, required:true},
originalPrice: {type: Number, required:true},
priceHistory: [
{
prices: {type: Number, required: true},
date: {type:Date, default: Date.now}
},
],
lowestPrice: {type: Number},
highestPrice: {type: Number},
averagePrice: {type: Number},
discountRate: {type: Number},
description: {type: String},
isOutOfStock: {type: Boolean, default: false},
users: [{email: {type: String, required: true}}],
}, {timestamps: true});
const Product = mongoose.models.Product || mongoose.model('Product', productSchema);
export default Product;
import mongoose from "mongoose";
let isConnected = false;
export const connectTodb = async () => {
mongoose.set('strictQuery', true);
// Vérifie si MONGODB_URI est défini
if (!process.env.MONGODB_URI) {
console.error('MONGODB_URI is not defined');
return;
}
if(isConnected) return console.log('=> using existing database connection');
try {
await mongoose.connect(process.env.MONGODB_URI);
isConnected = true;
console.log('MONGODB Connected');
} catch (error) {
console.error('Failed to connect to MongoDB:', error);
}
};
Oublié le lien vers le tuto :
https://youtu.be/lh9XVGv6BHs?si=vzjglW85f7kttOjQ&t=6512
Bonjour,
dans le terminal [...] j'ai tout de même un retour d'erreur que je ne réussi pas à faire partir (peut-être que le problème est là?)
mais poste tout, le code et le tuto, sauf les-dites erreurs...
ce serait utile de partager le retour console, car c'est surement le plus gros indice pour savoir ce qui ne marche pas.
Le 13 mai 2024 à 16:39:59 :
Bonjour,dans le terminal [...] j'ai tout de même un retour d'erreur que je ne réussi pas à faire partir (peut-être que le problème est là?)
mais poste tout, le code et le tuto, sauf les-dites erreurs...
ce serait utile de partager le retour console, car c'est surement le plus gros indice pour savoir ce qui ne marche pas.
Bien sûr tu as raison, voici le retour console :
Compiled / in 3s (864 modules)
Warning: Each child in a list should have a unique "key" prop.
Check the top-level render call using <div>. See https://reactjs.org/link/warning-keys for more information.
at div
GET / 200 in 3305ms
Compiled in 250ms (303 modules)
MONGODB Connected
{
url: 'https://www.amazon.fr/Acer-Nitro-KG241YS3biipf-BluelightShield-Inclinable/dp/B0C28QPGR2/ref=pd_ci_mcx_mh_mcx_views_0?pd_rd_w=6Um3V&content-id=amzn1.sym.599bf194-df9f-4215-9a04-668b64035e9b%3Aamzn1.symc.45dc5f4c-d617-4dba-aa26-2cadef3da899&pf_rd_p=599bf194-df9f-4215-9a04-668b64035e9b&pf_rd_r=GZT3RR107R9VMD4YD53C&pd_rd_wg=xXitn&pd_rd_r=faaf1dc0-3548-448f-a812-ecb8c374ca29&pd_rd_i=B0C28QPGR2',
currency: '€',
image: 'https://m.media-amazon.com/images/I/71GazIpwJ+L._AC_SX355_.jpg',
title: 'Acer Nitro KG241YS3biipf - Écran PC Gaming 24" Full HD, 180Hz (1920x1080, 16:9, FreeSync, 1ms VRB, 250 Nits, Comfyview, BluelightShield, 2xHDMI 2.0/1xDP 1.2) Moniteur PC Inclinable, Couleur Noir',
currentPrice: 139139,
originalPrice: 1449014490429609,
priceHistory: [],
discountRate: NaN,
outOfStock: false,
description: ''Ecran pc amazon",
lowestPrice: 139139,
highestPrice: 139139,
averagePrice: 139139,
reviewsCount: 3
}
Failed to scrape product
POST / 200 in 3188ms
up !
tu dois avoir un problème entre comment ta table est structurée et les données que tu envoie