Pensé que hacer un raspador de imágenes básico sería un proyecto divertido. El código a continuación funciona en la consola del sitio web, pero no sé cómo hacer que funcione desde mi app.js.
var anchors = document.getElementsByTagName('a'); var hrefs = []; for(var i=0; i < anchors.length; i++){ var src = anchors[i].href; if(src.endsWith(".jpeg")) { hrefs.push(anchors[i].href); }} console.log(hrefs);Pensé que usar titiritero era una buena idea, pero mi conocimiento es demasiado limitado para determinar si eso es correcto o no. Este es mi código de titiritero:
const puppeteer = require("puppeteer"); async function scrape(url) { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto(url); var anchors = await page.evaluate(() => document.getElementsByTagName('a')); var hrefs = []; for(var i=0; i < anchors.length; i++){ var img = anchors[i].href; if(img.endsWith(".jpeg")) { hrefs.push(anchors[i].href); }} console.log({hrefs}, {img}); browser.close(); }Entiendo que la última parte del código es incorrecta, pero no puedo encontrar una respuesta sólida a lo que se debe escribir en su lugar.
Gracias por tomarte tu tiempo.
page.evaluate() solo puede transferir valores serializables (más o menos, los valores que JSON puede manejar). Como document.getElementsByTagName() devuelve una colección de elementos DOM que no son serializables (contienen métodos y referencias circulares), cada elemento de la colección se reemplaza con un objeto vacío. Debe devolver un valor serializable (por ejemplo, una matriz de textos o atributos href ) o usar algo como page.$$(selector) y ElementHandle API.
La API web no está definida fuera de la función de argumento .evaluate() , por lo que debe colocar toda la parte de la API web en la función de argumento .evaluate() y devolver datos serializables desde ella.
const puppeteer = require("puppeteer"); async function scrape(url) { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto(url); const data = await page.evaluate(() => { const anchors = document.getElementsByTagName('a'); const hrefs = []; for (let i = 0; i < anchors.length; i++) { const img = anchors[i].href; if (img.endsWith(".jpeg")) { hrefs.push(img); } } return hrefs; }); console.log(data); await browser.close(); }