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

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.

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:
- Extraer sitios web utilizando RestSharp y HtmlAgilityPack.
- Resolver desafíos reCAPTCHA utilizando la API Capsolver.
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:
bashInstall-Package RestSharp -
Instala la biblioteca HtmlAgilityPack para ayudar a analizar el contenido HTML:
bashInstall-Package HtmlAgilityPack -
Instala Newtonsoft.Json para manejar respuestas JSON:
bashInstall-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
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
RestClientcon la URL de destino y crea unRestRequestpara 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:
bashInstall-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
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:
-
Método CreateTask:
- Cliente y solicitud RestSharp: Inicializa un
RestClienty crea unRestRequestpara el punto finalcreateTaskcon el método POST. - Carga útil de la solicitud: Configura los parámetros necesarios, incluidos
clientKey,websiteURL,websiteKeyy especifica el tipo de tarea comoReCaptchaV2TaskProxyLess. - Ejecución: Envía la solicitud y analiza la respuesta para recuperar el
taskId.
- Cliente y solicitud RestSharp: Inicializa un
-
Método GetTaskResult:
- Cliente y solicitud RestSharp: Inicializa un
RestClienty crea unRestRequestpara el punto finalgetTaskResultcon 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.
- Cliente y solicitud RestSharp: Inicializa un
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
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:
-
Método CreateTask:
- Cliente y solicitud RestSharp: Configura un
RestClientyRestRequestpara el punto finalcreateTask. - Carga útil de la solicitud: Incluye parámetros adicionales como
minScoreypageActionespecíficos de reCAPTCHA v3. - Ejecución: Envía la solicitud y recupera el
taskId.
- Cliente y solicitud RestSharp: Configura un
-
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 archivorobots.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

¿Qué es la mejor extensión para resolver CAPTCHA 2026?
En el mundo en constante evolución de la seguridad en línea, los desafíos CAPTCHA se han convertido en un obstáculo común para los usuarios de internet...

Lucas Mitchell
12-Dec-2025

Lumiproxy: Proxy Premium para Raspado de Web y Recolección de Datos
En este artículo, mostraremos qué es Lumiproxy y los servicios que ofrecen.

Ethan Collins
12-Dec-2025

Genlogin: Revoluciona tu experiencia de automatización web
En este artículo, te mostraremos qué es Genlogin y los servicios que ofrecen.

Rajinder Singh
12-Dec-2025

Proxys.io: Proxys individuales para cualquier tarea
En este artículo, te mostraremos qué es Proxys.io y los servicios que ofrecen.

Nikolai Smirnov
12-Dec-2025

Tabproxy: Buen valor de proxy residencial en el extranjero
En este artículo, te mostraremos qué es Tabproxy y los servicios que ofrecen.

Lucas Mitchell
12-Dec-2025

Proxys Residenciales IP2World: Soluciones Líderes Globales de Proxy IP
En este artículo, les mostraremos qué es IP2World y los servicios que ofrecen.

Ethan Collins
12-Dec-2025

