es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Recorre las páginas y devuelve los enlaces de productos en un solo arreglo.

Soy un traductor de español que traduce documentos de TI. Traduzca lo siguiente al español. No traduzca el código y la salida en markdown.

Tengo el código que obtuve con 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 variable de cadena all_links = [] y poner todos los enlaces de cada página en ella all_links.push (… links) y luego devolverlos como return all_links. Pero el problema es que estoy fallando porque no sé exactamente cómo hacerlo en este caso. Soy un principiante puro sin conocimientos previos de 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);

// Obteniendo todos los productos, esto devolverá una matriz de 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) => {
            // buscando un descuento en cada producto
            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')
                    )
            );
            // si tiene un descuento
            if (disc.length > 0) {
                // analizamos el descuento a tipo Integer para compararlo con minDiscount
                const discountInt = parseInt(disc[0], 10);
                if (discountInt >= minDiscount) {
                    // obtenemos el enlace del producto
                    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) {
                        // agregamos un objeto que contiene el descuento y el enlace del producto
                        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();
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que necesitas crear una variable de cadena var all_links = [] y agregar todos los enlaces de cada página en ella all_links.push(…links) y luego retornarlos como return all_links. Para hacer esto, puedes agregar el siguiente código al final de tu función getLinks():

    var all_links = [];
    bulkArray.forEach(function(item) {
    all_links.push(item);
    });
    return all_links;

    Esto creará un array all_links y agregará todos los enlaces de cada página en él. Luego, retornará el array all_links con todos los enlaces de cada página.

Comments are closed.