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

Lucas Mitchell
Automation Engineer
13-Sep-2024

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
Install-Package HtmlAgilityPack
- Instale Newtonsoft.Json para manejar respuestas JSON:
bash
Install-Package Newtonsoft.Json
Ejemplo: raspando "Quotes to Scrape"
Vamos a raspar citas del sitio web Quotes to Scrape usando HttpClient y HtmlAgilityPack.
csharp
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
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
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:
-
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 comoReCaptchaV2TaskProxyLess
. - El método devuelve un
taskId
, que se usará para recuperar el resultado de la tarea.
- Este método envía una solicitud POST al punto final
-
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.
- Este método envía una solicitud POST al punto final
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
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:
-
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 comoReCaptchaV3TaskProxyLess
. - El método devuelve un
taskId
, que se usará para recuperar el resultado de la tarea.
- Este método envía una solicitud POST al punto final
-
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.
- Este método envía una solicitud POST al punto final
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 archivorobots.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#.
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

Reconocimiento de Imágenes con IA: Conceptos Básicos y Cómo Resolverlo
Dile con adiós a las dificultades de los CAPTCHA de imagen – ¡El motor de visión de CapSolver las resuelve de forma rápida, inteligente y sin problemas!

Aloísio Vítor
25-Apr-2025

Los mejores agentes de usuario para web scraping y cómo usarlos
Una guía sobre los mejores agentes de usuario para web scraping y su uso efectivo para evitar la detección. Explore la importancia de los agentes de usuario, sus tipos y cómo implementarlos para un web scraping fluido e indetectable.

Aloísio Vítor
07-Mar-2025

Huellas dactilares TLS de Cloudflare: Qué son y cómo solucionarlas
Aprenda sobre el uso de la huella digital TLS de Cloudflare para la seguridad, cómo detecta y bloquea bots, y explore métodos efectivos para solucionarlo para tareas de raspado web y navegación automatizada.

Aloísio Vítor
28-Feb-2025

¿Por qué sigo teniendo que verificar que no soy un robot?
Aprenda por qué Google le solicita que verifique que no es un robot y explore soluciones como el uso de la API de CapSolver para resolver los desafíos de CAPTCHA de manera eficiente.

Aloísio Vítor
27-Feb-2025

Cómo extraer datos de un sitio web protegido por Cloudflare
En esta guía, exploraremos técnicas éticas y efectivas para extraer datos de sitios web protegidos por Cloudflare.

Aloísio Vítor
20-Feb-2025

¿Por qué las páginas web piensan que soy un bot? Y cómo solucionarlo
Entiende por qué los sitios web te marcan como bot y cómo evitar la detección. Los desencadenantes clave incluyen los desafíos CAPTCHA, las IP sospechosas y el comportamiento inusual del navegador.

Aloísio Vítor
20-Feb-2025