La guía definitiva para el web scraping con Node.js

Entonces, ¿qué es el web scraping de todos modos? Implica automatizar la laboriosa tarea de recopilar información de sitios web.

Hay muchos casos de uso para web scraping: es posible que desee recopilar precios de varios sitios de comercio electrónico para un sitio de comparación de precios. O quizás necesite horarios de vuelo y listados de hoteles / AirBNB para un sitio de viajes. Tal vez desee recopilar correos electrónicos de varios directorios para clientes potenciales de ventas o usar datos de Internet para entrenar modelos de aprendizaje automático / IA. ¡O incluso podrías querer construir un motor de búsqueda como Google!

Comenzar con el web scraping es fácil y el proceso se puede dividir en dos partes principales:

  • adquirir los datos mediante una biblioteca de solicitudes HTML o un navegador sin cabeza,
  • y analizar los datos para obtener la información exacta que desea.

Esta guía lo guiará a través del proceso con el popular módulo de solicitud y promesa de Node.js, CheerioJS y Puppeteer. Al trabajar con los ejemplos de esta guía, aprenderá todos los consejos y trucos que necesita para convertirse en un profesional en la recopilación de los datos que necesita con Node.js.

Recopilaremos una lista de todos los nombres y cumpleaños de los presidentes de EE. UU. De Wikipedia y los títulos de todas las publicaciones en la página principal de Reddit.

Lo primero es lo primero: instalemos las bibliotecas que usaremos en esta guía (Puppeteer tardará un poco en instalarse, ya que también necesita descargar Chromium).

Haciendo tu primera solicitud

A continuación, abramos un nuevo archivo de texto (nombre el archivo potusScraper.js) y escribamos una función rápida para obtener el HTML de la página de Wikipedia "Lista de presidentes".

Salida:

Usando Chrome DevTools

¡Genial, obtuvimos el HTML sin procesar de la página web! Pero ahora tenemos que darle sentido a esta enorme masa de texto. Para hacer eso, necesitaremos usar Chrome DevTools para permitirnos buscar fácilmente a través del HTML de una página web.

Usar Chrome DevTools es fácil: simplemente abra Google Chrome y haga clic derecho en el elemento que desea raspar (en este caso, hago clic derecho en George Washington, porque queremos obtener enlaces a todas las páginas de Wikipedia de los presidentes individuales) :

Ahora, simplemente haga clic en inspeccionar y Chrome mostrará su panel DevTools, lo que le permitirá inspeccionar fácilmente el código fuente HTML de la página.

Analizando HTML con Cheerio.js

Impresionante, Chrome DevTools ahora nos muestra el patrón exacto que deberíamos buscar en el código (una etiqueta "grande" con un hipervínculo dentro). Usemos Cheerio.js para analizar el HTML que recibimos anteriormente para devolver una lista de enlaces a las páginas individuales de Wikipedia de los presidentes de EE. UU.

Salida:

Verificamos para asegurarnos de que haya exactamente 45 elementos devueltos (el número de presidentes de EE. UU.), Lo que significa que no hay etiquetas "grandes" ocultas adicionales en otras partes de la página. Ahora, podemos revisar y obtener una lista de enlaces a las 45 páginas presidenciales de Wikipedia obteniéndolas de la sección "atributos" de cada elemento.

Salida:

Ahora tenemos una lista de las 45 páginas presidenciales de Wikipedia. Creemos un nuevo archivo (llamado potusParse.js), que contendrá una función para tomar una página presidencial de Wikipedia y devolver el nombre y el cumpleaños del presidente. Lo primero es lo primero, obtengamos el HTML sin procesar de la página de Wikipedia de George Washington.

Salida:

Usemos una vez más Chrome DevTools para encontrar la sintaxis del código que queremos analizar, de modo que podamos extraer el nombre y la fecha de nacimiento con Cheerio.js.

Entonces vemos que el nombre está en una clase llamada "firstHeading" y el cumpleaños está en una clase llamada "bday". Modifiquemos nuestro código para usar Cheerio.js para extraer estas dos clases.

Salida:

Poniendolo todo junto

¡Perfecto! Ahora vamos a resumir esto en una función y exportarlo desde este módulo.

Ahora volvamos a nuestro archivo original potusScraper.js y solicitemos el módulo potusParse.js. Luego, lo aplicaremos a la lista de wikiUrls que reunimos anteriormente.

Salida:

Representación de páginas JavaScript

¡Voilà! Una lista de los nombres y cumpleaños de los 45 presidentes de Estados Unidos. Usar solo el módulo de solicitud-promesa y Cheerio.js debería permitirle raspar la gran mayoría de los sitios en Internet.

Sin embargo, recientemente, muchos sitios han comenzado a utilizar JavaScript para generar contenido dinámico en sus sitios web. Esto causa un problema para la solicitud-promesa y otras bibliotecas de solicitudes HTTP similares (como axios y fetch), porque solo obtienen la respuesta de la solicitud inicial, pero no pueden ejecutar JavaScript de la forma en que lo hace un navegador web.

Por lo tanto, para extraer sitios que requieren la ejecución de JavaScript, necesitamos otra solución. En nuestro siguiente ejemplo, obtendremos los títulos de todas las publicaciones en la página principal de Reddit. Veamos qué sucede cuando intentamos usar request-promise como hicimos en el ejemplo anterior.

Salida:

Así es como se ve la salida:

Hmmm ... no es exactamente lo que queremos. Esto se debe a que para obtener el contenido real es necesario ejecutar JavaScript en la página. Con Puppeteer, eso no es problema.

Puppeteer es un nuevo módulo extremadamente popular presentado por el equipo de Google Chrome que le permite controlar un navegador sin cabeza. Esto es perfecto para raspar mediante programación páginas que requieren la ejecución de JavaScript. Obtengamos el HTML de la página principal de Reddit usando Puppeteer en lugar de request-promise.

Salida:

¡Agradable! ¡La página está llena del contenido correcto!

Ahora podemos usar Chrome DevTools como hicimos en el ejemplo anterior.

Parece que Reddit está poniendo los títulos dentro de las etiquetas "h2". Usemos Cheerio.js para extraer las etiquetas h2 de la página.

Salida:

Recursos adicionales

¡Y ahí está la lista! En este punto, debería sentirse cómodo escribiendo su primer raspador web para recopilar datos de cualquier sitio web. A continuación, se incluyen algunos recursos adicionales que pueden resultarle útiles durante su viaje de raspado web:

  • Lista de servicios proxy de web scraping
  • Lista de útiles herramientas de raspado web
  • Lista de sugerencias de web scraping
  • Comparación de proxies de web scraping
  • Documentación de Cheerio
  • Documentación titiritero