El web scraping es un proceso para extraer información útil de la World Wide Web. Durante una búsqueda en Google, un rastreador web (bot), es decir, el crawler, recorre casi todo el contenido de la web y selecciona lo que es relevante para usted.

Esta idea de que la información o el conocimiento deben ser accesibles para todos condujo a la formación de la World Wide Web. Sin embargo, los datos que usted busca deben estar permitidos para uso público.

¿Cuál es la utilidad del web scraping?

Vivimos en la era de los datos. Los datos en bruto pueden convertirse en información útil que puede utilizarse para un fin mayor con la ayuda del web scraping. Se puede utilizar para analizar y estudiar a los usuarios de un producto para mejorar el producto, en otras palabras, para crear un bucle de retroalimentación.

Las empresas de comercio electrónico pueden utilizarlo para estudiar las estrategias de precios de la competencia y, en consecuencia, elaborar las suyas propias. El web scraping también puede utilizarse para la información meteorológica y las noticias.

Desafíos

#1. Restricción de IP

Varios sitios web limitan el número de solicitudes que puede realizar para obtener los datos del sitio en un intervalo de tiempo determinado mediante la detección de su dirección IP o geolocalización. Lo hacen para evitar ataques maliciosos a su sitio web.

#2. Captcha

Distinguir entre un humano real y un bot que intenta acceder al sitio web es lo que realmente hacen los captchas. Los sitios web lo utilizan para evitar el spam en el sitio web, así como para controlar el número de scrapers en el sitio web.

#3. Renderizado del lado del cliente

Este es uno de los mayores obstáculos para los raspadores web. Los sitios web modernos utilizan marcos frontales capaces de crear aplicaciones de una sola página. La mayoría de las aplicaciones de una sola página no tienen contenido renderizado en el servidor.

En su lugar, generan el contenido según sea necesario utilizando javascript del lado del cliente. Esto hace que sea difícil para los raspadores saber cuál es el contenido de una página web. Para obtener el contenido, es necesario renderizar algo de javascript del lado del cliente.

La API de Geekflare

Una API de raspado web resuelve la mayoría de los desafíos a los que se enfrenta al realizar el raspado web, ya que se encarga de todo por usted. Exploremos la API de Geekflare y veamos cómo puede utilizarla para el web scraping.

La API de Geekflare tiene un sencillo proceso de tres pasos para usted:

  • Proporcionar una URL para raspar
  • Proporcione algunas opciones de configuración
  • Obtener los datos

Puede raspar la página web para usted y luego devolver los datos HTML sin procesar como una cadena o en un archivo HTML al que se puede acceder a través de un enlace, cualquiera que sea la forma que funcione para usted.

Uso de la API

En este tutorial aprenderá a utilizar la API de Geekflare utilizando NodeJS, un entorno de ejecución javascript. Instale NodeJS en su sistema si no lo ha hecho antes de continuar.

  • Dentro de una nueva carpeta, cree un archivo llamado index.mjs. La razón detrás de la extensión mjs es que queremos que este archivo sea considerado como un módulo ES en lugar de un archivo Common JS. Compruebe la diferencia entre módulos ES y archivos Common JS.
  • Ejecute el comando npm init -y en el terminal en la carpeta o directorio actual. Creará un archivo package . json para usted.
  • Dentro del archivo package. json, cambie el valor de la clave principal a index.mjs si por defecto es otro. Alternativamente, también puede añadir un tipo de clave y establecer su valor igual a module.
{
  "tipo": "módulo"
}
  • Añada una dependencia llamada axios ejecutando el comando npm i axios en el terminal. Esta dependencia nos ayuda a realizar peticiones fetch a endpoints específicos.
  • Su package.json debería ser algo como esto
{
  "name": "webscraping",
  "version": "1.0.0",
  "descripción": "",
  "main": "index.mjs",
  "scripts": {
    "test": "echo "Error: no se ha especificado ninguna prueba" && exit 1"
  },
  "autor": "Murtuzaali Surti",
  "licencia": "ISC",
  "dependencias": {
    "axios": "^1.1.3"
  }
}
  • Importe axios dentro del archivo index.mjs así. Aquí se utiliza la palabra clave import porque se trata de un módulo ES. Si fuera un archivo commonJS, habría sido la palabra clave require.
import axios from 'axios'
  • La URL base para todas nuestras peticiones a la API de Geekflare será la misma para cada endpoint. Por lo tanto, puede almacenarla dentro de una constante.
const baseUrl = 'https://api.geekflare.com/es'
  • Especifique la URL de la que desea hacer el scrape y obtener los datos.
let toScrapeURL = "https://developer.mozilla.org/en-US/"
  • Cree una función asíncrona e inicialice axios dentro de ella.
async function obtenerDatos() {
    const res = await axios({})
    return res
}
  • En las opciones de configuración de axios, debe especificar el método como post, la URL junto con el endpoint, una cabecera conocida como x-api-key cuyo valor será la clave API proporcionada por Geekflare y por último, un objeto de datos que será enviado a la API de Geekflare. Puede obtener su clave API entrando en dash.geekflare.com/es.
const res = await axios({
    método "post",
    url: `${baseUrl}/webscraping`,
    cabeceras: {
        "x-api-key": "su clave api"
    },
    datos: {
        url: toScrapeURL,
        salida: 'archivo',
        dispositivo: 'escritorio',
        renderJS: true
    }
})
  • Como puede ver, el objeto de datos tiene las siguientes propiedades:
    • url: la URL de la página web que debe ser raspada.
    • output: el formato en el que se le presentan los datos, ya sea inline como cadena o en un archivo HTML. Inline string es el valor por defecto.
    • dispositivo: el tipo de dispositivo en el que desea que se abra la página web. Acepta tres valores, ‘escritorio’, ‘móvil’ y ‘tableta’, siendo ‘escritorio’ el valor por defecto.
    • renderJS: un valor booleano para especificar si desea renderizar javascript o no. Esta opción es útil cuando se trata de renderizado del lado del cliente.
  • Si desea una lista completa de las opciones de configuración, lea la documentación oficial de la API de Geekflare.
  • Llame a la función asíncrona y obtenga los datos. Puede utilizar una IIFE (Expresión de Función Invocada Inmediatamente).
(async () => {
    const datos = await obtenerDatos()
    console.log(datos.datos)
})()
  • La respuesta será algo como esto
{
  marca de tiempo 1669358356779,
  apiStatus: 'éxito',
  apiCode: 200,
  meta: {
    url: 'https://murtuzaalisurti.github.io',
    dispositivo: 'escritorio',
    salida: 'archivo',
    blockAds: true,
    renderJS: true,
    prueba: { id: 'mvan3sa30ajz5i8lu553tcckchkmqzr6' }
  },
  datos: 'https://api-assets.geekflare.com/es/tests/web-scraping/pbn0v009vksiszv1cgz8o7tu.html'
}

Análisis de HTML

Para analizar HTML, puede utilizar un paquete npm llamado node-html-parser y también para extraer datos de HTML. Por ejemplo, si desea extraer el título de una página web, puede hacerlo:

import { parse } from 'node-html-parser'
const html = parse(htmlData) // htmlData es la cadena html sin procesar que obtiene de la API de Geekflare.

Alternativamente, si sólo desea los metadatos de un sitio web, puede utilizar el punto final de la API de metadatos de Geekflare. Ni siquiera tiene que analizar el HTML.

Ventajas de utilizar la API de Geekflare

En las aplicaciones de una sola página, el contenido a menudo no se renderiza en el servidor, sino que lo renderiza el navegador mediante javascript. Por lo tanto, si raspa la URL original sin renderizar el javascript necesario para renderizar el contenido, no obtendrá nada más que un elemento contenedor sin contenido. Permítame mostrarle un ejemplo.

Aquí hay un sitio web de demostración construido usando react y vitejs. Raspe este sitio usando la API de Geekflare con la opción renderJS establecida en false. ¿Qué obtuvo?

<body&gt
    <div id="root"></div&gt
<body&gt

Sólo hay un contenedor raíz sin contenido. Aquí es donde la opción renderJS entra en acción. Ahora intente raspar el mismo sitio con la opción renderJS establecida en true. ¿Qué obtiene?

<body&gt
    <div id="root"&gt
        <div class="App"&gt
            <div&gt
                <a href="https://vitejs.dev" target="_blank"&gt
                    <img src="/vite.svg" class="logo" alt="Logo de Vite"&gt
                </a&gt
                <a href="https://reactjs.org" target="_blank"&gt
                    <img src="/assets/react.35ef61ed.svg" class="logo react" alt="logo React"&gt
                </a&gt
            </div&gt
            <h1>Vite React</h1&gt
            <div class="tarjeta"&gt
                <button>cuenta es 0</button&gt
                <p>Edita <code>src/App.jsx y guarda para probar HMRHaga clic en los logotipos de Vite y React para obtener más información  

Otra ventaja de utilizar la API de Geekflare es que le permite utilizar un proxy rotativo para que pueda asegurarse de que no se producirá ningún bloqueo de IP por parte del sitio web. La API de Geekflare incluye la función de proxy en su plan premium.

Palabras finales

Utilizar una API de raspado web le permite centrarse únicamente en los datos raspados sin demasiadas complicaciones técnicas. Aparte de eso, la API de Geekflare también proporciona funciones como comprobación de enlaces rotos, meta scraping, estadísticas de carga del sitio web, captura de pantalla, estado del sitio y mucho más. Todo ello bajo una única API. Consulte la documentación oficial de la API de Geekflare para obtener más información.