---
title: "Raspado web con C++: una guía paso a paso"
slug: web-scraping-in-c-plus-plus
date: 2023-05-24T10:05:27+00:00
modified: 2025-11-04T08:56:31+00:00
permalink: https://brightdata.es/blog/procedimientos/web-scraping-in-c-plus-plus
type: blog
---

[ Blog ](https://brightdata.es/blog "Blog") / [Procedimientos](https://brightdata.es/blog/procedimientos)







 [Procedimientos](https://brightdata.es/blog/procedimientos)

# Raspado web con C++: una guía paso a paso

Aprende a raspar sitios web mediante C++ con esta guía paso a paso.

 14 min de lectura





 [ ![The letter 'A' on a blue background.](https://media.brightdata.es/2023/04/Alen-Kalac-50x50.png) ](https://brightdata.com/blog/authors/alen-kalac)

 [Alen Kalac

 ](https://brightdata.com/blog/authors/alen-kalac)





 ![web scraping with C++ hero image](https://media.brightdata.es/2023/05/web-scraping-with-C-hero-image.svg)





Resumiendo: este tutorial mostrará cómo extraer datos de un sitio web en C++ y por qué es uno de los lenguajes más eficaces para el raspado web.

**Esta guía cubrirá:**

- ¿Es C++ un buen lenguaje para el raspado web?
- Las mejores bibliotecas de raspado web de C++
- Cómo crear un raspador web en C++

## ¿Es C++ un buen lenguaje para el raspado web?

[C++](https://en.wikipedia.org/wiki/C%2B%2B) es un lenguaje de programación de tipado estático que se usa ampliamente para desarrollar aplicaciones de alto rendimiento. Esto se debe a que es bien conocido por su velocidad, eficiencia y capacidades de administración de memoria. C++ es un lenguaje versátil que resulta útil en una amplia gama de usos, incluido el raspado web.

C++ es un lenguaje compilado y es intrínsecamente más rápido que los lenguajes interpretados, como Python. Esto lo convierte en una excelente opción para crear raspadores rápidos. Sin embargo, C++ no está diseñado para el desarrollo web y no hay muchas bibliotecas disponibles para el raspado web. Si bien hay algunos paquetes de terceros, las opciones no son tan amplias como en Python, Ruby o Java.

En resumen, el raspado web en C++ es posible y eficiente, pero requiere más programación de bajo nivel en comparación con otros lenguajes. ¡Averigüemos qué herramientas pueden facilitar este proceso!

## **Las mejores bibliotecas de raspado web de C++**

**Estas son algunas bibliotecas populares de raspado web para C++:**

- [CPR](https://github.com/libcpr/cpr): una biblioteca de cliente HTTP moderna de C++ inspirada en el proyecto [Python Requests](https://github.com/kennethreitz/requests). Es un envoltorio de [libcurl](http://curl.haxx.se/libcurl) que proporciona una interfaz fácil de entender, capacidades de autenticación integradas y soporte para llamadas asincrónicas.
- [libxml2](https://gitlab.gnome.org/GNOME/libxml2/-/wikis/home): una biblioteca potente y con todas las funciones para analizar documentos XML y HTML desarrollada originalmente para Gnome. Es compatible con la manipulación del DOM mediante selectores XPath.
- [Lexbor](https://github.com/lexbor/lexbor): una biblioteca de análisis de HTML rápida y ligera escrita completamente en C con soporte para selectores CSS. Solo está disponible para Linux.

Durante años, el analizador de HTML más utilizado para C++ fue [Gumbo](https://github.com/google/gumbo-parser). Esto no se ha mantenido desde 2016 e incluso [el archivo LÉAME oficial](https://github.com/google/gumbo-parser#gumbo---a-pure-c-html5-parser) ahora desaconseja su uso.

## Requisitos previos

**Antes de sumergirte en la programación, debes:**

1. Tener un compilador de C++
2. Configurar el administrador de paquetes de C++ `<a href="https://github.com/microsoft/vcpkg" rel="noreferrer noopener nofollow" target="_blank">vcpkg</a>`
3. Instalar [CMake](https://cmake.org/)

Sigue la guía que aparece a continuación para tu sistema operativo y aprende a cumplir esos requisitos previos.

## Configurar C++ en macOS

En macOS, el compilador de C, C++ y Objective-C más popular es [Clang](https://clang.llvm.org/). Ten en cuenta que muchos Mac vienen con Clang preinstalado. Para verificarlo, abre una terminal y ejecuta el siguiente comando:

```none
clang --version

```

Si recibes el error `command not found: clang`, significa que Clang no está instalado o configurado correctamente. En ese caso, puedes instalarlo mediante las herramientas de línea de comandos de Xcode:

```none
xcode-select --install

```

Esto puede llevar un tiempo, así que ten paciencia.

Para configurar `vcpkg`, primero necesitarás las herramientas de desarrollo de macOS. Añádelas a tu Mac con:

```none
xcode-select --install

```

Después, debes instalar `vcpkg` de forma global. Crea una carpeta `/dev`, introdúcela en la terminal y ejecuta:

```none
git clone https://github.com/microsoft/vcpkg

```

El directorio ahora contendrá el código fuente. Crea el administrador de paquetes con:

```none
./vcpkg/bootstrap-vcpkg.sh

```

Para ejecutar este comando, es posible que necesites privilegios elevados.

Por último, añade `/dev/vcpkg` a tu `$PATH` siguiendo [esta guía](https://techpp.com/2021/09/08/set-path-variable-in-macos-guide/).

Para instalar CMake, descarga el [instalador del sitio oficial](https://cmake.org/download/), ejecútalo y sigue las instrucciones del asistente de instalación.

## Configurar C++ en Windows

Descarga el instalador [MinGW-x64](https://www.mingw-w64.org/) desde [MSYS2](https://www.msys2.org/), ejecútalo y sigue las instrucciones. Este paquete proporciona compilaciones nativas actualizadas de GCC, Mingw-w64 y otras herramientas y bibliotecas útiles de C++.

En la terminal MSYS2 abierta al final del proceso de instalación, ejecuta el siguiente comando para instalar la cadena de herramientas Mingw-w64:

```none
pacman -S --needed base-devel mingw-w64-x86_64-toolchain

```

Espera a que finalice el proceso y, a continuación, añade MinGW al entorno `PATH`, como se explica [aquí](https://code.visualstudio.com/docs/languages/cpp#_add-the-mingw-compiler-to-your-path).

A continuación, debes instalar `vcpkg` de forma global. Crea una carpeta `C:/dev`, ábrela en PowerShell y ejecuta:

```none
git clone https://github.com/microsoft/vcpkg

```

Crea el código fuente del administrador de paquetes contenido en la subcarpeta `vcpkg` con:

```none
./vcpkg/bootstrap-vcpkg.bat

```

Ahora, añade `C:/dev/vcpkg` a tu `PATH` como lo hiciste antes.

Solo queda instalar CMake. Descarga el [instalador](https://cmake.org/download/), haz doble clic en él y asegúrate de marcar la siguiente opción durante la configuración.

![](https://media.brightdata.com/2023/05/s_6776990FE039C8E1A28F1E7FBFD04057B1476FA3238B76E106F58F360C5E72CC_1684013632284_Screenshot2023-05-13182756.png)

Configurar C++ en Linux
En distribuciones basadas en Debian, instala [GCC ](https://gcc.gnu.org/)(GNU Compiler Collection), CMake y otros paquetes útiles para el desarrollo con:

```none
sudo apt install build-essential cmake

```

Esto puede llevar algún tiempo, así que ten paciencia.

A continuación, debes instalar `vcpkg` de forma global. Crea un directorio `/dev`, ábrelo en la terminal y escribe:

```none
git clone https://github.com/microsoft/vcpkg

```

El subdirectorio `vcpkg` ahora contendrá el código fuente del administrador de paquetes. Crea la herramienta con:

```none
./vcpkg/bootstrap-vcpkg.sh

```

Ten en cuenta que este comando puede requerir privilegios de administrador.

A continuación, añade `/dev/vcpkg` a tu variable de entorno `$PATH` siguiendo [esta ](https://phoenixnap.com/kb/linux-add-to-path)guía.

¡Perfecto! ¡Ahora tienes todo lo que necesitas para empezar con el raspado web en C++!

## **Cómo crear un raspador web en C++**

En este capítulo, aprenderás a programar una araña web en C++. El sitio de destino será la [página de inicio de Bright Data](/) y la secuencia de comandos se ocupará de:

- Conexión a la página web
- Selección de los elementos HTML de interés del DOM
- Recuperar datos de ellos
- Exportación de los datos extraídos a CSV

En este momento, esto es lo que ven los visitantes cuando exploran la página de destino:

![](https://media.brightdata.com/2023/05/s_6776990FE039C8E1A28F1E7FBFD04057B1476FA3238B76E106F58F360C5E72CC_1684161750992_chrome-capture-2023-4-15.gif)Recuerda que la página de inicio de BrightData cambia con frecuencia. Por lo tanto, es posible que haya cambiado cuando leas este artículo.

Algunos datos interesantes que se pueden extraer de la página son la información sobre la industria contenida en estas tarjetas:

![](https://media.brightdata.com/2023/05/s_AFE13B4772D3F4335FE29C87FF7F9F7EC3D58E63BD6E7F8A7D0D66DA3F5A487A_1682521439443_image-1-1024x394.png)Se ha definido el objetivo de raspado de este tutorial paso a paso. ¡Veamos cómo hacer raspado web con C++!

## Paso 1: iniciar un proyecto de raspado de C++

Primero, necesitas una carpeta donde colocar tu proyecto de C++. Abre la terminal y crea el directorio del proyecto con:

```none
mkdir c++-web-scraper

```

Esto contendrá tu secuencia de comandos de raspado.

Al crear software en C++, debes optar por un IDE de Visual Studio. En detalle, estás a punto de ver cómo configurar [Visual Studio Code](https://code.visualstudio.com/) (VS Code) para el desarrollo en C++ con `vcpkg` como administrador de paquetes. Ten en cuenta que se pueden aplicar procedimientos similares a otros IDE de C++.

VS Code no ofrece soporte integrado para C++, por lo que primero debes añadir el complemento [C/C++](https://code.visualstudio.com/docs/languages/cpp). Ejecuta Visual Studio Code, haz clic en el icono «Extensiones» de la barra izquierda y escribe «C++» en el campo de búsqueda de la parte superior.

![](https://media.brightdata.com/2023/05/s_6776990FE039C8E1A28F1E7FBFD04057B1476FA3238B76E106F58F360C5E72CC_1683983021150_image-1024x552.png)Haz clic en el botón «Instalar» del primer elemento para añadir la funcionalidad de desarrollo de C++ a VS Code. Espera a que la extensión esté configurada y abre la carpeta `c++-web-scraper` con `"``<strong>File</strong>``"` `>` `"``Open Folder...``"`.

Haz clic con el botón derecho en la sección «**EXPLORADOR**», selecciona «Nuevo archivo…» e inicia un archivo `scraper.cpp` de la siguiente manera:

```none
#include <iostream>

int main()
{
    std::cout << "Hello World" << std::endl;
}

```

![](https://media.brightdata.com/2023/05/s_6776990FE039C8E1A28F1E7FBFD04057B1476FA3238B76E106F58F360C5E72CC_1683983847858_image-1024x552.png)¡Ahora tienes un proyecto de C++!

## Paso 2: instalar las bibliotecas de raspado

La complicada sintaxis de C++ y sus limitadas capacidades web pueden ser un obstáculo a la hora de crear un raspador web. Para que todo sea más fácil, deberías aprovechar algunas bibliotecas de C++ de raspado web. Como se mencionó anteriormente, la elección es bastante limitada. Por lo tanto, deberías elegir las más populares: `cpr` y `libxml2`.

Puedes instalarlas en Windows a través de `vcpkg` con:

```none
vcpkg install cpr libxml2 --triplet=x64-windows

```

En macOS, reemplaza la [opción de tripletas](https://learn.microsoft.com/en-us/vcpkg/users/triplets) por `x64-osx`. En Linux, utiliza `x64-linux`.

En la terminal de Visual Studio Code, también debes ejecutar el siguiente comando en el directorio raíz de tu proyecto:

```none
vcpkg integrate install

```

Esto permitirá vincular los paquetes `vcpkg` al proyecto.

Reinicia VS Code y ahora podrás importar cualquier biblioteca instalada con `#include`. Por lo tanto, añade las siguientes tres líneas en la parte superior de tu archivo `scraper.cpp`:

```none
#include "cpr/cpr.h"
#include "libxml/HTMLparser.h"
#include "libxml/xpath.h"

```

Asegúrate de que el IDE no notifique ningún error.

## Paso 3: finalizar la inicialización del proyecto en C++

Para crear la secuencia de comandos de raspado de C++ y completar el proceso de inicialización del proyecto, debes añadir la extensión [CMake ](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools)Tools a VS Code:

![](https://media.brightdata.com/2023/05/s_6776990FE039C8E1A28F1E7FBFD04057B1476FA3238B76E106F58F360C5E72CC_1684013838397_Screenshot2023-05-13200042-1024x552.png)Si tu proyecto no tiene una carpeta `.vscode`, créala. Ahí es donde VS Code busca configuraciones relacionadas con el proyecto actual.

Configura CMake Tools para que use `vcpkg` como una cadena de herramientas creando un archivo `settings.json` dentro de la carpeta `.vscode` de la siguiente manera:

```none
{
  "cmake.configureSettings": {
    "CMAKE_TOOLCHAIN_FILE": "c:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake"
  }
}

```

En macOS y Linux, corrige el campo `CMAKE_TOOLCHAIN_FILE` de acuerdo con la ruta en la que instalaste `vcpkg`. Si has seguido la guía de configuración anterior, debería ser `/dev/vcpkg/scripts/buildsystems/vcpkg.cmake`.

En la barra de búsqueda principal de VS Code, escribe «&gt;cmake» y selecciona la opción «CMake: Configurar»:

![](https://media.brightdata.com/2023/05/s_6776990FE039C8E1A28F1E7FBFD04057B1476FA3238B76E106F58F360C5E72CC_1684013971518_image.png)Esto te permitirá seleccionar la plataforma de compilación de destino. En Windows, elige «Versión de Visual Studio Build Tools 2019 – x86\_amd64»:

![](https://media.brightdata.com/2023/05/s_6776990FE039C8E1A28F1E7FBFD04057B1476FA3238B76E106F58F360C5E72CC_1684014083449_image.png)Añade el archivo `<a href="https://cmake.org/cmake/help/book/mastering-cmake/chapter/Writing%20CMakeLists%20Files.html" rel="noreferrer noopener nofollow" target="_blank">CMakeLists.txt</a>` a la carpeta raíz de tu proyecto para configurar CMake:

```none
cmake_minimum_required(VERSION 3.0.0)
project(main VERSION 0.1.0)

INCLUDE_DIRECTORIES(
  C:/dev/vcpkg/installed/x86-windows/include
)

LINK_DIRECTORIES(
   C:/dev/vcpkg/installed/x86-windows/lib
)

add_executable(main scraper.cpp)
target_compile_features(main PRIVATE cxx_std_20)

find_package(cpr CONFIG REQUIRED)
target_link_libraries(main PRIVATE cpr::cpr)

find_package(LibXml2 REQUIRED)
target_link_libraries(main PRIVATE LibXml2::LibXml2)

```

Ten en cuenta que se trata de los dos paquetes instalados anteriormente. Asegúrate de actualizar `INCLUDE_DIRECTORIES` y `LINK_DIRECTORIES` de acuerdo con tu carpeta de instalación de `vcpkg`.

Para permitir que Visual Studio Code ejecute el programa C++, necesitas un archivo de configuración de ejecución. En la carpeta `.vscode`, inicia `launch.json` como se muestra a continuación:

```none
{
  "configurations": [
    {
      "name": "C++ Launch (Windows)",
      "type": "cppvsdbg",
      "request": "launch",
      "program": "${workspaceFolder}/build/Debug/main.exe",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": []
    }
  ]
}

```

Al iniciar el comando de ejecución o depuración, VS Code ahora ejecutará el archivo en la ruta `program` producida por CMake. Ten en cuenta que en macOS y Linux no será un archivo `.exe`.

¡La configuración está lista!

Cada vez que quieras depurar o compilar tu aplicación, escribe «&gt;cmake: Build» en el campo de entrada superior y selecciona la opción «CMake: Build».

![](https://media.brightdata.com/2023/05/s_6776990FE039C8E1A28F1E7FBFD04057B1476FA3238B76E106F58F360C5E72CC_1684147211980_image.png)Espera a que finalice el proceso de compilación y ejecuta el programa compilado desde la sección «Ejecutar y depurar» o pulsando F5. Verás el resultado de tu aplicación en la consola de depuración de VSC.

![](https://media.brightdata.com/2023/05/s_6776990FE039C8E1A28F1E7FBFD04057B1476FA3238B76E106F58F360C5E72CC_1684147525940_image-1024x552.png)¡Genial! ¡Es hora de empezar a raspar algunos datos en C++!

## Paso 4: descargar la página de destino con CPR

Si quieres extraer datos de una página, primero tienes que recuperar su documento HTML mediante una solicitud HTTP `<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET" rel="noreferrer noopener nofollow" target="_blank">GET</a>`.

Usa CPR para descargar la página de destino con:

```none
cpr::Response response = cpr::Get(cpr::Url{"https://brightdata.com/"});

```

Entre bastidores, el método `<a href="https://docs.libcpr.org/introduction.html#get-requests" rel="noreferrer noopener nofollow" target="_blank">Get()</a>` ejecuta una solicitud `GET` a la URL pasada como parámetro. `response.text` contendrá la representación en cadena del código HTML devuelto por el servidor.

Ten en cuenta que la realización de solicitudes HTTP automatizadas puede activar tecnologías antibot. Estas pueden interceptar tus solicitudes e impedir que tu secuencia de comandos acceda al sitio de destino. En concreto, las soluciones antirraspado más básicas bloquean las solicitudes entrantes sin un encabezado HTTP `<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent" rel="noreferrer noopener nofollow" target="_blank">User-Agent</a>` válido. Obtén más información en nuestra guía sobre `User`[`-Agent`s para el raspado web](https://brightdata.es/blog/procedimientos/user-agents-for-web-scraping-101).

Al igual que cualquier otro cliente HTTP, CPR usa un valor de marcador de posición para `User-Agent`. Dado que esto es muy diferente de los agentes utilizados por los navegadores populares, los sistemas antibot pueden detectarte con facilidad. Para evitar que te bloqueen por ese motivo, puedes configurar un `User-Agent` válido en CPR con:

```none
cpr::Header headers = {{"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"}};
cpr::Response response = cpr::Get(cpr::Url{"https://brightdata.com/121.21.21.da/31/3das/32/1"}, headers);

```

La solicitud HTTP realizada a través de ese `Get()` ahora aparecerá como procedente de Google Chrome 113.

Esto es lo que contiene actualmente `scraper.cpp`:

```none
#include <iostream>
#include "cpr/cpr.h"
#include "libxml/HTMLparser.h"
#include "libxml/xpath.h"

int main()
{
    // define the user agent for the GET request
    cpr::Header headers = {{"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"}};
    // make the HTTP request to retrieve the target page
    cpr::Response response = cpr::Get(cpr::Url{"https://brightdata.com/"}, headers);

    // scraping logic...
}

```

## Paso 5: analizar contenido HTML con libxml2

Para que el documento HTML devuelto por el servidor pueda explorarse fácilmente, primero debes analizarlo.
Pasa su representación de cadena C a la función libxml2 `<a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-HTMLparser.html#htmlReadMemory" rel="noreferrer noopener nofollow" target="_blank">htmlReadMemory()</a>` para conseguirlo:

```none
htmlDocPtr doc = htmlReadMemory(response.text.c_str(), response.text.length(), nullptr, nullptr, HTML_PARSE_NOWARNING | HTML_PARSE_NOERROR);

```

La variable `doc` ahora expone la API de exploración del DOM que ofrece libxml2. En detalle, puedes recuperar los elementos HTML de la página mediante los selectores XPath. En el momento de escribir este artículo, libxml2 no es compatible con los selectores CSS.

## Paso 6: definir los selectores XPath para obtener los elementos HTML deseados

Para definir una estrategia de selección de XPath eficaz para los nodos HTML de interés, debes analizar el DOM de la página de destino. Abre la página de inicio de Bright Data en el navegador, haz clic con el botón derecho en una de las tarjetas industrial y selecciona «Inspeccionar». Esto abrirá la sección de DevTools:

![](https://media.brightdata.com/2023/05/s_AFE13B4772D3F4335FE29C87FF7F9F7EC3D58E63BD6E7F8A7D0D66DA3F5A487A_1682521993140_image-1-1024x491.png)Explora el código HTML y verás que cada tarjeta industrial es un elemento `<div>` que contiene:

1. Un elemento `<figure>` con un `<img>` que representa la imagen de la industria y un `<a>` que contiene la URL de la página de la industria.
2. Un elemento HTML `<div>` que almacena el nombre de la industria en un `<a>`.

Para cada tarjeta, el objetivo del raspador de C++ es extraer:

- La URL de la imagen de la industria
- La URL de la página de la industria
- El nombre de la industria

Para definir los selectores XPath adecuados, centra tu atención en la estructura del DOM de los elementos de interés. Verás que puedes obtener todas las tarjetas industriales con el siguiente selector XPath:

```none
//div[contains(@class, 'section_cases_row_col_item')]

```

Si tienes alguna duda, prueba las instrucciones de XPath en la consola del navegador con `$x()`:

![](https://media.brightdata.com/2023/05/s_6776990FE039C8E1A28F1E7FBFD04057B1476FA3238B76E106F58F360C5E72CC_1684154947978_image-1024x480.png)Si recibes una tarjeta, puedes obtener los nodos deseados con:

1. `.//figure/a/img`
2. `.//figure/a`
3. `.//div[contains(@class, 'elementor-image-box-title')]/a`

Paso 7: extraer datos de una página web con libxml2
Ahora puedes usar libxml2 para aplicar los selectores XPath definidos anteriormente y obtener los datos deseados de la página web HTML de destino.

Primero, necesitas una estructura de datos cuyas instancias almacenen los datos raspados:

```none
struct IndustryCard
{
    std::string image;
    std::string url;
    std::string name;
};

```

En C++, un `struct` te permite agrupar varios atributos de datos con el mismo nombre en un bloque de memoria.

A continuación, inicia una matriz de `IndustryCard`s en la función `main()`:

```none
std::vector<IndustryCard> industry_cards;

```

Esto almacenará todos los objetos de datos extraídos.

Rellena este `vector` con la siguiente lógica de raspado web de C++:

```none
// define an array to store all retrieved data
std::vector<IndustryCard> industry_cards;
// set the libxml2 context to the current document
xmlXPathContextPtr context = xmlXPathNewContext(doc);

// select all industry card HTML elements
// with an XPath selector
xmlXPathObjectPtr industry_card_html_elements = xmlXPathEvalExpression((xmlChar *)"//div[contains(@class, 'section_cases_row_col_item')]", context);

// iterate over the list of industry card elements
for (int i = 0; i < industry_card_html_elements->nodesetval->nodeNr; ++i)
{
    // get the current element of the loop
    xmlNodePtr industry_card_html_element = industry_card_html_elements->nodesetval->nodeTab[i];

    // set the libxml2 context to the current element
    // to limit the XPath selectors to its children
    xmlXPathSetContextNode(industry_card_html_element, context);

    xmlNodePtr image_html_element = xmlXPathEvalExpression((xmlChar *)".//figure/a/img", context)->nodesetval->nodeTab[0];
    std::string image = std::string(reinterpret_cast<char *>(xmlGetProp(image_html_element, (xmlChar *)"data-lazy-src")));

    xmlNodePtr url_html_element = xmlXPathEvalExpression((xmlChar *)".//figure/a", context)->nodesetval->nodeTab[0];
    std::string url = std::string(reinterpret_cast<char *>(xmlGetProp(url_html_element, (xmlChar *)"href")));

    xmlNodePtr name_html_element = xmlXPathEvalExpression((xmlChar *)".//div[contains(@class, 'elementor-image-box-title')]/a", context)->nodesetval->nodeTab[0];
    std::string name = std::string(reinterpret_cast<char *>(xmlNodeGetContent(name_html_element)));

    // instantiate an IndustryCard struct with the collected data
    IndustryCard industry_card = {image, url, name};
    // add the object with the scraped data to the vector
    industry_cards.push_back(industry_card);
}

// free up the resource allocated by libxml2
xmlXPathFreeObject(industry_card_html_elements);
xmlXPathFreeContext(context);
xmlFreeDoc(doc);

```

El segmento de código anterior selecciona las tarjetas industriales aplicando el selector XPath definido anteriormente con `<a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-xpath.html#xmlXPathEvalExpression" rel="noreferrer noopener nofollow" target="_blank">xmlXPathEvalExpression()</a>`. Después, itera sobre ellas e implementa un enfoque similar para obtener los elementos secundarios de interés de cada tarjeta. A continuación, extrae de ellas la URL de la imagen de la industria, la URL de la página y el nombre. Por último, libera los recursos asignados por libxml2.

Como puedes ver, el raspado web usando C++ con libxml2 no es tan complejo. Gracias a `<a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlGetProp" rel="noreferrer noopener nofollow" target="_blank">xmlGetProp()</a>` y `<a href="https://gnome.pages.gitlab.gnome.org/libxml2/devhelp/libxml2-tree.html#xmlNodeGetContent" rel="noreferrer noopener nofollow" target="_blank">xmlNodeGetContent()</a>` puedes obtener el valor de un atributo HTML y el contenido de un nodo, respectivamente.

Ahora que sabes cómo funciona el raspado de datos en C++, tienes las herramientas para ir un paso más allá y raspar también las páginas de la industria. Solo tienes que seguir los enlaces descubiertos aquí e idear una nueva lógica de raspado. ¡En esto consisten [el rastreo y el raspado web](https://brightdata.es/blog/datos-web/web-crawling-vs-web-scraping)!

¡Increíble! Acabas de lograr tus objetivos. Sin embargo, el tutorial aún no ha terminado.

## Paso 7: exportar los datos raspados a CSV

Al final del bucle `for()`, `industry_cards` almacenará los datos raspados en instancias `struct`. Como puedes imaginar, ese no es el mejor formato para proporcionar datos a otros equipos. Esta es la razón por la que debes convertir los datos recuperados a CSV.

**Puedes exportar un `vector` a un archivo CSV con funciones de C++ integradas de la siguiente manera:**

```none
// initialize the CSV output file
std::ofstream csv_file("output.csv");
// write the CSV header
csv_file << "url,image,name" << std::endl;
// poupulate the CSV output file
for (IndustryCard industry_card : industry_cards)
{
    // transfrom each industry card record to a CSV record
    csv_file << industry_card.url << "," << industry_card.image << "," << industry_card.name << std::endl;
}
// free up the file resources
csv_file.close();

```

El código anterior crea un archivo `output.csv` y lo inicia con el registro de encabezado. A continuación, itera sobre la matriz `industry_cards`, convierte cada elemento en una cadena en formato CSV y lo añade al archivo resultante.

Crea tu secuencia de comandos de raspado de C++, ejecútala y verás el siguiente archivo `output.csv` en el directorio raíz de tu proyecto:

![](https://media.brightdata.com/2023/05/s_AFE13B4772D3F4335FE29C87FF7F9F7EC3D58E63BD6E7F8A7D0D66DA3F5A487A_1682525940173_image-1-1024x215.png)**¡Bien hecho! ¡Ahora sabes cómo exportar datos raspados a CSV en C++!**

## Paso 8: juntarlo todo

**Aquí está todo el raspador de C++:**

```none
// scraper.cpp

#include <iostream>
#include "cpr/cpr.h"
#include "libxml/HTMLparser.h"
#include "libxml/xpath.h"
#include <vector>

// define a struct where to store the scraped data
struct IndustryCard
{
    std::string image;
    std::string url;
    std::string name;
};

int main()
{
    // define the user agent for the GET request
    cpr::Header headers = {{"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"}};
    // make an HTTP GET request to retrieve the target page
    cpr::Response response = cpr::Get(cpr::Url{"https://brightdata.com/"}, headers);

    // parse the HTML document returned by the server
    htmlDocPtr doc = htmlReadMemory(response.text.c_str(), response.text.length(), nullptr, nullptr, HTML_PARSE_NOWARNING | HTML_PARSE_NOERROR);

    // define an array to store all retrieved data
    std::vector<IndustryCard> industry_cards;
    // set the libxml2 context to the current document
    xmlXPathContextPtr context = xmlXPathNewContext(doc);
    // select all industry card HTML elements
    // with an XPath selector
    xmlXPathObjectPtr industry_card_html_elements = xmlXPathEvalExpression((xmlChar *)"//div[contains(@class, 'section_cases_row_col_item')]", context);

    // iterate over the list of industry card elements
    for (int i = 0; i < industry_card_html_elements->nodesetval->nodeNr; ++i)
    {
        // get the current element of the loop
        xmlNodePtr industry_card_html_element = industry_card_html_elements->nodesetval->nodeTab[i];
        // set the libxml2 context to the current element
        // to limit the XPath selectors to its children
        xmlXPathSetContextNode(industry_card_html_element, context);

        xmlNodePtr image_html_element = xmlXPathEvalExpression((xmlChar *)".//figure/a/img", context)->nodesetval->nodeTab[0];
        std::string image = std::string(reinterpret_cast<char *>(xmlGetProp(image_html_element, (xmlChar *)"data-lazy-src")));

        xmlNodePtr url_html_element = xmlXPathEvalExpression((xmlChar *)".//figure/a", context)->nodesetval->nodeTab[0];
        std::string url = std::string(reinterpret_cast<char *>(xmlGetProp(url_html_element, (xmlChar *)"href")));

        xmlNodePtr name_html_element = xmlXPathEvalExpression((xmlChar *)".//div[contains(@class, 'elementor-image-box-title')]/a", context)->nodesetval->nodeTab[0];
        std::string name = std::string(reinterpret_cast<char *>(xmlNodeGetContent(name_html_element)));

        // instantiate an IndustryCard struct with the collected data
        IndustryCard industry_card = {image, url, name};
        // add the object with the scraped data to the vector
        industry_cards.push_back(industry_card);
    }

    // free up the resource allocated by libxml2
    xmlXPathFreeObject(industry_card_html_elements);
    xmlXPathFreeContext(context);
    xmlFreeDoc(doc);

    // initialize the CSV output file
    std::ofstream csv_file("output.csv");
    // write the CSV header
    csv_file << "url,image,name" << std::endl;

    // poupulate the CSV output file
    for (IndustryCard industry_card : industry_cards)
    {
        // transfrom each industry card record to a CSV record
        csv_file << industry_card.url << "," << industry_card.image << "," << industry_card.name << std::endl;
    }

    // free up the file resources
    csv_file.close();

    return 0;
}

```

**¡Ya está! ¡Con alrededor de 80 líneas de código, puedes crear una secuencia de comandos de raspado de datos en C++!**

## Conclusión

En este tutorial, hemos aprendido por qué C++ es un lenguaje eficiente para el raspado web. Aunque no hay tantas bibliotecas de raspado como en otros idiomas, sí hay algunas. Y aquí tuviste la oportunidad de ver cuáles son las más populares. A continuación, analizaste cómo usar CPR y libxml2 para crear una araña en C++ que pueda recopilar datos de un objetivo real.

Sin embargo, el [raspado web](/blog/procedimientos/what-is-web-scraping)conlleva muchos desafíos. De hecho, un número cada vez mayor de sitios han estado implementando tecnologías antibot y antirraspado para proteger sus datos. Estas herramientas pueden detectar las solicitudes automatizadas realizadas por tu secuencia de comandos de raspado de C++ y prohibirlas. Afortunadamente, existen muchas soluciones automatizadas para tus necesidades de recopilación de datos. Ponte en contacto con nosotros para saber cuál es la mejor solución para tu caso de uso.

**¿No te interesa para nada el raspado web, pero sí los datos web?** [Echa un vistazo a nuestros conjuntos de datos listos para usar](https://brightdata.es/products/datasets).



Contactar ventasPrueba gratuita![google social icon](/wp-content/themes/brightdata/assets/images/ic_google.svg)









 Tabla de Contenidos













 [ ](https://news.ycombinator.com/submitlink?t=Raspado+web+con+C%2B%2B%3A+una+gu%C3%ADa+paso+a+paso&u=https://brightdata.es/blog/procedimientos/web-scraping-in-c-plus-plus) [ ](https://www.linkedin.com/shareArticle?mini=true&title=Raspado+web+con+C%2B%2B%3A+una+gu%C3%ADa+paso+a+paso&url=https://brightdata.es/blog/procedimientos/web-scraping-in-c-plus-plus) [ ](http://www.reddit.com/submit?title=Raspado+web+con+C%2B%2B%3A+una+gu%C3%ADa+paso+a+paso&url=https://brightdata.es/blog/procedimientos/web-scraping-in-c-plus-plus)







##  Usted también puede estar interesado en

 [ ![OpenHuman with Bright Data](https://media.brightdata.es/2026/09/OpenHuman-with-Bright-Data.png) ](https://brightdata.es/blog/ai/openhuman-with-bright-data "Acceso Web Listo para Producción en OpenHuman a Través de la CLI de Bright Data")

 [AI



 ![Antonello Zanini](https://media.brightdata.es/2022/12/Antonello-Zanini-2-50x50.jpg)

Antonello Zanini

Technical Writer





### Acceso Web Listo para Producción en OpenHuman a Través de la CLI de Bright Data

Integra la CLI de Bright Data con OpenHuman para habilitar acceso web listo para producción y recopilación de datos para agentes de IA.



 09-Sep-2026

 14 min de lectura

 ](https://brightdata.es/blog/ai/openhuman-with-bright-data)

 [ ![Multimodal Web Scraping with MiniMax](https://media.brightdata.es/2026/09/Multimodal-Web-Scraping-with-MiniMax.png) ](https://brightdata.es/blog/datos-web/multimodal-web-scraping-with-minimax "Scraping Web Multimodal con MiniMax")

 [Datos web



 ![Antonello Zanini](https://media.brightdata.es/2022/12/Antonello-Zanini-2-50x50.jpg)

Antonello Zanini

Technical Writer





### Scraping Web Multimodal con MiniMax

Combina Bright Data Web Unlocker con la visión de MiniMax M3 para extraer datos estructurados de imágenes y capturas de pantalla de páginas web.



 09-Sep-2026

 5 min de lectura

 ](https://brightdata.es/blog/datos-web/multimodal-web-scraping-with-minimax)

 [ ![The 10 Best CLI Tools for Codex in 2026](https://media.brightdata.es/2026/08/The-10-Best-CLI-Tools-for-Codex-in-2026.png) ](https://brightdata.es/blog/ai/best-cli-tools-for-codex "Las 10 mejores herramientas CLI para Codex en 2026 – Probadas y clasificadas")

 [AI



 ![Daniel Shashko](https://media.brightdata.es/2022/04/Daniel-Shashko-2-50x50.png)

Daniel Shashko

Web Data &amp; AI Expert





### Las 10 mejores herramientas CLI para Codex en 2026 – Probadas y clasificadas

Las 10 herramientas CLI que hacen a Codex más rápido y capaz, comenzando con la Bright Data CLI para acceso web real desde dentro del sandbox.



 06-Sep-2026

 24 min de lectura

 ](https://brightdata.es/blog/ai/best-cli-tools-for-codex)
