Breaking

Post Top Ad

Your Ad Spot

viernes, 5 de julio de 2019

Web Scraping con Node.js

Introducción

Por definición, el raspado web significa obtener información útil de las páginas web. El proceso debería eliminar la molestia de tener que navegar por las páginas manualmente, ser automatizado y permitir recopilar y clasificar la información que le interesa mediante programación.
Node.js es una gran herramienta para usar para raspar web. Permite la aplicación de rutinas de raspado web en un par de líneas de código utilizando el módulo de código abierto proporcionado por npm- el gestor de paquetes de nodo .

Los pasos principales del raspado web

Como ya hemos definido, el raspado web no es más que automatizar la navegación manual y la recopilación de información de sitios web específicos en su navegador web preferido.
Este proceso consta de los 3 pasos principales:
  • Obteniendo el código fuente HTML del sitio web
  • Dando sentido al contenido HTML, encontrando la información que nos interesa y extrayéndola
  • Mover la información descubierta al almacenamiento de su elección (archivo de texto, base de datos, etc.)
Los primeros y últimos pasos suelen ser prácticamente los mismos, según los requisitos de su aplicación. Sin embargo, dar sentido al contenido HTML requiere que escriba un código específico para cada sitio web que desee borrar.

Precaución

Dependiendo de su uso de estas técnicas y tecnologías, su aplicación podría estar realizando acciones ilegales
Hay algunos casos en los que querría ser cauteloso acerca de:
  • DoS : un ataque de denegación de servicio se basa prácticamente en el envío de tantas solicitudes al servidor que simplemente no puede manejar más. Todas las nuevas solicitudes entrantes serán denegadas. Si está raspando un sitio web con demasiada frecuencia, puede considerarse un ataque DoS .
  • Términos de servicio : muchos sitios web, y casi todos los sitios web más grandes establecen claramente que está prohibido raspar web en sus plataformas. Si mucha gente raspara estos sitios web, terminaría siendo un ataque DDoS , que por sí mismo es ilegal.
  • Software abusivo : muchas herramientas y marcos en línea ofrecen una gran variedad de herramientas y funcionalidades. Algunos permiten a los usuarios rellenar formularios, enviar datos, cargar y descargar archivos, etc. CAPTCHA se utiliza para combatir esto, sin embargo, incluso esto se puede superar con un bot.

Algoritmo de raspado web manual

Como ejemplo, buscaremos en las Páginas Amarillas lascompañías que prestan servicios de impresión en Nueva York.
En primer lugar, definamos nuestra tarea y el resultado deseado:
Elabore una lista de las compañías que prestan servicios de impresión en Nueva York en forma de un archivo ".CSV" que debe tener el nombre de la empresa, correo electrónico, teléfono y columnas de enlace que describan a cada compañía.
Así es como lo haríamos manualmente:
  1. Navegue por nuestro navegador hasta el enlace apropiado y coloque "imprimir" y "Nueva York" en los campos de búsqueda y ejecute la búsqueda
  2. Seleccione y almacene el nombre de la primera compañía en la lista
  3. Almacena el enlace a la página de la empresa y síguelo.
  4. Encuentra una dirección de correo electrónico y guárdala.
  5. Escriba los valores almacenados en un archivo ".CSV" usando un editor de texto u otra herramienta para editar tablas como Excel o Google Sheets
Repetir estos pasos varias veces nos dará una tabla llena de detalles de la compañía.

Automatizando el proceso con raspado web

Para automatizar el proceso, debemos seguir los mismos pasos programáticamente.
¿Necesitas ayuda? Automatice las partes difíciles y pruebe un servicio como ScraperAPI.com para manejar proxies, navegadores y más. ¡Haz clic aquí para obtener un 10% de descuento con Stack Abuse!

Configuración del entorno de desarrollo

Usaremos Node.js y npmdesarrollaremos este proyecto de ejemplo. Así que asegúrese de que esas herramientas estén instaladas en su máquina y comencemos ejecutando el siguiente comando en un directorio vacío de su elección, seguido de la creación de una index.jspágina vacía que contendrá nuestro código:
$ npm init
El siguiente paso es instalar los módulos requeridos desde el npm.
Del algoritmo manual descrito anteriormente, vemos que necesitaremos algo para obtener el código fuente HTML, analizar el contenido y darle sentido, y luego escribir la matriz de objetos JavaScript en el archivo ".CSV":
$ npm install --save request request-promise cheerio objects-to-csv
La ejecución de la línea anterior en el terminal instalará los módulos necesarios en el node_modulesdirectorio y los guardará como dependencias en el package.jsonarchivo.

Recuperación de información

Una vez que haya terminado toda la preparación, puede abrir el index.jsarchivo en su editor de texto favorito y solicitar los módulos que acabamos de instalar:
const rp = require('request-promise');  
const otcsv = require('objects-to-csv');  
const cheerio = require('cheerio');  
Completar este paso en el algoritmo manual nos dará el enlace, que dividiremos en dos partes y agregaremos a la index.jsderecha después de los módulos:
const baseURL = 'https://www.yellowpages.com';  
const searchURL = '/search?search_terms=printing&geo_location_terms=New+York%2C+NY';  
Luego, deberíamos escribir una función, que devolverá la matriz de objetos JavaScript que representan a las compañías a partir de la descripción de la tarea.
Para poder traducir el algoritmo manual en código, primero tendremos que hacer un trabajo manual utilizando la inspectorherramienta de nuestro navegador web.
Necesitaremos encontrar los elementos HTML específicos que contienen la información que nos interesa. En nuestro caso, el nombre de la empresa podría encontrarse en un elemento como:
<a class="business-name" href="/new-york-ny/mip/global-copy-2988131?lid=1000106255864" itemprop="name">Global Copy</a>  
web_scraping_with_node_js
Que es una <a>etiqueta con la clase business-name, que contiene el nombre de la empresa y una hrefpropiedad que contiene un enlace a la página de la empresa individual. Ambos serán útiles para nosotros en el futuro.
Siguiendo el enlace a la página de la empresa, necesitaremos encontrar los dos datos restantes: el teléfono y el correo electrónico. Se encuentran debajo de las <p>etiquetas con la clase phoney la <a>etiqueta con la clase email-business.
web_scraping_with_node_js
web_scraping_with_node_js
Tome nota de que para obtener el teléfono, necesitaremos el valor almacenado dentro de la etiqueta y para recibir un correo electrónico, necesitaremos una hrefpropiedad de la <a>etiqueta.
Veamos cómo se verá el algoritmo manual cuando intentemos implementarlo mediante programación:
  1. Obtenga la fuente HTML de la página que buscamos eliminar utilizando el request-promisemódulo y dándole un enlace que obtuvimos en el primer paso de nuestro algoritmo manual
  2. Asigne la matriz de los nombres de la compañía en el HTML original a una matriz de objetos con el nombre, el enlace, el teléfono y el correo electrónico de las propiedades
  3. Convertir la matriz resultante en un archivo CSV
Así es como se verá este algoritmo cuando se implemente:
const getCompanies = async () => {  
  const html = await rp(baseURL + searchURL);
  const businessMap = cheerio('a.business-name', html).map(async (i, e) => {
    const link = baseURL + e.attribs.href;
    const innerHtml = await rp(link);
    const emailAddress = cheerio('a.email-business', innerHtml).prop('href');
    const name = e.children[0].data;
    const phone = cheerio('p.phone', innerHtml).text();

    return {
      emailAddress,
      link,
      name,
      phone,
    }
  }).get();
  return Promise.all(businessMap);
};
Sigue las reglas que configuramos anteriormente y devuelve una Promiseque se resuelve en una matriz de objetos JavaScript:
{
  "emailAddress": "mailto:globalcopyny@yahoo.com",
  "link": "https://www.yellowpages.com/new-york-ny/mip/global-copy-2988131?lid=1000106255864",
  "name": "Global Copy",
  "phone": "(212) 222-2679"
}

Promesa

En caso de que no esté familiarizado con los conceptos centrales de la programación asíncrona en JavaScript moderno, aquí tiene una breve introducción a Promises.
Promisees un tipo especial que actúa como un marcador de posición para el valor. Podría ser en un par de estados:
  • pendiente
  • cumplido
  • rechazado
Sin llegar a ser demasiado detallado al respecto, solo debe saber que las funciones que devuelven promesas, no devuelven los valores reales. Para obtener acceso al resultado de la Promesa o el valor de la resolución, debe escribir otra función, que debe pasarse al thenbloque y esperar el valor con el que la Promesa se resolverá. Si ocurre algún error dentro de la Promesa mientras se encuentra pending, entonces pasará al rejectedestado con la posibilidad de manejar el error en el catchbloque.

Almacenamiento de datos y toques finales

Aunque el resultado parece bastante bueno, si observamos más detenidamente la variedad de compañías, nos muestra que el correo electrónico tiene un mailto:prefijo innecesario y que a veces faltan los correos electrónicos y los nombres de las compañías:
{
  "emailAddress": undefined,
  "link": "https://www.yellowpages.com/new-york-ny/mip/apm-451909424?lid=451909424",
  "name": undefined,
  "phone": "(212) 856-9800"
}
Al volver a la herramienta de inspección, vemos que el nombre de la empresa también se puede encontrar en la página interna de la empresa dentro de una <h1>etiqueta.
Los correos electrónicos a veces faltan para ciertas compañías y no podemos hacer nada al respecto.
El mailto:prefijo podría ser eliminado mediante el uso de una replacefunción.
Aquí están los ajustes que debe hacer a su código:
...
    const name = e.children[0].data || cheerio('h1', innerHtml).text();
...
    emailAddress: emailAddress ? emailAddress.replace('mailto:', '') : '',
...
Ahora que hemos extraído todos los datos necesarios de la página web y tenemos una matriz limpia de objetos JavaScript, podemos preparar el archivo ".CSV" requerido por nuestra definición de tarea:
getCompanies()  
  .then(result => {
    const transformed = new otcsv(result);
    return transformed.toDisk('./output.csv');
  })
  .then(() => console.log('SUCCESSFULLY COMPLETED THE WEB SCRAPING SAMPLE'));
La getCompaniesfunción devuelve una promesa que se resuelve en una matriz de objetos preparados para ser escritos en el archivo CSV, que se realiza en el primer thenbloque. El segundo se resuelve cuando el archivo CSV se escribe correctamente en el sistema de archivos, completando así la tarea.
Agregando este fragmento de código a nuestro index.jsarchivo y ejecutándolo con:
$ node index.js
Debemos obtener un output.csvarchivo correcto en nuestro directorio de trabajo. La tabla que representa este .CSVarchivo contiene 4 columnas - emailAddresslinknamephone, y cada fila describe una sola empresa.

Conclusión

En esencia, el raspado web es navegar por páginas web, recoger información útil de acuerdo con la tarea y almacenarla en algún lugar, todo lo cual se hace de manera programática. Para poder hacer esto con el código, este proceso se debe realizar primero manualmente con una inspectorherramienta del navegador o analizando el contenido HTML sin procesar de la página web de destino.
Aunque, debido a todos los marcos de JavaScript de front-end que se utilizan en la actualidad, no siempre es tan fácil. Es posible que deba representar HTML con JS para obtener el HTML que necesita. En casos como este, recomendamos utilizar un servicio como ScraperAPI.compara manejarlo por usted.
Node.js proporciona herramientas confiables y simples para hacer del raspado web una tarea sencilla que podría ahorrarle mucho tiempo en comparación con el procesamiento manual de los enlaces.
Aunque puede parecer tentador automatizar todas sus tareas diarias como esta, pero tenga cuidado cuando use estas herramientas, ya que es fácil violar los términos de servicio de un sitio web si no lo ha leído por completo, o simplemente generando una gran cantidad de tráfico con su raspador.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas