fix: KöPi - Bilder via Puppeteer Element-Screenshot
This commit is contained in:
@@ -89,34 +89,20 @@ async function scrapeMarktguru() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// Bilder alle auf einmal im Browser-Kontext laden (hat Zugriff auf CDN)
|
// Bilder via Puppeteer screenshot der img-Elemente
|
||||||
const imageUrls = offers.map(o => o.image).filter(Boolean);
|
const imgElements = await page.$$('img.offer-list-item-img');
|
||||||
if (imageUrls.length > 0) {
|
for (let i = 0; i < offers.length; i++) {
|
||||||
const b64Images = await page.evaluate(async (urls) => {
|
if (!offers[i].image || !imgElements[i]) continue;
|
||||||
const results = {};
|
|
||||||
await Promise.all(urls.map(async url => {
|
|
||||||
try {
|
try {
|
||||||
const resp = await fetch(url);
|
// Warte bis Bild geladen
|
||||||
if (!resp.ok) { results[url] = null; return; }
|
await page.evaluate(el => new Promise(res => {
|
||||||
const blob = await resp.blob();
|
if (el.complete) return res();
|
||||||
results[url] = await new Promise(res => {
|
el.onload = res; el.onerror = res;
|
||||||
const r = new FileReader();
|
setTimeout(res, 3000);
|
||||||
r.onloadend = () => res(r.result);
|
}), imgElements[i]);
|
||||||
r.onerror = () => res(null);
|
const b64 = await imgElements[i].screenshot({ encoding: 'base64' });
|
||||||
r.readAsDataURL(blob);
|
offers[i].image = b64 ? `data:image/png;base64,${b64}` : null;
|
||||||
});
|
} catch { offers[i].image = null; }
|
||||||
} catch { results[url] = null; }
|
|
||||||
}));
|
|
||||||
return results;
|
|
||||||
}, imageUrls);
|
|
||||||
|
|
||||||
for (const offer of offers) {
|
|
||||||
if (offer.image && b64Images[offer.image]) {
|
|
||||||
offer.image = b64Images[offer.image];
|
|
||||||
} else {
|
|
||||||
offer.image = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filtern auf Ziel-Händler + nur König Pilsener
|
// Filtern auf Ziel-Händler + nur König Pilsener
|
||||||
|
|||||||
Reference in New Issue
Block a user