
Ethan Collins
Pattern Recognition Specialist

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:
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.
Instala la biblioteca RestSharp utilizando NuGet Package Manager:
Install-Package RestSharp
Instala la biblioteca HtmlAgilityPack para ayudar a analizar el contenido HTML:
Install-Package HtmlAgilityPack
Instala Newtonsoft.Json para manejar respuestas JSON:
Install-Package Newtonsoft.Json
Vamos a extraer frases del sitio web Quotes to Scrape utilizando RestSharp y HtmlAgilityPack.
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}");
}
}
}
RestClient con la URL de destino y crea un RestRequest para el método GET.text.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.
Newtonsoft.Json se utiliza para manejar el análisis JSON de las respuestas de Capsolver:
Install-Package Newtonsoft.Json
En esta sección, demostraremos cómo resolver desafíos reCAPTCHA v2 utilizando la API Capsolver y RestSharp.
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);
}
}
}
Método CreateTask:
RestClient y crea un RestRequest para el punto final createTask con el método POST.clientKey, websiteURL, websiteKey y especifica el tipo de tarea como ReCaptchaV2TaskProxyLess.taskId.Método GetTaskResult:
RestClient y crea un RestRequest para el punto final getTaskResult con el método POST.estado: ready).gRecaptchaResponse, que se puede utilizar para omitir el CAPTCHA.En esta sección, demostraremos cómo resolver desafíos reCAPTCHA v3 utilizando la API Capsolver y RestSharp.
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);
}
}
}
Método CreateTask:
RestClient y RestRequest para el punto final createTask.minScore y pageAction específicos de reCAPTCHA v3.taskId.Método GetTaskResult:
Al utilizar herramientas de extracción de datos web en C#, sigue siempre estas mejores prácticas:
robots.txt: Asegúrate de que el sitio web permita la extracción de datos web comprobando el archivo robots.txt.User-Agent, a tus solicitudes HTTP.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!
Guía de captcha para flujos de trabajo de datos aprobados: aprende tipos de desafíos, manejo de API, consistencia de proxy, reintentos y uso responsable.

API rápida para resolver CAPTCHA para automatización: comparar flujos de trabajo de tokens, desafíos soportados, verificaciones de latencia e integración de CapSolver responsable.
