• Precios
Empezar ahora

© 2026 CapSolver. All rights reserved.

Contáctenos

Slack: lola@capsolver.com

Productos

  • reCAPTCHA v2
  • reCAPTCHA v3
  • Cloudflare Turnstile
  • Cloudflare Challenge
  • AWS WAF
  • Extensión de navegador
  • Más tipos de CAPTCHA

Integraciones

  • Selenium
  • Playwright
  • Puppeteer
  • n8n
  • Socios
  • Ver todas las integraciones

Recursos

  • Programa de referidos
  • Documentación
  • Referencia de API
  • Blog
  • Preguntas frecuentes
  • Glosario
  • Estado

Legal

  • Términos de servicio
  • Política de privacidad
  • Política de reembolso
  • No vender mi información personal
Blog/All/Cómo usar HttpClient (Biblioteca C#) para el Scraping Web
Sep16, 2024

Cómo usar HttpClient (Biblioteca C#) para el Scraping Web

Lucas Mitchell

Lucas Mitchell

Automation Engineer

Los desafíos de CAPTCHA, como Google reCAPTCHA, son utilizados comúnmente por los sitios web para bloquear bots y evitar el acceso automatizado a su contenido. Para omitir estos desafíos programáticamente, puede usar servicios como Capsolver que ofrecen soluciones basadas en API para resolver estos CAPTCHA.

En esta guía, le mostraremos cómo:

  • Raspar sitios web usando C# HttpClient y HtmlAgilityPack.
  • Resolver desafíos de reCAPTCHA usando la API de Capsolver.

Web scraping con C# HttpClient

En C#, la clase HttpClient se usa comúnmente para enviar solicitudes HTTP y recibir respuestas de sitios web. Puede combinar esto con un analizador HTML como HtmlAgilityPack para extraer datos de las páginas web.

Requisitos previos

  • Instale la biblioteca HtmlAgilityPack usando NuGet Package Manager para ayudar a analizar el contenido HTML:
bash Copy
Install-Package HtmlAgilityPack
  • Instale Newtonsoft.Json para manejar respuestas JSON:
bash Copy
Install-Package Newtonsoft.Json

Ejemplo: raspando "Quotes to Scrape"

Vamos a raspar citas del sitio web Quotes to Scrape usando HttpClient y HtmlAgilityPack.

csharp Copy
using System;
using System.Net.Http;
using System.Threading.Tasks;
using HtmlAgilityPack;

class Program
{
    private static readonly HttpClient client = new HttpClient();

    static async Task Main(string[] args)
    {
        string url = "http://quotes.toscrape.com/";

        // Enviar una solicitud GET a la página
        HttpResponseMessage response = await client.GetAsync(url);

        if (response.IsSuccessStatusCode)
        {
            // Analizar el contenido de la página usando HtmlAgilityPack
            string pageContent = await response.Content.ReadAsStringAsync();
            HtmlDocument htmlDoc = new HtmlDocument();
            htmlDoc.LoadHtml(pageContent);

            // Encontrar todas las citas en la página
            var quotes = htmlDoc.DocumentNode.SelectNodes("//span[@class='text']");

            // Imprimir cada cita
            foreach (var quote in quotes)
            {
                Console.WriteLine(quote.InnerText);
            }
        }
        else
        {
            Console.WriteLine($"No se pudo recuperar la página. Código de estado: {response.StatusCode}");
        }
    }
}

Explicación:

  • HttpClient: Envía una solicitud GET al sitio web.
  • HtmlAgilityPack: Analiza el contenido HTML y extrae citas seleccionando elementos con la clase text.

Resolviendo reCAPTCHA v3 & reCaptcha v2 con Capsolver usando HttpClient

Cuando un sitio web utiliza reCAPTCHA v3 & reCaptcha v2 para la seguridad, puede resolver el CAPTCHA usando la API de Capsolver. A continuación, se muestra cómo puede integrar Capsolver con HttpClient para resolver desafíos de reCAPTCHA.

Requisitos previos

  • Newtonsoft.Json se utiliza para manejar el análisis JSON de las respuestas de Capsolver:
bash Copy
Install-Package Newtonsoft.Json

Ejemplo: Resolviendo reCAPTCHA v2 con Capsolver

En esta sección, demostraremos cómo resolver desafíos de reCAPTCHA v2 usando la API de Capsolver y HttpClient.

csharp Copy
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;

class Program
{
    private static readonly string apiUrl = "https://api.capsolver.com";
    private static readonly string clientKey = "YOUR_API_KEY"; // Reemplace con su clave de API de Capsolver

    static async Task Main(string[] args)
    {
        try
        {
            // Paso 1: Crear una tarea para resolver reCAPTCHA v3
            string taskId = await CreateTask();
            Console.WriteLine("ID de la tarea: " + taskId);

            // Paso 2: Recuperar el resultado de la tarea
            string taskResult = await GetTaskResult(taskId);
            Console.WriteLine("Resultado de la tarea (token CAPTCHA): " + taskResult);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
        }
    }

    // Método para crear una nueva tarea de resolución de CAPTCHA
    private static async Task<string> CreateTask()
    {
        using (HttpClient client = new HttpClient())
        {
            // Carga de la solicitud
            var requestBody = new
            {
                clientKey = clientKey,
                task = new
                {
                    type = "ReCaptchaV2TaskProxyLess", // Tipo de tarea para reCAPTCHA v3 sin proxy
                    websiteURL = "", // La URL del sitio web para resolver el CAPTCHA
                    websiteKey = "" // Clave del sitio reCAPTCHA
                }
            };

            // Enviar la solicitud para crear la tarea
            var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
            HttpResponseMessage response = await client.PostAsync($"{apiUrl}/createTask", content);
            string responseContent = await response.Content.ReadAsStringAsync();

            if (!response.IsSuccessStatusCode)
            {
                throw new Exception("No se pudo crear la tarea: " + responseContent);
            }

            JObject jsonResponse = JObject.Parse(responseContent);
            if (jsonResponse["errorId"].ToString() != "0")
            {
                throw new Exception("Error al crear la tarea: " + jsonResponse["errorDescription"]);
            }

            // Devolver el ID de la tarea para ser usado en el siguiente paso
            return jsonResponse["taskId"].ToString();
        }
    }

    // Método para recuperar el resultado de una tarea de resolución de CAPTCHA
    private static async Task<string> GetTaskResult(string taskId)
    {
        using (HttpClient client = new HttpClient())
        {
            // Carga de la solicitud
            var requestBody = new
            {
                clientKey = clientKey,
                taskId = taskId
            };

            var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");

            // Consultar por el resultado de la tarea cada 5 segundos
            while (true)
            {
                HttpResponseMessage response = await client.PostAsync($"{apiUrl}/getTaskResult", content);
                string responseContent = await response.Content.ReadAsStringAsync();

                if (!response.IsSuccessStatusCode)
                {
                    throw new Exception("No se pudo obtener el resultado de la tarea: " + responseContent);
                }

                JObject jsonResponse = JObject.Parse(responseContent);
                if (jsonResponse["errorId"].ToString() != "0")
                {
                    throw new Exception("Error al obtener el resultado de la tarea: " + jsonResponse["errorDescription"]);
                }

                // Si la tarea está lista, devolver el token CAPTCHA
                if (jsonResponse["status"].ToString() == "ready")
                {
                    return jsonResponse["solution"]["gRecaptchaResponse"].ToString();
                }

                // Esperar 5 segundos antes de volver a verificar
                Console.WriteLine("La tarea todavía se está procesando, esperando 5 segundos...");
                await Task.Delay(5000);
            }
        }
    }
}

Explicación:

  1. Método CreateTask:

    • Este método envía una solicitud POST al punto final /createTask de Capsolver para crear una nueva tarea para resolver un desafío de reCAPTCHA v2.
    • La solicitud incluye la clientKey, websiteURL, websiteKey y especifica el tipo de tarea como ReCaptchaV2TaskProxyLess.
    • El método devuelve un taskId, que se usará para recuperar el resultado de la tarea.
  2. Método GetTaskResult:

    • Este método envía una solicitud POST al punto final /getTaskResult para verificar el resultado de la tarea creada anteriormente.
    • Sigue consultando el estado de la tarea cada 5 segundos hasta que la tarea se completa (status: ready).
    • Una vez que la tarea está lista, devuelve la gRecaptchaResponse, que se puede utilizar para omitir el CAPTCHA.

Ejemplo: Resolviendo reCAPTCHA v3 con Capsolver

En esta sección, demostraremos cómo resolver desafíos de reCAPTCHA v3 usando la API de Capsolver y HttpClient.

csharp Copy
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;

class Program
{
    private static readonly string apiUrl = "https://api.capsolver.com";
    private static readonly string clientKey = "YOUR_API_KEY"; // Reemplace con su clave de API de Capsolver

    static async Task Main(string[] args)
    {
        try
        {
            // Paso 1: Crear una tarea para resolver reCAPTCHA v3
            string taskId = await CreateTask();
            Console.WriteLine("ID de la tarea: " + taskId);

            // Paso 2: Recuperar el resultado de la tarea
            string taskResult = await GetTaskResult(taskId);
            Console.WriteLine("Resultado de la tarea (token CAPTCHA): " + taskResult);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
        }
    }

    // Método para crear una nueva tarea de resolución de CAPTCHA
    private static async Task<string> CreateTask()
    {
        using (HttpClient client = new HttpClient())
        {
            // Carga de la solicitud
            var requestBody = new
            {
                clientKey = clientKey,
                task = new
                {
                    type = "ReCaptchaV3TaskProxyLess", // Tipo de tarea para reCAPTCHA v3 sin proxy
                    websiteURL = "", // La URL del sitio web para resolver el CAPTCHA
                    websiteKey = "" // Clave del sitio reCAPTCHA
                }
            };

            // Enviar la solicitud para crear la tarea
            var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
            HttpResponseMessage response = await client.PostAsync($"{apiUrl}/createTask", content);
            string responseContent = await response.Content.ReadAsStringAsync();

            if (!response.IsSuccessStatusCode)
            {
                throw new Exception("No se pudo crear la tarea: " + responseContent);
            }

            JObject jsonResponse = JObject.Parse(responseContent);
            if (jsonResponse["errorId"].ToString() != "0")
            {
                throw new Exception("Error al crear la tarea: " + jsonResponse["errorDescription"]);
            }

            // Devolver el ID de la tarea para ser usado en el siguiente paso
            return jsonResponse["taskId"].ToString();
        }
    }

    // Método para recuperar el resultado de una tarea de resolución de CAPTCHA
    private static async Task<string> GetTaskResult(string taskId)
    {
        using (HttpClient client = new HttpClient())
        {
            // Carga de la solicitud
            var requestBody = new
            {
                clientKey = clientKey,
                taskId = taskId
            };

            var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");

            // Consultar por el resultado de la tarea cada 5 segundos
            while (true)
            {
                HttpResponseMessage response = await client.PostAsync($"{apiUrl}/getTaskResult", content);
                string responseContent = await response.Content.ReadAsStringAsync();

                if (!response.IsSuccessStatusCode)
                {
                    throw new Exception("No se pudo obtener el resultado de la tarea: " + responseContent);
                }

                JObject jsonResponse = JObject.Parse(responseContent);
                if (jsonResponse["errorId"].ToString() != "0")
                {
                    throw new Exception("Error al obtener el resultado de la tarea: " + jsonResponse["errorDescription"]);
                }

                // Si la tarea está lista, devolver el token CAPTCHA
                if (jsonResponse["status"].ToString() == "ready")
                {
                    return jsonResponse["solution"]["gRecaptchaResponse"].ToString();
                }

                // Esperar 5 segundos antes de volver a verificar
                Console.WriteLine("La tarea todavía se está procesando, esperando 5 segundos...");
                await Task.Delay(5000);
            }
        }
    }
}

Explicación:

  1. Método CreateTask:

    • Este método envía una solicitud POST al punto final /createTask de Capsolver para crear una nueva tarea para resolver un desafío de reCAPTCHA v3.
    • La solicitud incluye la clientKey, websiteURL, websiteKey y especifica el tipo de tarea como ReCaptchaV3TaskProxyLess.
    • El método devuelve un taskId, que se usará para recuperar el resultado de la tarea.
  2. Método GetTaskResult:

    • Este método envía una solicitud POST al punto final /getTaskResult para verificar el resultado de la tarea creada anteriormente.
    • Sigue consultando el estado de la tarea cada 5 segundos hasta que la tarea se completa (status: ready).
    • Una vez que la tarea está lista, devuelve la gRecaptchaResponse, que se puede utilizar para omitir el CAPTCHA.

Mejores prácticas de web scraping en C#

Cuando se utilizan herramientas de web scraping en C#, siempre siga estas mejores prácticas:

  • Respete robots.txt: Asegúrese de que el sitio web permita el web scraping comprobando el archivo robots.txt.
  • Limitación de la velocidad: Evite realizar demasiadas solicitudes en un período corto para evitar ser bloqueado por el sitio web.
  • Rotación de proxy: Use proxies para distribuir solicitudes a través de múltiples IPs para evitar ser marcado como un bot.
  • Cabeceras de falsificación: Simule solicitudes similares a las del navegador agregando encabezados personalizados, como User-Agent, a sus solicitudes HTTP.

Conclusión

Al usar HttpClient para el web scraping y Capsolver para la resolución de CAPTCHA, puede automatizar efectivamente las interacciones con los sitios web que emplean desafíos de CAPTCHA. Siempre asegúrese de que sus actividades de web scraping cumplan con los términos de servicio y los requisitos legales del sitio web de destino.

¡Feliz raspado!


Esta guía integra el web scraping usando HtmlAgilityPack y demuestra cómo manejar los desafíos de reCAPTCHA con Capsolver, usando solo HttpClient en C#.

Ver más

May 08, 2026

ReCAPTCHA en el scraping de comercio electrónico: Una guía con enfoque en cumplimiento

Aprende a manejar el reCAPTCHA durante el scraping de comercio electrónico con flujos de trabajo compatibles, diagnósticos, ejemplos de CapSolver y controles de riesgo prácticos.

Aloísio Vítor
Aloísio Vítor
May 08, 2026

Cómo funciona la Extracción de Datos con IA: Resolución de CAPTCHA, Procesamiento de LLM y Tuberías de Datos de la Web Estructurados

Aprende cómo funciona la extracción de datos impulsada por IA desde el web scraping y la resolución de CAPTCHA hasta la limpieza de HTML, el parsing de LLM y la generación de JSON estructurado. Explora estrategias de bypass contra los anti-bot, marcos de extracción semántica como AXE y pipelines de web scraping con IA escalables.

Contenido

Aloísio Vítor
Aloísio Vítor
May 07, 2026

Mejores frameworks de agentes de IA para automatización web y resolución de CAPTCHA

Compara los mejores marcos de agentes de IA para automatización web, resolución de CAPTCHA, cumplimiento y flujos de trabajo de agentes listos para producción en 2026.

Aloísio Vítor
Aloísio Vítor
May 07, 2026

Mejores bibliotecas de scraping web en Java para una extracción de datos confiable

Compara las mejores bibliotecas de scraping web en Java, incluyendo jsoup, Selenium, Playwright para Java, HtmlUnit, Apache Nutch y opciones de API.

Aloísio Vítor
Aloísio Vítor