CursosEmpresasBlogLiveConfPrecios

Scraping

Clase 29 de 31 • Curso de Fundamentos de Node.js

Clase anteriorSiguiente clase

Contenido del curso

Conocer los conceptos básicos de NodeJS

  • 1

    Instalación de Node.js

    00:53 min
  • 2
    Node: orígenes y filosofía

    Node: orígenes y filosofía

    04:40 min
  • 3
    EventLoop: asíncrona por diseño

    EventLoop: asíncrona por diseño

    04:38 min
  • 4
    Monohilo: implicaciones en diseño y seguridad

    Monohilo: implicaciones en diseño y seguridad

    09:41 min
  • 5
    Configurar las variables de entorno en Node.js

    Configurar las variables de entorno en Node.js

    07:22 min
  • 6
    Herramientas para ser más felices: Nodemon y PM2

    Herramientas para ser más felices: Nodemon y PM2

    09:55 min

Cómo manejar la asincronía

  • 7
    Callbacks

    Callbacks

    10:11 min
  • 8
    Callback Hell: refactorizar o sufrir

    Callback Hell: refactorizar o sufrir

    11:37 min
  • 9
    Promesas

    Promesas

    10:01 min
  • 10
    Async/await

    Async/await

    08:34 min

Entender los módulos del core

  • 11
    Globals

    Globals

    10:11 min
  • 12
    File system

    File system

    10:48 min
  • 13
    Console

    Console

    10:34 min
  • 14
    Errores (try / catch)

    Errores (try / catch)

    10:08 min
  • 15
    Procesos hijo

    Procesos hijo

    10:03 min
  • 16
    Módulos nativos en C++

    Módulos nativos en C++

    09:32 min
  • 17
    HTTP

    HTTP

    09:40 min
  • 18
    OS

    OS

    09:45 min
  • 19
    Process

    Process

    09:36 min

Utilizar los módulos y paquetes externos

  • 20
    Gestión de paquetes: NPM y package.json

    Gestión de paquetes: NPM y package.json

    09:27 min
  • 21
    Construyendo módulos: Require e Import

    Construyendo módulos: Require e Import

    09:46 min
  • 22
    Módulos útiles

    Módulos útiles

    12:35 min
  • 23
    Datos almacenados vs en memoria

    Datos almacenados vs en memoria

    03:39 min
  • 24
    Buffers

    Buffers

    07:47 min
  • 25
    Streams

    Streams

    11:50 min

Conocer trucos que no quieren que sepas

  • 26
    Benchmarking (console time y timeEnd)

    Benchmarking (console time y timeEnd)

    07:48 min
  • 27
    Debugger

    Debugger

    09:41 min
  • 28
    Error First Callbacks

    Error First Callbacks

    09:32 min

Manejar herramientas con Node

  • 29
    Scraping

    Scraping

    Viendo ahora
  • 30
    Automatización de procesos

    Automatización de procesos

    11:15 min
  • 31
    Aplicaciones de escritorio

    Aplicaciones de escritorio

    10:16 min
Tomar examen

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads
        Victor Contreras

        Victor Contreras

        student•
        hace 6 años

        Me jodio un buen rato el ; del final del require, creo que es importante que para node siempre se use. Pensé que el profesor lo hacía por costumbre... pero no

          Juan Teixeira

          Juan Teixeira

          student•
          hace 6 años

          Gracias por colocar esto, justo me estaba pasando.!

          Ricardo Francisco Sánchez Sánchez

          Ricardo Francisco Sánchez Sánchez

          student•
          hace 6 años

          x2

        Mike Arthur Pinta Pacheco

        Mike Arthur Pinta Pacheco

        student•
        hace 4 años

        Para los que estén en WSL2, y les salga un error de este estilo:

        error while loading shared libraries: libatk-1.0.so.0: cannot open shared object file: No such file or directory

        *Lo de "libatk" puede decir cualquier cosa con lib, prueben el siguiente comando

        sudo apt-get install -y libgbm-dev

        Si y ++SOLO SI++ no les funciona, prueben este comando ++también++

        sudo apt-get install -yq --no-install-recommends libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 libnss3

        En cualquiera de los dos casos les dará un error

        Unable to open X display.

        Al estar en un subsistema, no podemos ver pantallas, por lo que puppeteer en WSL solo funciona removiendole headless.

        Cambiamos esta linea

        const browser = await puppeteer.launch({ headless: false });

        A esto:

        const browser = await puppeteer.launch();

        ⚠️No vamos a poder ver la pagina en el navegador como en la clase, pero recuerden, puppeteer se usa mas que nada para ver una página sin necesidad de cargarla visualmente. Hay más métodos para usar puppeteer en windows, pero este es la manera mas sencilla que he encontrado para que funcione

          Alejandro Medina Castillo

          Alejandro Medina Castillo

          student•
          hace 4 años

          Gracias, este comentario debería tener más likes, fue justo lo que me funciono para WSL

          Enmanuel Josue Sarmiento Benitez

          Enmanuel Josue Sarmiento Benitez

          student•
          hace 4 años

          Gracias tu ayuda me sirvió para poder practicar lo visto bien clase, de resto el código no me funcionaba y veía y veía el código y no encontraba que tenía mal

        Francisco Garcia [C6]

        Francisco Garcia [C6]

        student•
        hace 6 años

        Esto es solo como para saber que existe. Pero para profundizar es necesario ver curso de scrapig o cacharrear.

        const puppeteer = require('puppeteer'); (async () => { console.log('lanzamos navegador'); // const browser = await puppeteer.launch(); const browser = await puppeteer.launch( { headless: false } ); const page = await browser.newPage(); await page.goto('https://es.wikipedia.org/wiki/Node.js'); var titulo1 = await page.evaluate(() => { const h1 = document.querySelector('h1'); console.log(h1.innerHTML); return h1.innerHTML; }); console.log(titulo1); console.log('Cerramos navegador'); browser.close(); console.log('Navegardor cerrado'); }) ();
          José Agustin Rios

          José Agustin Rios

          student•
          hace 6 años

          Gracias por pasarlo en limpio, voy a guardarme el codigo para futuras referencias

          Sergio Arturo Enriquez Nava

          Sergio Arturo Enriquez Nava

          student•
          hace 4 años

          Para este uso scraping se traduce como raspado.

        Cristian Alexander Salazar Atalaya

        Cristian Alexander Salazar Atalaya

        student•
        hace 5 años

        Para los que están en windows corriendo con WSL, he buscando pero al parecer no es posible hacerlo, les recomiendo que creebn otra carpeta limpia y lo hagan con la consola powersell de windows funciona bien.

          Samuel Martínez Hernández

          Samuel Martínez Hernández

          student•
          hace 4 años

          Fue por mucho lo más sencillo, trate de aplicar posibles soluciones de otros comentarios pero me mandaba un error sobre uno de lo módulos. Gracias!

        Carlos Enrique Gonzalez Peña

        Carlos Enrique Gonzalez Peña

        student•
        hace 4 años

        Con Puppeteer no solo podemos leer la informacion de la pagina, tambien podemos lazar eventos de click para editar o ejecutar acciones en dicha pagina, una ves lo utilice para cargar una pagina, buscar un boton y clickearlo, para despues agarrar un texto que aparecia en pantalla la cual era una token y utilizar esta en mis request. Aparte con Puppeteer podemos crear PDFs a patir de HTML, entre otras cosas!

        Puppeteer es hecho por google, recuerdo haber visto el directo cuando lo presentron, dele un ojo a su npm, es muy util el poder saber todas las posibilidades de ese, asi tienen mas maneras de solucionar sus problemas!

          Jose Ever Muñoz Muñoz

          Jose Ever Muñoz Muñoz

          student•
          hace 2 años

          wao puppeteer tiene a un grande detras

        Emanuel Valero

        Emanuel Valero

        student•
        hace 6 años

        En la página de github de puppeteer se puede encontrar más documentación sobre las cosas que este paquete hace. Aca comparto el enlace: https://github.com/puppeteer/puppeteer

        Cristian Daniel Jesus Rios

        Cristian Daniel Jesus Rios

        student•
        hace 5 años
        npm init –y npm i puppeteer
        Jose Daniel Molina

        Jose Daniel Molina

        student•
        hace 6 años

        Un resumen de la clase

        /* Entendiendo web scrapping con puppeteer... Funciona de forma asincrona */ const puppeteer = require('puppeteer'); // Funcion autoejecutable (async () => { console.log('Lanzar el navegador'); // const browser = await puppeteer.launch(); /* {headless: false} lo que hace es que el navegador no se lance en segundo plano */ const browser = await puppeteer.launch({headless: false}); // Abrir una pagina en el navegador const page = await browser.newPage(); // Ir a una pagina await page.goto('https://wikipedia.org/wiki/Node.js'); /* Ejecutar un script, con page.evaluate, lo que hace es evaluar lo que le digamos dentro de la pagina y devolver el resultado */ const titulo1 = await page.evaluate(() => { const h1 = document.querySelector('h1'); return h1.innerHTML; }); console.log(titulo1); // Usamos browser.close para cerrar el navegador despues de haber extraido los datos; console.log('Cerrando el navegador'); browser.close(); console.log('Navegador cerrado'); })();```
        Bruno Amadori

        Bruno Amadori

        student•
        hace 6 años

        Qué divertido y que ganas de programar bots que me dió esto jaja.

        José Barrios Pulido

        José Barrios Pulido

        student•
        hace 6 años

        Las función que describe el profesor se llaman IIFE: Funciones que se ejecutan tan pronto como se definen: https://developer.mozilla.org/es/docs/Glossary/IIFE

        Hans Roche

        Hans Roche

        student•
        hace 5 años

        Me daba error no abria Chrome, lo pude solucionar así:

        const puppeteer = require("puppeteer"); const PATHS = { win32: { executablePath: "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe", userDataDir: "C:\\Users\\TuNombreDeUsuario\\AppData\\Local\\Temp\\puppeteer_user_data", }, linux: { executablePath: "/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe", userDataDir: "/mnt/c/Users/TuNombreDeUsuario/AppData/Local/Temp/puppeteer_user_data", }, }; (async () => { console.log("Lanzamos navegador!"); const browser = await puppeteer.launch({ headless: false, executablePath: PATHS[process.platform].executablePath, userDataDir: PATHS.win32.userDataDir, defaultViewport: null, }); const page = await browser.newPage(); await page.goto("https://es.wikipedia.org/wiki/Node.js"); console.log("Cerramos Navegador..."); // browser.close(); console.log("Navegador cerrado"); })();
        Pablo Daniel Amé

        Pablo Daniel Amé

        student•
        hace 4 años

        Muy Muy poderoso, para los que tienen problemas con puppeteer en wsl2 lo solucione de la siguiente manera:

        Instalar chrome en wsl2 siguiendo este tutorial: Link

        en el codigo agregar está linea

        const browser = await puppeteer.launch({ args: [ '--disable-gpu', '--disable-dev-shm-usage', '--disable-setuid-sandbox', '--no-first-run', '--no-sandbox', '--no-zygote', '--single-process', ] }); // default is true
          christopher montiel

          christopher montiel

          student•
          hace 3 años

          Buenísimo me solucionaste la vida amigo!! muchas gracias!

        alam angel gutierrez vazquez

        alam angel gutierrez vazquez

        student•
        hace 4 años

        Sí tienen problemas instalando puppeteer:

        • reintenten el comando
        npm init –y
        • y después reintenten la instalación
        npm i puppeteer
        Esteban Cifuentes

        Esteban Cifuentes

        student•
        hace 4 años

        Para los que utilizan wsl2 esta es la mejor solucion que pude encontrar

        const browser = await puppeteer.launch({ args: [ '--disable-gpu', '--disable-dev-shm-usage', '--disable-setuid-sandbox', '--no-first-run', '--no-sandbox', '--no-zygote', '--single-process', ] });```
          Víctor Isaac Arias García

          Víctor Isaac Arias García

          student•
          hace 4 años

          Genial con esta linea me funciono el scraping en WSL2

        Ernesto Vizcaíno Alvarado

        Ernesto Vizcaíno Alvarado

        student•
        hace 6 años

        Curso de web Scraping

          Lizardo Reyes

          Lizardo Reyes

          student•
          hace 5 años

          Si, pero con python

          Cristhian Calderón

          Cristhian Calderón

          student•
          hace 2 años

          no aparece el curso de webscraping

        Marcial Ambriz

        Marcial Ambriz

        student•
        hace 5 años

        Yo tuve un problema al lanzar el navegador por que uso la consola WSL en VS code, lo logre con cmd, solo tuve que reinstalar puppeteer para que cargara de nuevo chromium y desde CMD ejecutar el código

        Wilson Fernando Antury Torres

        Wilson Fernando Antury Torres

        student•
        hace 6 años

        Función auto-ejecutable: ( async () => { } ) ()

          Felix Torres Javier Antonio

          Felix Torres Javier Antonio

          student•
          hace 3 años

          Mejor conocida como:

          IIFE (Immediately Invoked Function Expression)

          https://developer.mozilla.org/en-US/docs/Glossary/IIFE

        Raphael Hinostroza

        Raphael Hinostroza

        student•
        hace 6 años

        Me aparece el siguiente error:

        (node:8521) UnhandledPromiseRejectionWarning: Error: Failed to launch the browser process!

        Posdata: No puedo subir imágenes arrastrándolo al comentario.

          Ivan Sevilla

          Ivan Sevilla

          student•
          hace 6 años

          Me pasó lo mismo. Me mostraba esto:

          (node:5136) UnhandledPromiseRejectionWarning: Error: Failed to launch the browser process! spawn C:\Users\ivano\Documents\Cursos-Platzi\Fundamentos-de-NodeJS\handle-tools-with-node\scraping\node_modules\puppeteer\.local-chromium\win64-756035\chrome-win\chrome.exe ENOENT

          Lo que enes que hacer es ir al directorio que te aparece y te vas a dar cuenta que no está chrome.exe. Entonces lo que tenes que hacer es descomprimir chrome-win que en mi casa se encontraba en

          C:\Users\ivano\Documents\Cursos-Platzi\Fundamentos-de-NodeJS\handle-tools-with-node\scraping\node_modules\puppeteer\.local-chromium

          Una vez que lo descomprimir lo moves a la carpeta win64-756035 y borras lo que habia antes en esa carpeta

          De acá saque la solucion

          Arturo Mauricio Terceros Beltrán

          Arturo Mauricio Terceros Beltrán

          student•
          hace 5 años

          Con que descomprimiste? Algun comando?

        Leonardo Angelit Gálvez

        Leonardo Angelit Gálvez

        student•
        hace 4 años

        Está genial! Lo probé creand un servidor en node y mostrando ahí el listado de cursos que tengo en Platzi, con su badge y enlace al diploma, como idea para la web personal 🙈

        Alexander Nova Arevalo

        Alexander Nova Arevalo

        student•
        hace 6 años
        const puppeteer = require('puppeteer') const run = async ()=> { const browser = await puppeteer.launch() const page = await browser.newPage() // TOMAR UN SCREENSHOT // await page.goto('https://platzi.com/cursos/html5-css3/opiniones/1/'); // await page.screenshot({ // path: 'screenshot.png', // fullPage: true // }) async function getPageData() { await page.goto('https://platzi.com/cursos/html5-css3/opiniones/1/'); const data = await page.evaluate(()=>{ const $reviews = document.querySelectorAll('.Review') const data = [] $reviews.forEach(($reviews)=>{ let description = $reviews .querySelector('.Review-description') .textContent .trim() let name = $reviews .querySelector('.Review-info .Review-name strong') .textContent .trim() let starts = $reviews .querySelector('.Review-info .Review-stars') .querySelectorAll('.fulled') .length data.push({ content: description, name: name, starts : starts }) }) return { reviews: data, } }) console.log("DATA,", data); } getPageData() // await browser.close() } run()