Como usar HttpClient (biblioteca C#) para web scraping

Aloísio Vítor
Image Processing Expert
13-Sep-2024

Desafios CAPTCHA, como o Google reCAPTCHA, são comumente usados por sites para bloquear bots e impedir acesso automatizado ao seu conteúdo. Para contornar tais desafios programaticamente, você pode usar serviços como o Capsolver, que oferece soluções baseadas em API para resolver esses CAPTCHAs.
Neste guia, mostraremos como:
- Raspar sites usando C# HttpClient e HtmlAgilityPack.
- Resolver desafios reCAPTCHA usando a API Capsolver.
Web Scraping com C# HttpClient
Em C#, a classe HttpClient é comumente usada para enviar solicitações HTTP e receber respostas de sites. Você pode combinar isso com um analisador HTML como HtmlAgilityPack para extrair dados de páginas da web.
Pré-requisitos
- Instale a biblioteca HtmlAgilityPack usando o Gerenciador de Pacotes NuGet para ajudar a analisar o conteúdo HTML:
bash
Install-Package HtmlAgilityPack
- Instale Newtonsoft.Json para lidar com respostas JSON:
bash
Install-Package Newtonsoft.Json
Exemplo: Raspando "Quotes to Scrape"
Vamos raspar citações do site Quotes to Scrape usando HttpClient e 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/";
// Envie uma solicitação GET para a página
HttpResponseMessage response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
// Analise o conteúdo da página usando o HtmlAgilityPack
string pageContent = await response.Content.ReadAsStringAsync();
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(pageContent);
// Encontre todas as citações na página
var quotes = htmlDoc.DocumentNode.SelectNodes("//span[@class='text']");
// Imprima cada citação
foreach (var quote in quotes)
{
Console.WriteLine(quote.InnerText);
}
}
else
{
Console.WriteLine($"Falha ao recuperar a página. Código de Status: {response.StatusCode}");
}
}
}
Explicação:
- HttpClient: Envia uma solicitação GET para o site.
- HtmlAgilityPack: Analisa o conteúdo HTML e extrai citações selecionando elementos com a classe
text.
Resolvendo reCAPTCHA v3 & reCaptcha v2 com Capsolver usando HttpClient
Quando um site emprega reCAPTCHA v3 & reCaptcha v2 para segurança, você pode resolver o CAPTCHA usando a API Capsolver. Abaixo está como você pode integrar o Capsolver com HttpClient para resolver desafios reCAPTCHA.
Pré-requisitos
- Newtonsoft.Json é usado para lidar com a análise JSON de respostas do Capsolver:
bash
Install-Package Newtonsoft.Json
Exemplo: Resolvendo reCAPTCHA v2 com Capsolver
Nesta seção, demonstraremos como resolver desafios reCAPTCHA v2 usando a API Capsolver e 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"; // Substitua pela sua Chave de API do Capsolver
static async Task Main(string[] args)
{
try
{
// Passo 1: Crie uma tarefa para resolver reCAPTCHA v3
string taskId = await CreateTask();
Console.WriteLine("ID da Tarefa: " + taskId);
// Passo 2: Recupere o resultado da tarefa
string taskResult = await GetTaskResult(taskId);
Console.WriteLine("Resultado da Tarefa (Token CAPTCHA): " + taskResult);
}
catch (Exception ex)
{
Console.WriteLine("Erro: " + ex.Message);
}
}
// Método para criar uma nova tarefa de resolução de CAPTCHA
private static async Task<string> CreateTask()
{
using (HttpClient client = new HttpClient())
{
// Carga útil da solicitação
var requestBody = new
{
clientKey = clientKey,
task = new
{
type = "ReCaptchaV2TaskProxyLess", // Tipo de tarefa para reCAPTCHA v3 sem proxy
websiteURL = "", // O URL do site para resolver o CAPTCHA
websiteKey = "" // Chave do site reCAPTCHA
}
};
// Envie a solicitação para criar a tarefa
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("Falha ao criar a tarefa: " + responseContent);
}
JObject jsonResponse = JObject.Parse(responseContent);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("Erro ao criar a tarefa: " + jsonResponse["errorDescription"]);
}
// Retorne o ID da tarefa para ser usado na próxima etapa
return jsonResponse["taskId"].ToString();
}
}
// Método para recuperar o resultado de uma tarefa de resolução de CAPTCHA
private static async Task<string> GetTaskResult(string taskId)
{
using (HttpClient client = new HttpClient())
{
// Carga útil da solicitação
var requestBody = new
{
clientKey = clientKey,
taskId = taskId
};
var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
// Pesquise pelo resultado da tarefa a 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("Falha ao obter o resultado da tarefa: " + responseContent);
}
JObject jsonResponse = JObject.Parse(responseContent);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("Erro ao obter o resultado da tarefa: " + jsonResponse["errorDescription"]);
}
// Se a tarefa estiver pronta, retorne o token CAPTCHA
if (jsonResponse["status"].ToString() == "ready")
{
return jsonResponse["solution"]["gRecaptchaResponse"].ToString();
}
// Espere 5 segundos antes de verificar novamente
Console.WriteLine("A tarefa ainda está sendo processada, aguardando 5 segundos...");
await Task.Delay(5000);
}
}
}
}
Explicação:
-
Método CreateTask:
- Este método envia uma solicitação POST para o endpoint
/createTaskdo Capsolver para criar uma nova tarefa para resolver um desafio reCAPTCHA v2. - A solicitação inclui a
clientKey,websiteURL,websiteKeye especifica o tipo de tarefa comoReCaptchaV2TaskProxyLess. - O método retorna um
taskId, que será usado para recuperar o resultado da tarefa.
- Este método envia uma solicitação POST para o endpoint
-
Método GetTaskResult:
- Este método envia uma solicitação POST para o endpoint
/getTaskResultpara verificar o resultado da tarefa criada anteriormente. - Ele fica sondando o status da tarefa a cada 5 segundos até que a tarefa seja concluída (
status: ready). - Uma vez que a tarefa está pronta, ela retorna o
gRecaptchaResponse, que pode ser usado para contornar o CAPTCHA.
- Este método envia uma solicitação POST para o endpoint
Exemplo: Resolvendo reCAPTCHA v3 com Capsolver
Nesta seção, demonstraremos como resolver desafios reCAPTCHA v3 usando a API Capsolver e 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"; // Substitua pela sua Chave de API do Capsolver
static async Task Main(string[] args)
{
try
{
// Passo 1: Crie uma tarefa para resolver reCAPTCHA v3
string taskId = await CreateTask();
Console.WriteLine("ID da Tarefa: " + taskId);
// Passo 2: Recupere o resultado da tarefa
string taskResult = await GetTaskResult(taskId);
Console.WriteLine("Resultado da Tarefa (Token CAPTCHA): " + taskResult);
}
catch (Exception ex)
{
Console.WriteLine("Erro: " + ex.Message);
}
}
// Método para criar uma nova tarefa de resolução de CAPTCHA
private static async Task<string> CreateTask()
{
using (HttpClient client = new HttpClient())
{
// Carga útil da solicitação
var requestBody = new
{
clientKey = clientKey,
task = new
{
type = "ReCaptchaV3TaskProxyLess", // Tipo de tarefa para reCAPTCHA v3 sem proxy
websiteURL = "", // O URL do site para resolver o CAPTCHA
websiteKey = "" // Chave do site reCAPTCHA
}
};
// Envie a solicitação para criar a tarefa
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("Falha ao criar a tarefa: " + responseContent);
}
JObject jsonResponse = JObject.Parse(responseContent);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("Erro ao criar a tarefa: " + jsonResponse["errorDescription"]);
}
// Retorne o ID da tarefa para ser usado na próxima etapa
return jsonResponse["taskId"].ToString();
}
}
// Método para recuperar o resultado de uma tarefa de resolução de CAPTCHA
private static async Task<string> GetTaskResult(string taskId)
{
using (HttpClient client = new HttpClient())
{
// Carga útil da solicitação
var requestBody = new
{
clientKey = clientKey,
taskId = taskId
};
var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
// Pesquise pelo resultado da tarefa a 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("Falha ao obter o resultado da tarefa: " + responseContent);
}
JObject jsonResponse = JObject.Parse(responseContent);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("Erro ao obter o resultado da tarefa: " + jsonResponse["errorDescription"]);
}
// Se a tarefa estiver pronta, retorne o token CAPTCHA
if (jsonResponse["status"].ToString() == "ready")
{
return jsonResponse["solution"]["gRecaptchaResponse"].ToString();
}
// Espere 5 segundos antes de verificar novamente
Console.WriteLine("A tarefa ainda está sendo processada, aguardando 5 segundos...");
await Task.Delay(5000);
}
}
}
}
Explicação:
-
Método CreateTask:
- Este método envia uma solicitação POST para o endpoint
/createTaskdo Capsolver para criar uma nova tarefa para resolver um desafio reCAPTCHA v3. - A solicitação inclui a
clientKey,websiteURL,websiteKeye especifica o tipo de tarefa comoReCaptchaV3TaskProxyLess. - O método retorna um
taskId, que será usado para recuperar o resultado da tarefa.
- Este método envia uma solicitação POST para o endpoint
-
Método GetTaskResult:
- Este método envia uma solicitação POST para o endpoint
/getTaskResultpara verificar o resultado da tarefa criada anteriormente. - Ele fica sondando o status da tarefa a cada 5 segundos até que a tarefa seja concluída (
status: ready). - Uma vez que a tarefa está pronta, ela retorna o
gRecaptchaResponse, que pode ser usado para contornar o CAPTCHA.
- Este método envia uma solicitação POST para o endpoint
Boas Práticas de Web Scraping em C#
Ao usar ferramentas de web scraping em C#, siga sempre essas boas práticas:
- Respeite o
robots.txt: Certifique-se de que o site permite web scraping verificando o arquivorobots.txt. - Limitação de Taxa: Evite fazer muitas solicitações em um curto período para evitar ser bloqueado pelo site.
- Rotação de Proxy: Use proxies para distribuir solicitações entre vários IPs para evitar ser marcado como um bot.
- Spoof Headers: Simule solicitações semelhantes a navegadores adicionando cabeçalhos personalizados, como
User-Agent, às suas solicitações HTTP.
Conclusão
Usando HttpClient para web scraping e Capsolver para resolução de CAPTCHA, você pode automatizar efetivamente interações com sites que empregam desafios CAPTCHA. Certifique-se sempre de que suas atividades de web scraping estejam em conformidade com os termos de serviço do site de destino e os requisitos legais.
Feliz raspando!
Este guia integra o web scraping usando HtmlAgilityPack e demonstra como lidar com desafios reCAPTCHA com Capsolver, usando apenas HttpClient em C#.
Declaração de Conformidade: As informações fornecidas neste blog são apenas para fins informativos. A CapSolver está comprometida em cumprir todas as leis e regulamentos aplicáveis. O uso da rede CapSolver para atividades ilegais, fraudulentas ou abusivas é estritamente proibido e será investigado. Nossas soluções de resolução de captcha melhoram a experiência do usuário enquanto garantem 100% de conformidade ao ajudar a resolver dificuldades de captcha durante a coleta de dados públicos. Incentivamos o uso responsável de nossos serviços. Para mais informações, visite nossos Termos de Serviço e Política de Privacidade.
Mais

Qual é a melhor extensão para resolver CAPTCHA 2026?
No mundo em constante evolução da segurança online, os desafios CAPTCHA tornaram-se uma barreira comum para os usuários da internet...

Sora Fujimoto
12-Dec-2025

Lumiproxy: Proxy Premium para Scraping de Web e Coleta de Dados
Neste artigo, mostraremos o que é Lumiproxy e os serviços que eles oferecem.

Ethan Collins
12-Dec-2025

Genlogin: Revolutionar sua experiência de automação da web
Neste artigo, vamos mostrar para você o que é o Genlogin e os serviços que eles oferecem.

Rajinder Singh
12-Dec-2025

Proxys.io: Proxies individuais para qualquer tarefa
Neste artigo, vamos mostrar para você o que é o Proxys.io e os serviços que eles oferecem.

Rajinder Singh
12-Dec-2025

Tabproxy: Bom custo proxy residencial internacional
Neste artigo, vamos mostrar para você o que é o Tabproxy e os serviços que eles oferecem.

Ethan Collins
12-Dec-2025

O que são erros 402, 403, 404 e 429 em raspagem de web? Um Guia Completo
Domine o tratamento de erros de raspagem de web entendendo o que são os erros 402, 403, 404 e 429. Aprenda a corrigir o erro 403 Proibido, implementar soluções para o erro de limitação de taxa 429 e tratar o código de status Payment Required emergente 402.

Lucas Mitchell
12-Dec-2025

