fix: KöPi - Duplikate korrekt zusammengefasst, Bilder Base64
This commit is contained in:
@@ -94,15 +94,20 @@ async function scrapeMarktguru() {
|
|||||||
if (!offer.image) continue;
|
if (!offer.image) continue;
|
||||||
try {
|
try {
|
||||||
const imgData = await page.evaluate(async (url) => {
|
const imgData = await page.evaluate(async (url) => {
|
||||||
const resp = await fetch(url);
|
try {
|
||||||
const blob = await resp.blob();
|
const resp = await fetch(url, {credentials:'include'});
|
||||||
return new Promise(resolve => {
|
if (!resp.ok) return null;
|
||||||
const reader = new FileReader();
|
const blob = await resp.blob();
|
||||||
reader.onloadend = () => resolve(reader.result);
|
return new Promise(resolve => {
|
||||||
reader.readAsDataURL(blob);
|
const reader = new FileReader();
|
||||||
});
|
reader.onloadend = () => resolve(reader.result);
|
||||||
|
reader.onerror = () => resolve(null);
|
||||||
|
reader.readAsDataURL(blob);
|
||||||
|
});
|
||||||
|
} catch { return null; }
|
||||||
}, offer.image);
|
}, offer.image);
|
||||||
offer.image = imgData; // base64 data URL
|
if (imgData) offer.image = imgData;
|
||||||
|
else offer.image = null;
|
||||||
} catch { offer.image = null; }
|
} catch { offer.image = null; }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,18 +118,26 @@ async function scrapeMarktguru() {
|
|||||||
return hasKP && isTargetRetailer(o.retailer);
|
return hasKP && isTargetRetailer(o.retailer);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Deduplizieren: gleicher Händler + gleicher Preis → zusammenfassen
|
// Händler normalisieren: E center = EDEKA
|
||||||
|
for (const o of filtered) {
|
||||||
|
if (o.retailer?.toLowerCase().includes('e center')) o.retailerDisplay = o.retailer;
|
||||||
|
else o.retailerDisplay = o.retailer;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deduplizieren: gleicher normalisierter Händler + gleicher Preis → ein Eintrag
|
||||||
|
// Kürzeste Beschreibung nehmen (sauberste)
|
||||||
const merged = new Map();
|
const merged = new Map();
|
||||||
for (const o of filtered) {
|
for (const o of filtered) {
|
||||||
const key = `${o.retailer}|${o.price}`;
|
const normalizedRetailer = o.retailer?.toLowerCase().replace('e center','edeka') || '';
|
||||||
|
const key = `${normalizedRetailer}|${o.price}`;
|
||||||
if (merged.has(key)) {
|
if (merged.has(key)) {
|
||||||
// Beschreibungen zusammenführen falls unterschiedlich
|
|
||||||
const existing = merged.get(key);
|
const existing = merged.get(key);
|
||||||
if (o.description && o.description !== existing.description) {
|
// Kürzere Beschreibung bevorzugen
|
||||||
existing.description = existing.description
|
if (o.description && (!existing.description || o.description.length < existing.description.length)) {
|
||||||
? `${existing.description} / ${o.description}`
|
existing.description = o.description;
|
||||||
: o.description;
|
|
||||||
}
|
}
|
||||||
|
// Besseres Bild (erstes das nicht null ist behalten)
|
||||||
|
if (!existing.image && o.image) existing.image = o.image;
|
||||||
} else {
|
} else {
|
||||||
merged.set(key, { ...o });
|
merged.set(key, { ...o });
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user