Estoy tratando de raspar una página de producto usando titiritero y Cheerio. (esta página)
Estoy usando una identificación de datos para raspar el título y la imagen. El problema es que el título nunca se raspa mientras que la imagen sí lo hace todo el tiempo.
He intentado raspar el título por nombre de clase, pero tampoco funciona. ¿Tiene esto algo que ver con el sitio web específico que estoy tratando de raspar? Gracias.
mi código:
// Load cheerio const $ = cheerio.load(data); /* Scrape Product Page */ const product = []; // Title $('[data-testid="product-name"]').each(() => { product.push({ title: $(this).text(), }); }); // Image $('[data-testid="product-detail-image"]').each((index, value) => { const imgSrc = $(value).attr('src'); product.push({ image: imgSrc, }); });Como mencioné en los comentarios, casi no se me ocurre ningún caso de uso que tenga sentido tanto con Puppeteer como con Cheerio a la vez. Si los datos son estáticos, use Cheerio junto con una biblioteca de solicitud simple como Axios; de lo contrario, use Puppeteer y omita Cheerio por completo a favor de los selectores nativos de Puppeteer.
Otra posible razón para usar Titiritero es si su biblioteca de solicitudes está siendo bloqueada por el detector de robots del servidor, como parece ser el caso aquí.
Este script funcionó para mí:
const puppeteer = require("puppeteer"); let browser; (async () => { browser = await puppeteer.launch({headless: true}); const [page] = await browser.pages(); const url = "https://stockx.com/nike-air-force-1-low-white-07"; await page.goto(url); const nameSel = '[data-testid="product-name"]'; await page.waitForSelector(nameSel, {timeout: 60000}); const name = await page.$eval(nameSel, el => el.textContent); const imgSel = '[data-testid="product-detail-image"]'; await page.waitForSelector(imgSel); const src = await page.$eval(imgSel, el => el.src); console.log(name, src); })() .catch(err => console.error(err)) .finally(() => browser?.close()) ;