Je suis en train d'utiliser Node/Puppeteer dans le code ci-dessous, en passant une grande liste d'URL pour le parcours et le scraping. Il a été difficile de le faire de manière asynchrone, bien que je trouve que je me rapproche de plus en plus de la réponse. Je suis actuellement bloqué sur un problème lié à l'erreur suivante.
UnhandledPromiseRejectionWarning: Rejet de la promesse non géré (identifiant du rejet : 17): Erreur : Erreur de protocole (Target.createTarget) : Cible fermée.
Cette erreur se produit une fois à chaque itération de la boucle while. Bien que je ne sois pas sûr de ce que je pourrais faire de manière incorrecte.
Est-ce que quelqu'un pourrait m'aider à faire ce qui suit :
1) Diagnostiquer la source de l'erreur.
2) Trouver éventuellement un moyen plus efficace de parcourir une grande liste d'URL de manière asynchrone.
async function subProc(list, batchSize) {
let subList = null;
let i = 0;
while (list.length > 0) {
let browser = await puppeteer.launch();
subList = list.splice(0, batchSize);
console.log("Taille de la liste principale :: " + list.length);
console.log("Taille de la sous-liste :: " + subList.length);
for (let j = 0; j < subList.length; j++) {
promiseArray.push(new Promise((resolve, reject) => {
resolve(pageScrape(subList[j], browser));
}));
}
Promise.all(promiseArray)
.then(response => {
procArray.concat(response);
});
promiseArray = new Array();
try {
await browser.close();
} catch(ex){
console.log(ex);
}
};
}
async function pageScrape(url, browser) {
let page = await browser.newPage();
await page.goto(url, {
timeout: 0
});
await page.waitFor(1000);
return await page.evaluate(() => {
let appTitle = document.querySelector('').innerText;
let companyName = document.querySelector('').innerText;
let dateListed = document.evaluate("", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.innerText;
let category = document.evaluate("']//a//strong", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.innerText;
/* */
return {
appTitle,
companyName,
dateListed,
category
}
}).then(response => {
let urlData = {
id: subList[j],
appName: response.appTitle,
companyName: response.companyName,
dateListed: response.dateListed,
category: response.category
}
return urlData;
});
};