Estoy tratando de raspar esta web https://poe.ninja/challenge/builds?time-machine=day-6 usando Puppeteer. Intenté la página Titiritero. Evaluate querySelectorAll devuelve objetos vacíos y vi muchas preguntas similares aquí. pero ninguno de ellos resuelve mi problema.
Aquí está mi código:
const scrapeNinja = async () => { const browser = await puppeteer.launch({headless: false}) const page = await browser.newPage() await page.goto(`https://poe.ninja/challenge/builds?time-machine=day-6`, { waitUntil: 'domcontentloaded', }) const getArray = await page.evaluate(() => { return Array.from(document.querySelectorAll( '#openSidebar > div > section:nth-child(3) > div > div > div > ul li .css-1h2ruwl' )).map(e => e.textContent) }) console.log(getArray) } Sé que los valores devueltos por page.evaluate deben ser serializables. no es este Array.from(document.querySelectorAll('#openSidebar > div > section:nth-child(3) > div > div > div > ul li .css-1h2ruwl')).map(e => e.textContent) no es un valor serializable? Intenté usar esto en la sección de herramientas de desarrollo, devuelve exactamente lo que quiero, pero de vuelta a node.js, solo devuelve una matriz vacía...
¿Estoy haciendo algo mal?
Parece que el problema es realmente esperar, está buscando elementos incluso si el contenido completo de dom no está completamente cargado.
const scrapeNinja = async () => { const browser = await puppeteer.launch({headless: false}) const page = await browser.newPage() await page.goto(`https://poe.ninja/challenge/builds?time-machine=day-6`, { waitUntil: 'networkidle2', }) const getArray = await page.$$eval('#openSidebar > div > section:nth-child(3) > div > div > div > ul li .css-1h2ruwl', el => el.map(item => item.textContent)) console.log(getArray) } scrapeNinja() Este código funciona perfectamente para mí, incluso si no tiene que inicializar la matriz. En el futuro use networkidle2 en la opción waitUntil