• ¡Obtenga la seguridad de la aplicación de la manera correcta! Detectar, proteger, monitorear, acelerar y más ...
  • El web scraping es una de las cosas más interesantes en el mundo de la codificación.

    ¿Qué es el web scraping?

    ¿Por qué existe?

    Averigüemos las respuestas.

    ¿Qué es el web scraping?

    El web scraping es una tarea automatizada para extraer datos de sitios web.

    Hay muchas aplicaciones de web scraping. Extraer los precios de los productos y compararlos con diferentes Plataformas de comercio electrónico. Obtener una cotización diaria de la web. Construyendo su propio motor de búsqueda como Google, Yahoo, etc., la lista continúa.

    Puede hacer más de lo que piensa con el web scraping. Una vez que sepa cómo extraer los datos de los sitios web, puede hacer lo que quiera con los datos.

    El programa que extrae los datos de los sitios web se denomina raspador web. Aprenderá a escribir web scrapers en JavaScript.

    El raspado web consta principalmente de dos partes.

    • Obtener los datos mediante bibliotecas de solicitudes y un navegador sin cabeza.
    • Analizar los datos para extraer la información exacta que queremos de los datos.

    Sin más preámbulos, comencemos.

    Configuración del proyecto

    Supongo que tiene Node instalado, si no, consulte el Guía de instalación de NodeJS.

    Vamos a utilizar los paquetes node-fetch y cheerio para web scraping en JavaScript. Configuremos el proyecto con npm para que funcione con un paquete de terceros.

    Veamos rápidamente los pasos para completar nuestra configuración.

    • Crea un directorio llamado web_scraping y navega hasta él.
    • Ejecuta el comando npm init para inicializar el proyecto.
    • Responda todas las preguntas según su preferencia.
    • Ahora, instale los paquetes usando el comando
    npm install node-fetch cheerio

    Veamos los destellos de los paquetes instalados.

    búsqueda de nodo

    El paquete node-fetch trae el window.fetch al entorno de node js. Ayuda a realizar las solicitudes HTTP y obtener los datos sin procesar.

    ¡hasta la vista

    El paquete ¡hasta la vista se utiliza para analizar y extraer la información necesaria de los datos sin procesar.

    Dos paquetes node-fetch y cheerio son lo suficientemente buenos para web scraping en JavaScript. No veremos todos los métodos que proporcionan los paquetes. Veremos el flujo de web scraping y los métodos más útiles en ese flujo.

    Aprenderá a raspar web haciéndolo. Entonces, vayamos al trabajo.

    Raspando la lista de la Copa del Mundo de Cricket

    Aquí, en esta sección, haremos un raspado web real.

    ¿Qué estamos extrayendo?

    Por el título de la sección, creo que lo adivinarías fácilmente. Sí, lo que sea que estés pensando es correcto. Extraigamos a todos los ganadores y subcampeones de la copa mundial de cricket hasta ahora.

    • Crea un archivo llamado extract_cricket_world_cups_list.js en el proyecto.
    • Usaremos el Wikipedia Copa del mundo de críquet página para obtener la información deseada.
    • Primero, obtenga los datos sin procesar usando el node-fetch paquete.
    • El siguiente código obtiene los datos sin procesar de la página de Wikipedia anterior.
    const fetch = require("node-fetch");
    
    // function to get the raw data
    const getRawData = (URL) => {
       return fetch(URL)
          .then((response) => response.text())
          .then((data) => {
             return data;
          });
    };
    
    // URL for data
    const URL = "https://en.wikipedia.org/wiki/Cricket_World_Cup";
    
    // start of the program
    const getCricketWorldCupsList = async () => {
       const cricketWorldCupRawData = await getRawData(URL);
       console.log(cricketWorldCupRawData);
    };
    
    // invoking the main function
    getCricketWorldCupsList();
    

    Obtuvimos los datos sin procesar de la URL. Ahora es el momento de extraer la información que necesitamos de los datos sin procesar. Usemos el paquete cheerio para extraer los datos.

    Extraer datos que involucran etiquetas HTML con cheerio es pan comido. Antes de entrar en los datos reales, veamos algunos ejemplos de análisis de datos usando cheerio.

    • Analizar los datos HTML usando cheerio.load el método.
    const parsedSampleData = cheerio.load(
          `<div id="container"><p id="title">I'm title</p></div>`
       );
    • Hemos analizado el código HTML anterior. Cómo extraer el p etiquetar contenido de él? Es lo mismo que los selectores en la manipulación DOM de JavaScript.

    console.log(parsedSampleData("#title").text());

    Puede seleccionar las etiquetas que desee. Puede consultar diferentes métodos de la sitio web oficial de cheerio.

    • Ahora es el momento de extraer la lista de la copa del mundo. Para extraer la información, necesitamos conocer las etiquetas HTML que la información se encuentra en la página. Ve a la página de Wikipedia de la copa mundial de cricket e inspeccione la página para obtener información sobre las etiquetas HTML.

    Aquí está el código completo.

    const fetch = require("node-fetch");
    const cheerio = require("cheerio");
    
    // function to get the raw data
    const getRawData = (URL) => {
       return fetch(URL)
          .then((response) => response.text())
          .then((data) => {
             return data;
          });
    };
    
    // URL for data
    const URL = "https://en.wikipedia.org/wiki/Cricket_World_Cup";
    
    // start of the program
    const getCricketWorldCupsList = async () => {
       const cricketWorldCupRawData = await getRawData(URL);
    
       // parsing the data
       const parsedCricketWorldCupData = cheerio.load(cricketWorldCupRawData);
    
       // extracting the table data
       const worldCupsDataTable = parsedCricketWorldCupData("table.wikitable")[0]
          .children[1].children;
    
       console.log("Year --- Winner --- Runner");
       worldCupsDataTable.forEach((row) => {
          // extracting `td` tags
          if (row.name === "tr") {
             let year = null,
                winner = null,
                runner = null;
    
             const columns = row.children.filter((column) => column.name === "td");
    
             // extracting year
             const yearColumn = columns[0];
             if (yearColumn) {
                year = yearColumn.children[0];
                if (year) {
                   year = year.children[0].data;
                }
             }
    
             // extracting winner
             const winnerColumn = columns[3];
             if (winnerColumn) {
                winner = winnerColumn.children[1];
                if (winner) {
                   winner = winner.children[0].data;
                }
             }
    
             // extracting runner
             const runnerColumn = columns[5];
             if (runnerColumn) {
                runner = runnerColumn.children[1];
                if (runner) {
                   runner = runner.children[0].data;
                }
             }
    
             if (year && winner && runner) {
                console.log(`${year} --- ${winner} --- ${runner}`);
             }
          }
       });
    };
    
    // invoking the main function
    getCricketWorldCupsList();
    

    Y aquí están los datos extraídos.

    Year --- Winner --- Runner
    1975 --- West Indies --- Australia
    1979 --- West Indies --- England
    1983 --- India --- West Indies
    1987 --- Australia --- England
    1992 --- Pakistan --- England
    1996 --- Sri Lanka --- Australia
    1999 --- Australia --- Pakistan
    2003 --- Australia --- India
    2007 --- Australia --- Sri Lanka
    2011 --- India --- Sri Lanka
    2015 --- Australia --- New Zealand
    2019 --- England --- New Zealand

    Genial 😎, ¿está en eso?

    Plantilla de raspado

    Obtener los datos sin procesar de la URL es común en todos los proyectos de raspado web. La única parte que cambia es la extracción de datos según el requisito. Puede probar el siguiente código como plantilla.

    const fetch = require("node-fetch");
    const cheerio = require("cheerio");
    const fs = require("fs");
    // function to get the raw data
    const getRawData = (URL) => {
       return fetch(URL)
          .then((response) => response.text())
          .then((data) => {
             return data;
          });
    };
    // URL for data
    const URL = "https://example.com/";
    // start of the program
    const scrapeData = async () => {
       const rawData = await getRawData(URL);
       // parsing the data
       const parsedData = cheerio.load(rawData);
       console.log(parsedData);
       // write code to extract the data
       // here
       // ...
       // ...
    };
    // invoking the main function
    scrapeData();

    Conclusión

    Ha aprendido a raspar una página web. Ahora es tu turno de practicar la codificación.

    También te sugiero que revises los populares marcos de web scraping para explorar y soluciones de raspado web basadas en la nube.

    Codificación feliz 🙂