Qué es el web scraping
Independientemente del lenguaje de programación que elijas, es necesario que comprendas cómo funcionan los rastreadores web. Estos conocimientos son fundamentales para escribir el script y conseguir, al final, una herramienta que funcione correctamente.
Las ventajas del web scraping
No cuesta imaginar que un bot que se encargue de toda la investigación por ti es mucho mejor que copiar la información a mano. Las ventajas aumentan exponencialmente si necesitas grandes cantidades de datos. Si estás entrenando un algoritmo de aprendizaje automático, por ejemplo, un rastreador web puede ahorrarte meses de trabajo.

Para mayor claridad, repasemos todas las formas en que los rastreadores web te ayudan:
- Dedica menos tiempo a las tareas tediosas: esta es la ventaja más evidente. Los rastreadores extraen datos tan rápido como tarda tu navegador en cargar la página. Proporciona al bot una lista de URL y obtendrás su contenido al instante.
- Consigue una mayor precisión en los datos: las manos humanas conllevan inevitablemente errores humanos. En cambio, el bot siempre extraerá toda la información tal y como se presenta y la analizará siguiendo tus instrucciones.
- Mantén una base de datos organizada: a medida que recopilas datos, puede resultar cada vez más difícil llevar un control de todo. El rastreador no solo recopila contenido, sino que también lo almacena en el formato que más te facilite el trabajo.
- Utiliza información actualizada: en muchas situaciones, los datos cambian de un día para otro. Por ejemplo, basta con fijarse en los mercados bursátiles o en los listados de las tiendas online. Con unas pocas líneas de código, tu bot puede rastrear las mismas páginas a intervalos fijos y actualizar tu base de datos con la información más reciente.
WebScrapingAPI se ha creado para ofrecerte todas esas ventajas y, al mismo tiempo, sortear todos los obstáculos con los que suelen encontrarse los rastreadores en la web. Todo esto suena muy bien, pero ¿cómo se traduce en proyectos reales?
Casos de uso del web scraping
Hay muchas formas diferentes de utilizar los rastreadores web. ¡Las posibilidades son infinitas! Sin embargo, algunos casos de uso son más habituales que otros.

Veamos cada situación con más detalle:
- Optimización para motores de búsqueda: analizar las páginas de resultados de búsqueda en busca de tus palabras clave es una forma fácil y rápida de determinar a quién debes superar en el posicionamiento y qué tipo de contenido puede ayudarte a conseguirlo.
- Estudio de mercado: tras comprobar cómo les va a tus competidores en las búsquedas, puedes ir más allá y analizar toda su presencia digital. Utiliza la herramienta de extracción de datos web para ver cómo utilizan el PPC, cómo describen sus productos, qué tipo de modelo de precios aplican, etc. Básicamente, toda la información pública está al alcance de tu mano.
- Protección de la marca: la gente está hablando de tu marca. Lo ideal sería que todo fueran comentarios positivos, pero eso no está garantizado. Un bot está perfectamente equipado para rastrear sitios web de reseñas y redes sociales, y avisarte cada vez que se mencione tu marca. Digan lo que digan, estarás preparado para defender los intereses de tu marca.
- Generación de clientes potenciales: tender un puente entre tu equipo de ventas y los posibles clientes en Internet no suele ser fácil. Sin embargo, resulta mucho más sencillo si utilizas un bot de web scraping para recopilar información de contacto en registros empresariales en línea, como las Páginas Amarillas o LinkedIn.
- Marketing de contenidos: crear contenido de alta calidad requiere mucho trabajo, de eso no hay duda. No solo hay que encontrar fuentes fiables y una gran cantidad de información, sino también descubrir qué tono y enfoque le gustarán a tu público. Por suerte, esos pasos se vuelven sencillos si cuentas con un bot que se encargue del trabajo pesado.
Hay muchos otros ejemplos. Por supuesto, también podrías desarrollar una forma totalmente nueva de aprovechar la extracción de datos. Siempre fomentamos el uso creativo de nuestra API.
Los retos del web scraping
Por muy útiles que sean los rastreadores web, no todo es color de rosa. A algunos sitios web no les gusta que los visiten los bots. No es difícil programar tu rastreador para evitar sobrecargar el sitio web visitado, pero su cautela frente a los bots está justificada. Al fin y al cabo, es posible que el sitio no sea capaz de distinguir entre un bot «educado» y uno malicioso.
Como consecuencia, los rastreadores se enfrentan a algunos retos cuando están en funcionamiento.

Los obstáculos más problemáticos son:
- Bloqueo de direcciones IP: hay varias formas de determinar si un visitante es una persona o una máquina. Sin embargo, la medida a tomar tras identificar un bot es mucho más sencilla: el bloqueo de la dirección IP. Aunque esto no suele ocurrir si se toman las precauciones necesarias, sigue siendo recomendable disponer de un conjunto de servidores proxy para poder seguir extrayendo datos aunque se bloquee una dirección IP.
- Huella digital del navegador: cada solicitud que envías a un sitio web revela también parte de tu información. La dirección IP es el ejemplo más común, pero los encabezados de las solicitudes también proporcionan al sitio datos sobre tu sistema operativo, tu navegador y otros pequeños detalles. Si un sitio web utiliza esta información para identificar quién envía las solicitudes y se da cuenta de que navegas mucho más rápido de lo que lo haría un ser humano, es probable que te bloquee de inmediato.
- Renderización de JavaScript: la mayoría de los sitios web modernos son dinámicos. Es decir, utilizan código JavaScript para personalizar las páginas según el usuario y ofrecer una experiencia más adaptada a sus necesidades. El problema es que los bots sencillos se atascan con ese código, ya que no pueden ejecutarlo. El resultado: el rastreador extrae el código JavaScript en lugar del HTML previsto, que contiene la información relevante.
- Captchas: cuando los sitios web no están seguros de si un visitante es un humano o un bot, lo redirigen a una página de Captcha. Para nosotros, es como mucho una pequeña molestia, pero para los bots suele suponer un obstáculo insuperable, a menos que cuenten con scripts para resolver Captchas.
- Limitación de solicitudes: la forma más sencilla de evitar que los visitantes sobrecarguen el servidor del sitio web es limitar el número de solicitudes que una misma dirección IP puede enviar en un intervalo de tiempo determinado. Una vez alcanzado ese número, es posible que el rastreador tenga que esperar a que termine el tiempo de espera o que tenga que resolver un Captcha. En cualquier caso, esto no beneficia a tu proyecto de extracción de datos.
Comprender la web
Si vas a crear un rastreador web, debes conocer algunos conceptos clave sobre el funcionamiento de Internet. Al fin y al cabo, tu bot no solo utilizará Internet para recopilar datos, sino que también tendrá que pasar desapercibido entre los otros miles de millones de usuarios.
Nos gusta pensar en los sitios web como si fueran libros, y leer una página solo significa pasar a la página correcta y echar un vistazo. En realidad, se parece más a unos telegramas que se envían entre tú y el libro. Pides una página y te la envían. Luego pides la siguiente, y ocurre lo mismo.
Todo este intercambio se realiza a través del HTTP, o Protocolo de Transferencia de Hipertexto. Para que tú, como visitante, puedas ver una página, tu navegador envía una solicitud HTTP y recibe una respuesta HTTP del servidor. El contenido que deseas se incluirá en esa respuesta.
Las solicitudes HTTP se componen de cuatro elementos:
- La URL (Uniform Resource Locator) es la dirección a la que envías las solicitudes. Conduce a un recurso único, que puede ser una página web completa, un solo archivo o cualquier cosa intermedia.
- El método indica qué tipo de acción se desea realizar. El método más habitual es GET, que recupera datos del servidor. A continuación se incluye una lista de los métodos más comunes.
- Los encabezados son fragmentos de metadatos que definen tu solicitud. Por ejemplo, si tienes que proporcionar una contraseña o credenciales para acceder a los datos, estos se incluyen en su encabezado específico. Si deseas recibir los datos específicamente en formato JSON, debes indicarlo en un encabezado. El encabezado «User-Agent» es uno de los más conocidos en el ámbito del web scraping, ya que los sitios web lo utilizan para identificar a los visitantes.
- El cuerpo es la parte general de la solicitud donde se almacenan los datos. Si estás recibiendo contenido, probablemente estará vacío. Por el contrario, cuando quieras enviar información al servidor, la encontrarás aquí.
Tras enviar la solicitud, recibirás una respuesta aunque la solicitud no haya podido obtener ningún dato. La estructura es la siguiente:
- El código de estado es un código de tres dígitos que te permite saber de un vistazo qué ha ocurrido. En resumen, un código que empieza por «2» suele indicar que la operación se ha realizado correctamente, mientras que uno que empieza por «4» indica un error.
- Los encabezados tienen la misma función que sus homólogos. Por ejemplo, si recibes un tipo específico de archivo, el encabezado te indicará el formato.
- El cuerpo también está presente. Si has solicitado contenido mediante GET y la solicitud se ha realizado correctamente, encontrarás los datos aquí.
Las API REST utilizan protocolos HTTP, al igual que los navegadores web. Por lo tanto, si consideras que los rastreadores web en C++ suponen demasiado trabajo, esta información también te resultará útil si decides utilizar WebScrapingAPI, que ya se encarga de todos los retos relacionados con la extracción de datos.
Comprender C++
En cuanto a los lenguajes de programación, no hay nada más clásico que el C y el C++. Este lenguaje apareció en 1985 como la versión perfeccionada del «C con clases».
Aunque el C++ se utiliza para la programación general, no es precisamente el primer lenguaje que se nos ocurriría para crear un rastreador web. Tiene algunas desventajas, pero la idea no carece de méritos. ¿Por qué no los analizamos?
C++ es un lenguaje orientado a objetos, lo que significa que utiliza clases, abstracción de datos y herencia para facilitar la reutilización y la adaptación del código a diferentes necesidades. Dado que los datos se tratan como objetos, resulta más fácil almacenarlos y analizarlos.
Muchos desarrolladores tienen al menos algunos conocimientos de C++. Aunque no lo hayas estudiado en la universidad, es probable que tú (o algún compañero de equipo) sepas algo de C++. Esto se aplica a toda la comunidad de desarrolladores de software, por lo que no te resultará difícil obtener una segunda opinión sobre el código.
C++ es un lenguaje muy escalable. Si empiezas con un proyecto pequeño y decides que el web scraping es lo tuyo, la mayor parte del código es reutilizable. Con unos pocos ajustes aquí y allá, estarás listo para gestionar volúmenes de datos mucho mayores.
Por otro lado, C++ es un lenguaje de programación estático. Aunque esto garantiza una mayor integridad de los datos, no resulta tan útil como los lenguajes dinámicos a la hora de trabajar con Internet.
Además, C++ no es el lenguaje más adecuado para crear rastreadores. Puede que esto no suponga un problema si solo quieres un extractor. Pero si vas a añadir un rastreador para generar listas de URL, C++ no es una buena opción.
Bien, hemos hablado de muchas cosas importantes, pero vayamos al meollo del asunto: programar un rastreador web en C++.
Creación de un rastreador web con C++
Requisitos previos
- Entorno de desarrollo integrado (IDE) de C++. En esta guía, utilizaremos Visual Studio.
- vcpkg es un gestor de paquetes de C/C++ creado y mantenido por Windows
- cpr es una biblioteca de C/C++ para solicitudes HTTP, diseñada como envoltura del clásico cURL e inspirada en la biblioteca requests de Python.
- Gumbo es un analizador sintáctico de HTML escrito íntegramente en C, que ofrece envoltorios para varios lenguajes de programación, incluido C++.
Configurar el entorno
1. Una vez descargado e instalado Visual Studio, crea un proyecto sencillo utilizando la plantilla «Aplicación de consola».

2. Ahora vamos a configurar nuestro gestor de paquetes. Vcpkg ofrece un tutorial muy bien elaborado para que puedas empezar lo antes posible.
Nota: una vez finalizada la instalación, sería conveniente definir una variable de entorno para poder ejecutar vcpkg desde cualquier ubicación del ordenador.
3. Ahora es el momento de instalar las bibliotecas que necesitamos. Si has configurado una variable de entorno, abre cualquier terminal y ejecuta los siguientes comandos:
> vcpkg install cpr
> vcpkg install gumbo
> vcpkg integrate install
Si no has configurado ninguna variable de entorno, solo tienes que ir a la carpeta donde instalaste vcpkg, abrir una ventana de terminal y ejecutar los mismos comandos.
Los dos primeros comandos instalan los paquetes que necesitamos para crear nuestro rastreador, y el tercero nos ayuda a integrar las bibliotecas en nuestro proyecto sin esfuerzo.
Elige un sitio web e inspecciona el HTML
¡Y ya estamos listos! Antes de crear el rastreador web, tenemos que elegir una página web y examinar su código HTML.
Fuimos a Wikipedia y elegimos una página al azar de la sección «¿Sabías que…?». Así que la página que vamos a extraer hoy será el artículo de Wikipedia sobre la defensa de las semillas de amapola, y extraeremos algunos de sus componentes. Pero primero, echemos un vistazo a la estructura de la página. Haz clic con el botón derecho en cualquier parte del artículo, luego en «Inspeccionar elemento» y ¡listo! Ya tenemos el código HTML.

Extraer el título
Ahora podemos empezar a escribir el código. Para extraer la información, tenemos que descargar el HTML en nuestro equipo. Primero, importamos las bibliotecas que acabamos de descargar:
#include <iostream>
#include <fstream>
#include "cpr/cpr.h"
#include "gumbo.h"
A continuación, enviamos una solicitud HTTP al sitio web de destino para recuperar el código HTML.
std::string extract_html_page()
{
cpr::Url url = cpr::Url{"https://en.wikipedia.org/wiki/Poppy_seed_defence"};
cpr::Response response = cpr::Get(url);
return response.text;
}
int main()
{
std::string page_content = extract_html_page();
}
La variable `page_content` contiene ahora el código HTML del artículo, y la utilizaremos más adelante para extraer los datos que necesitamos. Aquí es donde la biblioteca gumbo nos resulta muy útil.
Utilizamos el método `gumbo_parse ` para convertir la cadena ` page_content` anterior en un árbol HTML y, a continuación, llamamos a nuestra función ` search_for_title ` para el nodo raíz.
int main()
{
std::string page_content = extract_html_page();
GumboOutput* parsed_response = gumbo_parse(page_content.c_str());
search_for_title(parsed_response->root);
// free the allocated memory
gumbo_destroy_output(&kGumboDefaultOptions, parsed_response);
}
The called function will traverse the HTML tree in-depth to look for the <h1> tag by making recursive calls. When it finds the title, it’s displaying it in the console and will exit the execution.
void search_for_title(GumboNode* node)
{
if (node->type != GUMBO_NODE_ELEMENT)
return;
if (node->v.element.tag == GUMBO_TAG_H1)
{
GumboNode* title_text = static_cast<GumboNode*>(node->v.element.children.data[0]);
std::cout << title_text->v.text.text << "\n";
return;
}
GumboVector* children = &node->v.element.children;
for (unsigned int i = 0; i < children->length; i++)
search_for_title(static_cast<GumboNode*>(children->data[i]));
}Extrae los enlaces
Se aplica el mismo principio básico al resto de las etiquetas, recorriendo el árbol y obteniendo lo que nos interesa. Recojamos todos los enlaces y extrajamos su atributo href.
void search_for_links(GumboNode* node)
{
if (node->type != GUMBO_NODE_ELEMENT)
return;
if (node->v.element.tag == GUMBO_TAG_A)
{
GumboAttribute* href = gumbo_get_attribute(&node->v.element.attributes, "href");
if (href)
std::cout << href->value << "\n";
}
GumboVector* children = &node->v.element.children;
for (unsigned int i = 0; i < children->length; i++)
{
search_for_links(static_cast<GumboNode*>(children->data[i]));
}
}
¿Lo ves? Es prácticamente el mismo código, salvo por la etiqueta que estamos buscando. El método `gumbo_get_attribute` puede extraer cualquier atributo que le indiquemos. Por lo tanto, puedes utilizarlo para buscar clases, ID, etc.
Es fundamental comprobar si el valor del atributo es nulo antes de mostrarlo. En los lenguajes de programación de alto nivel, esto no es necesario, ya que simplemente se mostrará una cadena vacía, pero en C++, el programa se bloqueará.
Guardar en un archivo CSV
Hay muchos enlaces por todas partes, repartidos por todo el contenido. Y además, este era un artículo muy breve. Así que guardémoslos todos en un archivo externo y veamos cómo podemos diferenciarlos.
En primer lugar, creamos y abrimos un archivo CSV. Lo hacemos fuera de la función, justo al lado de las importaciones. Nuestra función es recursiva, lo que significa que tendremos MUCHÍSIMOS archivos si crea uno nuevo cada vez que se ejecuta.
std::ofstream writeCsv("links.csv");
A continuación, en nuestra función principal, escribimos la primera fila del archivo CSV justo antes de llamar a la función por primera vez. No olvides cerrar el archivo una vez finalizada la ejecución.
writeCsv << "type,link" << "\n";
search_for_links(parsed_response->root);
writeCsv.close();
Ahora, escribimos su contenido. En nuestra función search_for_links, cuando encontramos una etiqueta <a>, en lugar de mostrarla en la consola, ahora hacemos lo siguiente:
if (node->v.element.tag == GUMBO_TAG_A)
{
GumboAttribute* href = gumbo_get_attribute(&node->v.element.attributes, "href");
if (href)
{
std::string link = href->value;
if (link.rfind("/wiki") == 0)
writeCsv << "article," << link << "\n";
else if (link.rfind("#cite") == 0)
writeCsv << "cite," << link << "\n";
else
writeCsv << "other," << link << "\n";
}
}
Con este código, tomamos el valor del atributo «href» y lo clasificamos en tres categorías: artículos, citas y el resto.

Por supuesto, puedes ir mucho más allá y definir tus propios tipos de enlaces, como aquellos que parecen un artículo pero que en realidad son un archivo, por ejemplo.
Alternativas al web scraping
Ahora ya sabes cómo crear tu propio rastreador web con C++. Genial, ¿verdad?
Aun así, es posible que en algún momento te hayas dicho: «¡Esto empieza a dar más problemas de lo que vale la pena!», y lo entendemos perfectamente. A decir verdad, programar un rastreador es una experiencia de aprendizaje excelente, y estos programas son adecuados para conjuntos de datos pequeños, pero eso es todo.
Una API de web scraping es tu mejor opción si necesitas una herramienta de extracción de datos rápida, fiable y escalable. Esto se debe a que incluye todas las funcionalidades que necesitas, como un conjunto de proxies rotativos, renderización de JavaScript, solucionadores de captchas, opciones de geolocalización y mucho más.
¿No me crees? ¡Pues compruébalo por ti mismo! ¡Empieza tu prueba gratuita de WebScrapingAPI y descubre lo fácil que puede ser el web scraping!




