Estoy tratando de aprender titiritero y quería raspar la página web de StockX en https://stockx.com/fr-fr/dior-b713-cactus-jack-mocha .
Quería raspar el título del zapato al principio como "Dior B713 CACTUS JACK".
Intenté usar: await document.querySelector para raspar el título, pero la página se congela y muestra este error Error: la evaluación falló: TypeError: no se pueden leer las propiedades de nulo (leyendo 'texto interno'). Sabiendo que en la consola se devuelve bien la información.
Traté de usar el selector CSS exacto de las herramientas de desarrollo de Google, pero sin éxito. He probado varias combinaciones de selectores de CSS, pero aún no puedo extraer el título que quiero.
const scraperObject = { url: 'https://stockx.com/fr-fr/dior-b713-cactus-jack-mocha', async scraper(browser){ let page = await browser.newPage(); console.log(`Navigating to ${this.url}...`); await page.goto(this.url); // Wait for the required DOM to be rendered const result = await page.evaluate(() => { let demandes = document.querySelector('#main-content > div > section:nth-child(3) > div.css-j7qwjs > div > h1').innerText; return demandes; }) console.log(demandes); await browser } } module.exports = scraperObject;No hay una necesidad clara de trabajar con el DOM aquí en absoluto, o Titiritero para el caso, solo para recuperar el nombre del producto, que está disponible en algunos lugares diferentes en el HTML estático. Busque view-source:https://stockx.com/fr-fr/dior-b713-cactus-jack-mocha por "Dior B713 CACTUS JACK" para ver todas las apariciones. El más fácil de obtener parece ser el título de la página o la metaetiqueta twitter:title.
Con Cheerio y Node 18 (para fetch nativa; instale node-fetch si está en un Nodo más antiguo):
const cheerio = require("cheerio"); // 1.0.0-rc.12 fetch("https://stockx.com/fr-fr/dior-b713-cactus-jack-mocha") .then(res => res.text()) .then(html => { const $ = cheerio.load(html); console.log($('meta[property="twitter:title"]').attr("content")); // or: console.log($("title").text()); }) ;Titiritero:
const puppeteer = require("puppeteer"); // ^15.4.0 let browser; (async () => { browser = await puppeteer.launch(); const [page] = await browser.pages(); const ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"; await page.setUserAgent(ua); const url = "https://stockx.com/fr-fr/dior-b713-cactus-jack-mocha"; await page.goto(url, {waitUntil: "domcontentloaded"}); const title = await page.$eval( 'meta[property="twitter:title"]', el => el.getAttribute("content") ); console.log(title); // or: console.log(await page.title()); })() .catch(err => console.error(err)) .finally(() => browser?.close()) ;Producción:
Dior B713 CACTUS JACK Mocha Dior B713 CACTUS JACK Mocha - 3SN281ZNV_H967StockX LogoStockX Logo