{"id":84,"date":"2025-03-20T00:02:30","date_gmt":"2025-03-20T00:02:30","guid":{"rendered":"https:\/\/elbrinner.com\/?p=84"},"modified":"2025-04-03T06:40:31","modified_gmt":"2025-04-03T06:40:31","slug":"script-basico-en-node-js-para-web-scraping","status":"publish","type":"post","link":"https:\/\/elbrinner.com\/index.php\/2025\/03\/20\/script-basico-en-node-js-para-web-scraping\/","title":{"rendered":"Script B\u00e1sico en Node.js para Web Scraping"},"content":{"rendered":"<p>\u00bfTe has planteado alguna vez c\u00f3mo extraer datos de una web pero no sab\u00edas por d\u00f3nde empezar? Este script de web scraping en Node.js es una soluci\u00f3n sencilla y accesible para dar tus primeros pasos.<\/p>\n<p>En un mundo donde la informaci\u00f3n es clave, herramientas como esta te permiten alimentar tu propio sistema RAG (Retrieval-Augmented Generation) con datos propios o ajustados a tus necesidades, especialmente cuando esa informaci\u00f3n no est\u00e1 disponible en otros formatos<\/p>\n<h3>\u00bfC\u00f3mo funciona este script?<\/h3>\n<p>El coraz\u00f3n del script son dos herramientas clave: <strong>Axios<\/strong>, que nos ayuda a hacer solicitudes HTTP, y <strong>Cheerio<\/strong>, una librer\u00eda que permite manejar el HTML como si tuvieras las capacidades de jQuery en <strong>Nodejs<\/strong>. En palabras simples, el script hace esto:<\/p>\n<ol start=\"1\">\n<li><strong>Busca enlaces en la web<\/strong>:\n<ul>\n<li>Cuando le das una URL, el script localiza todos los enlaces disponibles en esa p\u00e1gina.<\/li>\n<li>Los convierte en URLs completas (absolutas), listas para ser exploradas.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Extrae texto limpio de las p\u00e1ginas<\/strong>:\n<ul>\n<li>Una vez tiene los enlaces, se encarga de visitar cada uno y recolectar datos importantes como el t\u00edtulo, la meta descripci\u00f3n y el texto principal.<\/li>\n<li>Si necesitas centrarte en ciertos elementos o eliminar partes irrelevantes, puedes usar selectores CSS para incluir o excluir secciones espec\u00edficas.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Guarda los datos<\/strong>:\n<ul>\n<li>Toda la informaci\u00f3n extra\u00edda se almacena en archivos JSON dentro de una carpeta llamada <strong>scraped_pages<\/strong>. El nombre del archivo est\u00e1 basado en el t\u00edtulo de la p\u00e1gina, lo que facilita encontrar lo que buscas.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3>\u00bfC\u00f3mo puedes usarlo?<\/h3>\n<p><strong>Preparativos<\/strong>:<\/p>\n<p><span style=\"font-family: -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';\">Descarga el script desde mi repositorio <a href=\"https:\/\/github.com\/elbrinner\/webscraper\">https:\/\/github.com\/elbrinner\/webscraper\u00a0<\/a><\/span><\/p>\n<p>Antes de ejecutarlo, instala las dependencias con:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">npm install axios cheerio<\/pre>\n<p><strong>Lanzar el script en tu terminal en la ruta ra\u00edz<\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">node scraper.js &lt;https:\/\/www.miurl.com&gt; &lt;selectores_incluir&gt; &lt;selectores_excluir&gt;\r\n<\/pre>\n<p>Ejemplo de ejecuci\u00f3n con este blog<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">node scraper.js https:\/\/elbrinner.com h3,p nav,footer,.site-branding\r\n<\/pre>\n<h3>Explicaci\u00f3n de los par\u00e1metros:<\/h3>\n<ol start=\"1\">\n<li><code>https:\/\/elbrinner.com<\/code>: Es la URL principal del dominio que deseas analizar.<\/li>\n<li><code>h3,p<\/code>: Los elementos a <strong>incluir<\/strong> (en este caso, texto de encabezados <code>&lt;h3&gt;<\/code> y p\u00e1rrafos <code>&lt;p&gt;<\/code>).<\/li>\n<li><code>nav,footer,.site-branding<\/code>: Los elementos a <strong>excluir<\/strong>. Esto incluye:\n<ul>\n<li>La etiqueta <code>&lt;nav&gt;<\/code> (barra de navegaci\u00f3n).<\/li>\n<li>La etiqueta <code>&lt;footer&gt;<\/code> (pie de p\u00e1gina).<\/li>\n<li>Cualquier elemento que tenga la clase <code>.site-branding<\/code>.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3><strong>Resultado final<\/strong><\/h3>\n<p>Despu\u00e9s de procesar la p\u00e1gina, el script guardar\u00e1 un archivo JSON por enlace dentro del dominio principal con los datos obtenidos en la carpeta scraped_pages. Ese archivo incluir\u00e1:<\/p>\n<ul>\n<li>T\u00edtulo de la p\u00e1gina.<\/li>\n<li>Descripci\u00f3n (meta description, si existe).<\/li>\n<li>Contenido textual limpio basado en los selectores que hayas indicado.<\/li>\n<\/ul>\n<p>Ejemplo:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\">{\r\n  \"fecha\": \"2025-04-03T00:24:25.223Z\",\r\n  \"url\": \"https:\/\/elbrinner.com\/index.php\/tag\/net\/\",\r\n  \"titulo\": \".Net \u2013 Elbrinner Fernandes\",\r\n  \"descripcion\": \"\",\r\n  \"contenido\": \"Estaba desarrollando una aplicaci\u00f3n con Composer Frameworks que manejaba una gran cantidad de tokens, y not\u00e9 que la respuesta del asistente era considerablemente lenta. Al analizar el c\u00f3digo de Composer, una de las ventajas de ser de c\u00f3digo abierto, identifiqu\u00e9 el cuello de botella. La idea era seguir aprovechando el modo low-code, pero implementando una \u2026 Leer m\u00e1sEn este art\u00edculo hablaremos de OutSystems, una plataforma low-code que permite crear desarrollos complejos de forma \u00e1gil en menor tiempo comparado con los desarrollos tradicionales. Una de las ventajas de OutSystems en comparaci\u00f3n a otras plataformas low-code, es la flexibilidad al desarrollar, permite crear extensiones de .Net por ejemplo. Esto abre un abanico de posibilidades a la \u2026 Leer m\u00e1sSeguimos con nuestras sesiones ense\u00f1ando lo que conocemos de MAUI. En esta ocasi\u00f3n, vamos a impartir un taller en el que crearemos una aplicaci\u00f3n MAUI sencilla, para ense\u00f1ar buenas pr\u00e1cticas a la hora de trabajar con el framework. Creaci\u00f3n de Views y ViewModels Uso de servicios Localizaci\u00f3n de recursos Navegaci\u00f3n Dependency injection \u2026 El taller ser\u00e1 impartido por Elbrinner y Jorge, organizadores de grupo MobileDevelopment , pero como en todas las ocaciones, cualquiera puede participar abriendo el micro y traslad\u00e1ndonos sus opiniones. Twitter Elbrinner: @elbrinner Twitter Jorge: @jorgedcrespoDesarrollo de aplicaciones hibridas con MAUI\/Blazor, analizaremos las ventajas e inconvenientes de dicha tecnolog\u00eda, veremos un caso pr\u00e1ctico en Visual Studio y finalmente mostraremos una aplicaci\u00f3n desarrollada con esta tecnol\u00f3gia disponible en Microsoft Store.Meetup @Mobile Development por Ismael Sanchez Web: https:\/\/ismael.leasplace.net.Net ADA-002 Ai Search AI Services Android Asistente Azure OpenAI Azure Video Indexer Blazor C# Capacitor Certificaci\u00f3n Composer IONIC IOS MAUI MVP SUMMIT NodeJS OpenAi Outsystems PWA Stream Windows\"\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>Como cualquier herramienta b\u00e1sica, este script tiene sus limitaciones. No puede manejar sitios que cargan contenido din\u00e1mico con tecnolog\u00edas como Angular, React o Vue, ya que generan su contenido en el navegador. Para estos casos, herramientas como Puppeteer o Selenium podr\u00edan ser mejores opciones.<\/p>\n<p>Es crucial tener en cuenta que algunos dominios cuentan con medidas de protecci\u00f3n espec\u00edficas contra web scrapers, lo que puede impedir que el script funcione correctamente. Antes de proceder a extraer informaci\u00f3n, recuerda siempre revisar las pol\u00edticas de uso del sitio web en cuesti\u00f3n. Muchas p\u00e1ginas requieren obtener permisos previos y por escrito para realizar cualquier tipo de scraping. Respetar estas reglas no solo es una buena pr\u00e1ctica, sino que tambi\u00e9n ayuda a evitar problemas legales o \u00e9ticos.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfTe has planteado alguna vez c\u00f3mo extraer datos de una web pero no sab\u00edas por d\u00f3nde empezar? Este script de web scraping en Node.js es una soluci\u00f3n sencilla y accesible para dar tus primeros pasos. En un mundo donde la informaci\u00f3n es clave, herramientas como esta te permiten alimentar tu propio sistema RAG (Retrieval-Augmented Generation) &#8230; <a title=\"Script B\u00e1sico en Node.js para Web Scraping\" class=\"read-more\" href=\"https:\/\/elbrinner.com\/index.php\/2025\/03\/20\/script-basico-en-node-js-para-web-scraping\/\" aria-label=\"Leer m\u00e1s sobre Script B\u00e1sico en Node.js para Web Scraping\">Leer m\u00e1s<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[23],"tags":[57,58,26,56],"class_list":["post-84","post","type-post","status-publish","format-standard","hentry","category-nodejs","tag-code","tag-github","tag-nodejs","tag-webscraper"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/posts\/84","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/comments?post=84"}],"version-history":[{"count":4,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/posts\/84\/revisions"}],"predecessor-version":[{"id":88,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/posts\/84\/revisions\/88"}],"wp:attachment":[{"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/media?parent=84"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/categories?post=84"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/tags?post=84"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}