fix: KöPi - Screenshot mit BoundingBox clip für korrekte Bildgröße

This commit is contained in:
2026-07-09 12:31:27 +02:00
parent 2a06e93e90
commit 03a4f20124

View File

@@ -95,18 +95,33 @@ async function scrapeMarktguru() {
}); });
}); });
// Bilder via Puppeteer screenshot der img-Elemente // Bilder via Puppeteer: URL direkt aus img src holen und über page.goto laden
const imgElements = await page.$$('img.offer-list-item-img'); const imgElements = await page.$$('img.offer-list-item-img');
for (let i = 0; i < offers.length; i++) { for (let i = 0; i < offers.length; i++) {
if (!offers[i].image || !imgElements[i]) continue; if (!offers[i].image || !imgElements[i]) continue;
try { try {
// Warte bis Bild geladen // Viewport auf Bildgröße setzen damit kein Zoom-Effekt entsteht
await page.evaluate(el => new Promise(res => { await page.evaluate(el => new Promise(res => {
if (el.complete) return res(); if (el.complete && el.naturalWidth > 0) return res();
el.onload = res; el.onerror = res; el.onload = res; el.onerror = res;
setTimeout(res, 3000); setTimeout(res, 5000);
}), imgElements[i]); }), imgElements[i]);
const b64 = await imgElements[i].screenshot({ encoding: 'base64' });
// Bounding Box prüfen
const box = await imgElements[i].boundingBox();
if (!box || box.width < 5 || box.height < 5) {
offers[i].image = null;
continue;
}
// Screenshot mit clip auf vernünftige Größe
const clip = {
x: box.x,
y: box.y,
width: Math.min(box.width, 300),
height: Math.min(box.height, 300),
};
const b64 = await page.screenshot({ encoding: 'base64', clip });
offers[i].image = b64 ? `data:image/png;base64,${b64}` : null; offers[i].image = b64 ? `data:image/png;base64,${b64}` : null;
} catch { offers[i].image = null; } } catch { offers[i].image = null; }
} }