Raspado web con Node.js

 

 

 

  • SmashingConf Nueva York 2024
  • Smart Interface Design Patterns, 10h video + UX training

  • Índice
    1. Módulos
      1. Pedido
      2. animador
    2. Implementación
      1. En tu navegador
      2. En tu código
    3. Yendo más allá: minería de datos
      1. Descargando la búsqueda de Google
      2. Extrayendo las palabras de cada página
      3. Analizando nuestras palabras
    4. En conclusión
      1. Otras lecturas

    A medida que ha aumentado el volumen de datos en la web, el web scraping se ha generalizado cada vez más y han surgido varios servicios potentes para simplificarlo. Puede utilizar Node.js para crear un potente web scraper que sea extremadamente versátil y completamente gratuito. Para este artículo se recomienda un conocimiento básico de Node.js; Entonces, si aún no lo has hecho, compruébalo antes de continuar. Además, el web scraping puede violar los términos de servicio de algunos sitios web, así que asegúrese de estar a salvo antes de realizar cualquier scraping intenso.

     

    El web scraping es el proceso de recuperar información de Internet mediante programación. A medida que ha aumentado el volumen de datos en la web, esta práctica se ha generalizado cada vez más y han surgido varios servicios potentes para simplificarla. Desafortunadamente, la mayoría de ellos son costosos, limitados o tienen otras desventajas. En lugar de recurrir a uno de estos recursos de terceros, puede utilizar Node.js para crear un potente web scraper que es extremadamente versátil y completamente gratuito.

    En este artículo, cubriré lo siguiente:

    • dos módulos de Node.js, Request y Cheerio, que simplifican el web scraping;
    • una aplicación introductoria que recupera y muestra algunos datos de muestra;
    • una aplicación más avanzada que encuentra palabras clave relacionadas con las búsquedas de Google.

    Además, vale la pena señalar algunas cosas antes de continuar: para este artículo se recomienda un conocimiento básico de Node.js ; Entonces, si aún no lo has hecho, compruébalo antes de continuar. Además, el web scraping puede violar los términos de servicio de algunos sitios web, así que asegúrese de estar a salvo antes de realizar cualquier scraping intenso.

     

    Módulos

    Para incorporar los módulos de Node.js que mencioné anteriormente, usaremos NPM , el Administrador de paquetes de Node (si has oído hablar de Bower, es así, excepto que usas NPM para instalar Bower). NPM es una utilidad de administración de paquetes que se instala automáticamente junto con Node.js para que el proceso de uso de módulos sea lo más sencillo posible. De forma predeterminada, NPM instala los módulos en una carpeta denominada node_modulesen el directorio donde lo invoca, así que asegúrese de llamarlo en la carpeta de su proyecto.

    Y sin más preámbulos, aquí están los módulos que usaremos.

    Pedido

    Si bien Node.js proporciona métodos simples para descargar datos de Internet a través de interfaces HTTP y HTTPS, debe manejarlos por separado, por no hablar de las redirecciones y otros problemas que aparecen cuando comienza a trabajar con web scraping. El módulo Solicitud fusiona estos métodos, abstrae las dificultades y le presenta una única interfaz unificada para realizar solicitudes. Usaremos este módulo para descargar páginas web directamente a la memoria. Para instalarlo, ejecútelo npm install requestdesde su terminal en el directorio donde se ubicará su archivo principal Node.js.

    animador

    Cheerio le permite trabajar con datos web descargados utilizando la misma sintaxis que emplea jQuery. Para citar la copia en su página de inicio, "Cheerio es una implementación rápida, flexible y sencilla de jQuery diseñada específicamente para el servidor". Incorporar Cheerio nos permite centrarnos en los datos que descargamos directamente, en lugar de analizarlos. Para instalarlo, ejecútelo npm install cheeriodesde su terminal en el directorio donde se ubicará su archivo principal Node.js.

    Implementación

    El siguiente código es una pequeña aplicación rápida para obtener la temperatura de un sitio web meteorológico. Ingresé mi código de área al final de la URL que estamos descargando, pero si quieres probarlo, puedes poner el tuyo allí (solo asegúrate de instalar primero los dos módulos que intentamos requerir; puede aprender cómo hacerlo a través de los enlaces que se proporcionan arriba).

    var request = require("request"), cheerio = require("cheerio"), url = "https://www.wunderground.com/cgi-bin/findweather/getForecast?query=" + 02888;request(url, function (error, response, body) { if (!error) { var $ = cheerio.load(body), temperature = $("[data-variable='temperature'] .wx-value").html(); console.log("It’s " + temperature + " degrees Fahrenheit."); } else { console.log("We’ve encountered an error: " + error); }});

    ¿Entonces que hacemos aqui? Primero, requerimos nuestros módulos para poder acceder a ellos más adelante. Luego, estamos definiendo la URL que queremos descargar en una variable.

     

    Luego, usamos el módulo Solicitar para descargar la página en la URL especificada anteriormente a través de la requestfunción. Pasamos la URL que queremos descargar y una devolución de llamada que manejará los resultados de nuestra solicitud. Cuando se devuelven esos datos, se invoca esa devolución de llamada y se pasan tres variables error: responsey body. Si Request encuentra un problema al descargar la página web y no puede recuperar los datos, pasará un objeto de error válido a la función y la variable del cuerpo será nula. Antes de empezar a trabajar con nuestros datos, comprobaremos que no hay ningún error; si los hay, simplemente los registraremos para poder ver qué salió mal.

    Si todo está bien, le pasamos nuestros datos a Cheerio. Luego, podremos manejar los datos como lo haríamos con cualquier otra página web, utilizando la sintaxis estándar de jQuery. Para encontrar los datos que queremos, tendremos que crear un selector que tome los elementos que nos interesan de la página. Si navega a la URL que utilicé para este ejemplo en su navegador y comienza a explorar la página con herramientas de desarrollo, notará que el gran elemento de temperatura verde es para el que construí un selector. Finalmente, ahora que tenemos nuestro elemento, es una simple cuestión de tomar esos datos y registrarlos en la consola.

    Podemos llevarlo a muchos lugares desde aquí. Te animo a que juegues y te resumí los pasos clave a continuación. Son los siguientes.

    En tu navegador

    1. Visite la página que desea extraer en su navegador y asegúrese de registrar su URL.
    2. Encuentre los elementos de los que desea obtener datos y encuentre un selector jQuery para ellos.

    En tu código

    1. Utilice la solicitud para descargar la página en su URL.
    2. Pase los datos devueltos a Cheerio para que pueda obtener su interfaz similar a jQuery.
    3. Utilice el selector que escribió anteriormente para extraer sus datos de la página.

    Yendo más allá: minería de datos

    Los usos más avanzados del web scraping a menudo se pueden clasificar como minería de datos , el proceso de descargar una gran cantidad de páginas web y generar informes basados ​​en los datos extraídos de ellas. Node.js se adapta bien a aplicaciones de esta naturaleza. Viajes y turismo

    Escribí una pequeña aplicación de minería de datos en Node.js, de menos de cien líneas, para mostrar cómo usaríamos las dos bibliotecas que mencioné anteriormente en una implementación más complicada. La aplicación encuentra los términos más populares asociados con una búsqueda específica de Google analizando el texto de cada una de las páginas vinculadas en la primera página de resultados de Google.

    Hay tres fases principales en esta aplicación:

    1. Examina la búsqueda de Google.
    2. Descargue todas las páginas y analice todo el texto de cada página.
    3. Analiza el texto y presenta las palabras más populares.

    Echaremos un vistazo rápido al código necesario para que cada una de estas cosas suceda; como puedes imaginar, no mucho.

     

    Descargando la búsqueda de Google

    Lo primero que tendremos que hacer es averiguar qué páginas vamos a analizar. Como veremos páginas extraídas de una búsqueda de Google, simplemente buscamos la URL de la búsqueda que queremos, la descargamos y analizamos los resultados para encontrar las URL que necesitamos.

    Para descargar la página usamos Request, como en el ejemplo anterior, y para analizarla usaremos Cheerio nuevamente. Así es como se ve el código:

    request(url, function (error, response, body) { if (error) { console.log(“Couldn’t get page because of error: “ + error); return; } // load the body of the page into Cheerio so we can traverse the DOM var $ = cheerio.load(body), links = $(".r a"); links.each(function (i, link) { // get the href attribute of each link var url = $(link).attr("href"); // strip out unnecessary junk url = url.replace("/url?q=", "").split("")[0]; if (url.charAt(0) === "/") { return; } // this link counts as a result, so increment results totalResults++;

    En este caso, la variable URL que estamos pasando es una búsqueda en Google del término "minería de datos".

    Como puede ver, primero hacemos una solicitud para obtener el contenido de la página. Luego, cargamos el contenido de la página en Cheerio para que podamos consultar el DOM para los elementos que contienen los enlaces a los resultados pertinentes. Luego, recorremos los enlaces y eliminamos algunos parámetros de URL adicionales que Google inserta para su propio uso; cuando descargamos las páginas con el módulo Solicitud, no queremos ninguno de esos parámetros adicionales.

    Finalmente, una vez que hayamos hecho todo eso, nos aseguramos de que la URL no comience con a /; si es así, es un enlace interno a otra cosa de Google y no queremos intentar descargarlo, porque el La URL tiene un formato incorrecto para nuestros propósitos o, incluso si no lo estuviera, no sería relevante.

    Extrayendo las palabras de cada página

    Ahora que tenemos las URL de nuestras páginas, debemos extraer las palabras de cada página. Este paso consiste en hacer prácticamente lo mismo que hicimos arriba, solo que, en este caso, la variable URL se refiere a la URL de la página que encontramos y procesamos en el bucle anterior.

    request(url, function (error, response, body) { // load the page into Cheerio var $page = cheerio.load(body), text = $page("body").text();

    Nuevamente, usamos Request y Cheerio para descargar la página y obtener acceso a su DOM. Aquí usamos ese acceso para obtener solo el texto de la página.

    A continuación, necesitaremos limpiar el texto de la página; tendrá todo tipo de basura que no queremos, como mucho espacio en blanco adicional, estilo y, en ocasiones, incluso algún que otro dato JSON. . Esto es lo que tendremos que hacer:

    1. Comprime todos los espacios en blanco en espacios individuales.
    2. Deseche todos los caracteres que no sean letras o espacios.
    3. Convierte todo a minúsculas.

    Una vez que hayamos hecho eso, simplemente podemos dividir nuestro texto en espacios y nos quedará una matriz que contiene todas las palabras representadas en la página. Luego podemos recorrerlos y agregarlos a nuestro corpus.

     

    El código para hacer todo eso se ve así:

    // Throw away extra white space and non-alphanumeric characters.text = text.replace(/s+/g, " ") .replace(/[^a-zA-Z ]/g, "") .toLowerCase();// Split on spaces for a list of all the words on that page and // loop through that list.text.split(" ").forEach(function (word) { // We don't want to include very short or long words because they're // probably bad data. if (word.length 20) { return; } if (corpus[word]) { // If this word is already in our corpus, our collection // of terms, increase the count for appearances of that // word by one. corpus[word]++; } else { // Otherwise, say that we've found one of that word so far. corpus[word] = 1; }});

    Analizando nuestras palabras

    Una vez que tengamos todas nuestras palabras en nuestro corpus, podemos recorrerlas y ordenarlas por popularidad. Primero, necesitaremos colocarlos en una matriz, porque el corpus es un objeto.

    // stick all words in an arrayfor (prop in corpus) { words.push({ word: prop, count: corpus[prop] });}// sort array based on how often they occurwords.sort(function (a, b) { return b.count - a.count;});

    El resultado será una matriz ordenada que representa exactamente con qué frecuencia se ha utilizado cada palabra en todos los sitios web desde la primera página de resultados de la búsqueda de Google. A continuación se muestra un conjunto de resultados de muestra para el término "minería de datos". (Casualmente, utilicé esta lista para generar la nube de palabras en la parte superior de este artículo).

    [ { word: 'data', count: 981 }, { word: 'mining', count: 531 }, { word: 'that', count: 187 }, { word: 'analysis', count: 120 }, { word: 'information', count: 113 }, { word: 'from', count: 102 }, { word: 'this', count: 97 }, { word: 'with', count: 92 }, { word: 'software', count: 81 }, { word: 'knowledge', count: 79 }, { word: 'used', count: 78 }, { word: 'patterns', count: 72 }, { word: 'learning', count: 70 }, { word: 'example', count: 70 }, { word: 'which', count: 69 }, { word: 'more', count: 68 }, { word: 'discovery', count: 67 }, { word: 'such', count: 67 }, { word: 'techniques', count: 66 }, { word: 'process', count: 59 } ]

    Si está interesado en ver el resto del código, consulte la fuente completamente comentada .

    Un buen ejercicio de ahora en adelante sería llevar esta aplicación al siguiente nivel. Podría optimizar el análisis del texto, ampliar la búsqueda a varias páginas de resultados de Google e incluso eliminar palabras comunes que no sean realmente términos clave (como "eso" y "de"). También se podría agregar más manejo de errores para hacer que la aplicación sea aún más robusta: cuando estás extrayendo datos, necesitas tantas capas de redundancia como puedas permitirte razonablemente. La variedad de contenido que obtendrá es tal que inevitablemente encontrará un fragmento de texto inesperado que, si no se maneja, generaría un error y bloquearía rápidamente su aplicación.

    En conclusión

    Como siempre, si encuentra algo relacionado con el web scraping con Node.js que cree que es útil o simplemente tiene preguntas o ideas que desea compartir, asegúrese de hacérnoslo saber a través de los comentarios a continuación. Además, sígueme en Twitter @bovenille y consulta mi blog para obtener más información sobre Node.js, web scraping y JavaScript en general.

    Otras lecturas

    • Herramientas, tutoriales y recursos útiles de Node.js
    • Una introducción detallada a Webpack
    • Navegando con Sails.js: un marco estilo MVC para Node.js
    • El problema con los paquetes de nodos globales

    (il, rb, al, mrn)Explora más en

    • Codificación
    • javascript
    • Nodo.js





    Tal vez te puede interesar:

    1. ¿Deberían abrirse los enlaces en ventanas nuevas?
    2. 24 excelentes tutoriales de AJAX
    3. 70 técnicas nuevas y útiles de AJAX y JavaScript
    4. Más de 45 excelentes recursos y repositorios de fragmentos de código

    Raspado web con Node.js

    Raspado web con Node.js

    SmashingConf Nueva York 2024 Smart Interface Design Patterns, 10h video + UX training Índice Módulos

    programar

    es

    https://pseint.es/static/images/programar-raspado-web-con-node-863-0.jpg

    2024-04-04

     

    Raspado web con Node.js
    Raspado web con Node.js

    Si crees que alguno de los contenidos (texto, imagenes o multimedia) en esta página infringe tus derechos relativos a propiedad intelectual, marcas registradas o cualquier otro de tus derechos, por favor ponte en contacto con nosotros en el mail [email protected] y retiraremos este contenido inmediatamente

     

     

    Top 20