Tengo el código que obtuve con algo de ayuda y se puede encontrar en este enlace AQUÍ . Funciona bien en principio, pero el problema es que devuelve enlaces y matrices para cada página por separado. Sin embargo, quiero que devuelva enlaces en una sola matriz para todas las páginas juntas. Necesito crear una cadena var all_links = []
y enviar todos los enlaces de cada página all_links.push(...links)
y luego devolverlos como return all_links
Pero el problema es que estoy fallando porque no No sé exactamente cómo hacerlo en este caso. Soy un principiante puro sin conocimientos previos en codificación.
const puppeteer = require('puppeteer') const minDiscount = 20; async function getLinks() { const browser = await puppeteer.launch({ headless: false, defaultViewport: null, }); const page = await browser.newPage(); const url = 'https://www.mytoys.de/spielzeug-spiele/holz/'; await page.goto(url); // getting all the products, this will return an array of ElementHandle while(await page.$(".pager__link--next")){ await page.waitForSelector(".pager__link--next") await page.waitForTimeout(1000); await page.click('.pager__link--next') await page.waitForTimeout(1500); const products = await page.$$('.prod-grid.js-prod-grid .prod-grid__item.js-prod-grid_item'); const proms = await Promise.allSettled( products.map(async (prod) => { // searching for a discount on each product const disc = await prod.$$eval( '.prod-grid.js-prod-grid .prod-flag.prod-flag-sale', (discount) => discount.map((discItem) => discItem.innerText.replace(/[^0-9.]/g, '').replace(/\D+/g,'0') ) ); // if it has a discount if (disc.length > 0) { // we parse the discount to Integer type to compare it to minDiscount const discountInt = parseInt(disc[0], 10); if (discountInt >= minDiscount) { // we get the link of the product const link = await prod.$$eval('.prod-grid.js-prod-grid .prod-tile__link.js-prodlink', (allAs) => allAs.map((a) => a.href)); if (link.length > 0) { // push an object containing the discount and the link of the product return link[0]; } } } return null; }) ); const bulkArray = proms.map((item) => { if (item.status === 'fulfilled') return item.value; }); const endArray = bulkArray.filter(item => item !== null); console.log(endArray); } } getLinks();
Por favor, ayuda y ten piedad, ya que estoy empezando a aprender los conceptos básicos.
Aquí hay una limpieza para comenzar:
const products = await page.$$eval('.prod-tile', divs => divs.map(div => { return { url: div.querySelector('a')?.href discount: div.querySelector('.prod-flag-sale')?.innerText } }))
En este punto, simplemente siga los siguientes enlaces y haga lo mismo para cada página.