Seleccionar página

Como en casi todos los lenguajes, en node también podemos hacer web scrapping con NodeJS o lo que significa también: podemos obtener y manipular información de sitios webs a través de peticiones http. La particularidad de NodeJS en el web scrapping, es que con NodeJS podremos hacer peticiones en paralelo, lo que para las tareas de manipulación de información llega a ser realmente útil sobre todo por velocidad. Además si te quedas leyendo hasta el final, te comentaré una posibilidad extra para hacer un web scrapping más avanzado con NodeJS que posiblemente no conocías y que probablemente te de mucho que pensar.

Dejo de darte hype y vamos primero a lo sencillo.

Web scrapping con NodeJS: La guía definitiva

Antes de pasar al código, te hago una breve introducción donde te explico los conceptos básicos que vamos a nombrar. Si ya los conoces puedes ir directo al grano haciendo clic aquí.

Qué es el web scrapping y por qué con NodeJS

Web scrapping es una técnica que es utilizada para extraer información desde páginas webs. Si conocemos cómo funcionan las peticiones en internet, cuando navegamos con nuestro navegador, éste realiza peticiones HTTP a los servidores que nosotros le pedimos desde la url a la que accedemos. Si conseguimos crear estas peticiones desde un lenguaje, es decir, simular que somos un navegador web creando las peticiones con código, y mandarlas a un servidor, podemos manipular la información que éste servidor responde. Y qué es la respuesta del servidor, básicamente headers de información sobre la respuesta (cosa que no nos importará mucho o más bien poco o nada), y su respuesta, que es el contenido de la web que queremos hacer web scrapping.

Así que pseudocodeando la idea, quiero extraer información de amazon.es, necesito hacer una petición para obtener una respuesta. Por lo tanto si eko quisiera comprar galletas en amazon, tendría que abrir su navegador e ir a amazon. Esto se traduciría como una petición GET https://www.amazon.es. Ahora si eko usa el buscador, hace exáctamente lo mismo pero con parámetros GET para la búsqueda.

Para ahorrar peticiones, podemos simplemente hacer el GET a la url de búsqueda:

Esquema metafórico de peticiones y respuestas

Esquema metafórico de peticiones y respuestas. PD: cibergalleta = cookie de navegador

Como observamos, la respuesta en html es interpretada por el navegador lo que hace que se muestre así. El problema viene al localizar las partes del contenido que nosotros queremos llevarnos de este web scrapping y extraerlas. Realmente esto en NodeJS se hace bastante sencillo, ya que para todo aquello que quieras hacer vas a encontrar un paquete que instalar con métodos que prácticamente te recordará al javascript (e incluso jQuery) de toda la vida.

Todo esto es genial, pero ¿por qué hacer web scrapping con NodeJS?

Como ya he mencionado antes, todo este sistema de peticiones para web scrapping lo puedes hacer con cualquier otro lenguaje. La diferencia más importante que ofrece hacer webs scrapping con NodeJS son las peticiones en paralelo. Por cada ejecución de un programa en cualquier lenguaje estructurado como C o PHP, las peticiones irían 1 a 1 esperando la petición del servidor, la respuesta y finalmente la manipulación de la información. Con NodeJS podemos hacer esa carga en paralelo, y poner todos los procesos a procesarse al mismo tiempo.

Muy bien, iniciemos nuestro proyecto de web scrapping en NodeJS. Qué necesitamos para empezar

  • Tener instalado NodeJS & NPM. Importantísimo.
  • Una carpeta donde vayamos a tener el proyecto
  • Ejecutar en esa carpeta desde un terminal npm init y rellenar la ficha del programa (realmente si estás probando simplemente con un nombre podéis darle a enter enter enter…)

Creo que el ejemplo más divertido sería hacer web scrapping en Amazon, pero eso te lo dejo como tarea. Realmente no es útil hacer web scrapping en Amazon si conocemos la API (muy fácil de usar, también hay un paquete npm de Amazon), ya que habría algunos elementos que no podríamos obtener, como por ejemplo todos aquellos elementos que son cargados usando peticiones asíncronas (por ejemplo un código javascript que por ajax carga las imágenes de los productos). Pero no te desanimes, te lo explicaré cómo lograr renderizar javascript con NodeJS al final.

Entonces vamos a hacer algo básico, y no a irnos mucho más por las ramas. Vamos a extraer diferente información y a mostrarla vía protocolo http en un puerto.

Ejemplo práctico de web scrapping con NodeJS. Aplicación del tiempo

Vamos a extraer las consultas que nos devuelva google según parámetros GET que nosotros enviemos a nuestro servidor web haciendo uso del protocolo HTTP. Hacer esto es realmense sencillo con Express, además, el ejemplo es tan sencillo que no tendremos apenas configuración para la respuesta. Si vas a hacer reiteradas consultas, recuerda que Google se puede rayar con que seas un bot, cosa de que pasemos un captcha entrando en google desde nuestro navegador.

En la carpeta del proyecto, creamos un archivo index.js (o como le hayas asignado como nombre de entrada cuando utilizaste npm init). Y vamos a