CAPSOLVER
Blog
Cómo usar RestSharp (biblioteca C#) para la extracción de datos web

Cómo usar RestSharp (biblioteca C#) para raspar la web

Logo of CapSolver

Ethan Collins

Pattern Recognition Specialist

17-Sep-2024

La extracción de datos web es una técnica esencial para extraer datos de sitios web, pero las aplicaciones web modernas a menudo implementan medidas de seguridad como los desafíos CAPTCHA para evitar el acceso automatizado. Los desafíos CAPTCHA, como Google reCAPTCHA, están diseñados para diferenciar entre usuarios humanos y bots, lo que dificulta que los scripts automatizados extraigan contenido de manera efectiva.

Para superar estos obstáculos, los desarrolladores pueden aprovechar herramientas y servicios que simplifican las solicitudes HTTP y manejan la resolución de CAPTCHA. RestSharp es una biblioteca C# potente y fácil de usar que simplifica el proceso de realizar solicitudes HTTP a API RESTful. Cuando se combina con un analizador HTML como HtmlAgilityPack, se convierte en una solución robusta para tareas de extracción de datos web.

RestSharp WebScraping

Sin embargo, encontrar desafíos CAPTCHA durante la extracción puede detener el proceso de automatización. Aquí es donde Capsolver entra en juego. Capsolver ofrece soluciones basadas en API para resolver CAPTCHAs programáticamente, lo que permite que sus scripts de extracción de datos ignoren estos desafíos y accedan al contenido deseado sin problemas.

En esta guía completa, te guiaremos a través de:

Extracción de datos web con RestSharp

En C#, RestSharp es una biblioteca popular para manejar solicitudes HTTP e interactuar con API RESTful. Simplifica muchos aspectos de la comunicación HTTP en comparación con el HttpClient incorporado. Puedes combinar RestSharp con un analizador HTML como HtmlAgilityPack para extraer datos de páginas web.

Prerrequisitos

  • Instala la biblioteca RestSharp utilizando NuGet Package Manager:

    bash Copy
    Install-Package RestSharp
  • Instala la biblioteca HtmlAgilityPack para ayudar a analizar el contenido HTML:

    bash Copy
    Install-Package HtmlAgilityPack
  • Instala Newtonsoft.Json para manejar respuestas JSON:

    bash Copy
    Install-Package Newtonsoft.Json

Ejemplo: Extraer datos de "Quotes to Scrape"

Vamos a extraer frases del sitio web Quotes to Scrape utilizando RestSharp y HtmlAgilityPack.

csharp Copy
using System;
using System.Threading.Tasks;
using HtmlAgilityPack;
using RestSharp;

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

        // Inicializa el cliente RestSharp
        var client = new RestClient(url);

        // Crea una solicitud GET
        var request = new RestRequest(Method.GET);

        // Ejecuta la solicitud
        var response = await client.ExecuteAsync(request);

        if (response.IsSuccessful)
        {
            // Analiza el contenido de la página utilizando HtmlAgilityPack
            HtmlDocument htmlDoc = new HtmlDocument();
            htmlDoc.LoadHtml(response.Content);

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

            // Imprime cada frase
            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:

  • Cliente y solicitud RestSharp: Inicializa un RestClient con la URL de destino y crea un RestRequest para el método GET.
  • Ejecución de la solicitud: Envía la solicitud de forma asíncrona y verifica si la respuesta es exitosa.
  • HtmlAgilityPack: Analiza el contenido HTML de la respuesta y extrae frases seleccionando elementos con la clase text.

Resolver reCAPTCHA v2 y reCAPTCHA v3 con Capsolver utilizando RestSharp

Cuando un sitio web utiliza reCAPTCHA v2 o v3 para seguridad, puedes resolver el CAPTCHA utilizando la API Capsolver. A continuación, se muestra cómo puedes integrar Capsolver con RestSharp para resolver desafíos reCAPTCHA.

Prerrequisitos

  • Newtonsoft.Json se utiliza para manejar el análisis JSON de las respuestas de Capsolver:

    bash Copy
    Install-Package Newtonsoft.Json

Ejemplo: Resolver reCAPTCHA v2 con Capsolver

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

csharp Copy
using System;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RestSharp;

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

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

            // Paso 2: Recupera 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()
    {
        // Inicializa el cliente RestSharp
        var client = new RestClient(apiUrl);

        // Carga útil de la solicitud
        var requestBody = new
        {
            clientKey = clientKey,
            task = new
            {
                type = "ReCaptchaV2TaskProxyLess", // Tipo de tarea para reCAPTCHA v2 sin proxy
                websiteURL = "https://www.example.com", // La URL del sitio web para resolver CAPTCHA
                websiteKey = "SITE_KEY_HERE" // Clave del sitio reCAPTCHA
            }
        };

        // Crea una solicitud POST
        var request = new RestRequest("createTask", Method.POST);
        request.AddJsonBody(requestBody);

        // Ejecuta la solicitud
        var response = await client.ExecuteAsync(request);

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

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

        // Devuelve el ID de la tarea para usar 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)
    {
        // Inicializa el cliente RestSharp
        var client = new RestClient(apiUrl);

        // Carga útil de la solicitud
        var requestBody = new
        {
            clientKey = clientKey,
            taskId = taskId
        };

        // Crea una solicitud POST
        var request = new RestRequest("getTaskResult", Method.POST);
        request.AddJsonBody(requestBody);

        // Consulta el resultado de la tarea cada 5 segundos
        while (true)
        {
            var response = await client.ExecuteAsync(request);

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

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

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

            // Espera 5 segundos antes de volver a consultar
            Console.WriteLine("La tarea aún se está procesando, esperando 5 segundos...");
            await Task.Delay(5000);
        }
    }
}

Explicación:

  1. Método CreateTask:

    • Cliente y solicitud RestSharp: Inicializa un RestClient y crea un RestRequest para el punto final createTask con el método POST.
    • Carga útil de la solicitud: Configura los parámetros necesarios, incluidos clientKey, websiteURL, websiteKey y especifica el tipo de tarea como ReCaptchaV2TaskProxyLess.
    • Ejecución: Envía la solicitud y analiza la respuesta para recuperar el taskId.
  2. Método GetTaskResult:

    • Cliente y solicitud RestSharp: Inicializa un RestClient y crea un RestRequest para el punto final getTaskResult con el método POST.
    • Consulta: Consulta continuamente el estado de la tarea cada 5 segundos hasta que se complete (estado: ready).
    • Recuperación de resultados: Una vez que la tarea está lista, extrae el gRecaptchaResponse, que se puede utilizar para omitir el CAPTCHA.

Ejemplo: Resolver reCAPTCHA v3 con Capsolver

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

csharp Copy
using System;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RestSharp;

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

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

            // Paso 2: Recupera 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()
    {
        // Inicializa el cliente RestSharp
        var client = new RestClient(apiUrl);

        // Carga útil de la solicitud
        var requestBody = new
        {
            clientKey = clientKey,
            task = new
            {
                type = "ReCaptchaV3TaskProxyLess", // Tipo de tarea para reCAPTCHA v3 sin proxy
                websiteURL = "https://www.example.com", // La URL del sitio web para resolver CAPTCHA
                websiteKey = "SITE_KEY_HERE", // Clave del sitio reCAPTCHA
                minScore = 0.3, // Puntuación mínima deseada
                pageAction = "your_action" // Nombre de la acción definido en el sitio
            }
        };

        // Crea una solicitud POST
        var request = new RestRequest("createTask", Method.POST);
        request.AddJsonBody(requestBody);

        // Ejecuta la solicitud
        var response = await client.ExecuteAsync(request);

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

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

        // Devuelve el ID de la tarea para usar 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)
    {
        // Inicializa el cliente RestSharp
        var client = new RestClient(apiUrl);

        // Carga útil de la solicitud
        var requestBody = new
        {
            clientKey = clientKey,
            taskId = taskId
        };

        // Crea una solicitud POST
        var request = new RestRequest("getTaskResult", Method.POST);
        request.AddJsonBody(requestBody);

        // Consulta el resultado de la tarea cada 5 segundos
        while (true)
        {
            var response = await client.ExecuteAsync(request);

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

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

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

            // Espera 5 segundos antes de volver a consultar
            Console.WriteLine("La tarea aún se está procesando, esperando 5 segundos...");
            await Task.Delay(5000);
        }
    }
}

Explicación:

  1. Método CreateTask:

    • Cliente y solicitud RestSharp: Configura un RestClient y RestRequest para el punto final createTask.
    • Carga útil de la solicitud: Incluye parámetros adicionales como minScore y pageAction específicos de reCAPTCHA v3.
    • Ejecución: Envía la solicitud y recupera el taskId.
  2. Método GetTaskResult:

    • Similar al ejemplo v2, consulta la API Capsolver para obtener el resultado de la tarea y recupera el token CAPTCHA una vez que la tarea está lista.

Mejores prácticas para la extracción de datos web en C#

Al utilizar herramientas de extracción de datos web en C#, sigue siempre estas mejores prácticas:

  • Respeta robots.txt: Asegúrate de que el sitio web permita la extracción de datos web comprobando el archivo robots.txt.
  • Limitación de frecuencia: Evita hacer demasiadas solicitudes en un corto período de tiempo para evitar ser bloqueado por el sitio web.
  • Rotación de proxies: Utiliza proxies para distribuir solicitudes a través de múltiples IPs para evitar ser marcado como un bot.
  • Cabeceras de suplantación: Simula solicitudes similares a las de un navegador agregando encabezados personalizados, como User-Agent, a tus solicitudes HTTP.

Conclusión

Utilizando RestSharp para la extracción de datos web y Capsolver para la resolución de CAPTCHA, puedes automatizar de forma eficaz las interacciones con sitios web que emplean desafíos CAPTCHA. Asegúrate siempre de que tus actividades de extracción de datos web cumplan con los términos de servicio y los requisitos legales del sitio web de destino.

¡Feliz extracción!


Aviso de Cumplimiento: La información proporcionada en este blog es solo para fines informativos. CapSolver se compromete a cumplir con todas las leyes y regulaciones aplicables. El uso de la red de CapSolver para actividades ilegales, fraudulentas o abusivas está estrictamente prohibido y será investigado. Nuestras soluciones para la resolución de captcha mejoran la experiencia del usuario mientras garantizan un 100% de cumplimiento al ayudar a resolver las dificultades de captcha durante el rastreo de datos públicos. Fomentamos el uso responsable de nuestros servicios. Para obtener más información, visite nuestros Términos de Servicio y Política de Privacidad.

Máse