
Aloísio Vítor
Image Processing Expert

Web scraping é uma técnica essencial para extrair dados de sites, mas as aplicações web modernas geralmente implementam medidas de segurança, como desafios CAPTCHA, para evitar acesso automatizado. Os desafios CAPTCHA, como o Google reCAPTCHA, são projetados para diferenciar usuários humanos de bots, tornando difícil para scripts automatizados raspar conteúdo de forma eficaz.
Para superar esses obstáculos, os desenvolvedores podem utilizar ferramentas e serviços que simplificam as solicitações HTTP e manipulam a resolução de CAPTCHA. RestSharp é uma biblioteca C# poderosa e fácil de usar que simplifica o processo de fazer solicitações HTTP para APIs RESTful. Quando combinada com um analisador HTML como o HtmlAgilityPack, ela se torna uma solução robusta para tarefas de web scraping.

No entanto, encontrar desafios CAPTCHA durante o scraping pode interromper seu processo de automação. É aí que o Capsolver entra em ação. O Capsolver oferece soluções baseadas em API para resolver CAPTCHAs programaticamente, permitindo que seus scripts de scraping ignorem esses desafios e acessem o conteúdo desejado perfeitamente.
Neste guia abrangente, vamos guiá-lo através de:
Em C#, RestSharp é uma biblioteca popular para lidar com solicitações HTTP e interagir com APIs RESTful. Ele simplifica muitos aspectos da comunicação HTTP em comparação com o HttpClient integrado. Você pode combinar o RestSharp com um analisador HTML como HtmlAgilityPack para extrair dados de páginas da web.
Instale a biblioteca RestSharp usando o Gerenciador de Pacotes NuGet:
Install-Package RestSharp
Instale a biblioteca HtmlAgilityPack para ajudar a analisar o conteúdo HTML:
Install-Package HtmlAgilityPack
Instale Newtonsoft.Json para lidar com respostas JSON:
Install-Package Newtonsoft.Json
Vamos raspar citações do site Quotes to Scrape usando RestSharp e 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/";
// Inicialize o cliente RestSharp
var client = new RestClient(url);
// Crie uma solicitação GET
var request = new RestRequest(Method.GET);
// Execute a solicitação
var response = await client.ExecuteAsync(request);
if (response.IsSuccessful)
{
// Analise o conteúdo da página usando HtmlAgilityPack
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(response.Content);
// 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}");
}
}
}
RestClient com a URL de destino e cria um RestRequest para o método GET.text.Quando um site usa reCAPTCHA v2 ou v3 para segurança, você pode resolver o CAPTCHA usando a API Capsolver. Abaixo está como você pode integrar o Capsolver com RestSharp para resolver desafios reCAPTCHA.
Newtonsoft.Json é usado para lidar com a análise JSON de respostas do Capsolver:
Install-Package Newtonsoft.Json
Nesta seção, demonstraremos como resolver desafios reCAPTCHA v2 usando a API Capsolver e 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"; // Substitua pela sua Chave da API Capsolver
static async Task Main(string[] args)
{
try
{
// Passo 1: Crie uma tarefa para resolver reCAPTCHA v2
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 CAPTCHA
private static async Task<string> CreateTask()
{
// Inicialize o cliente RestSharp
var client = new RestClient(apiUrl);
// Carga útil da solicitação
var requestBody = new
{
clientKey = clientKey,
task = new
{
type = "ReCaptchaV2TaskProxyLess", // Tipo de tarefa para reCAPTCHA v2 sem proxy
websiteURL = "https://www.example.com", // A URL do site para resolver CAPTCHA
websiteKey = "SITE_KEY_HERE" // Chave do site reCAPTCHA
}
};
// Crie uma solicitação POST
var request = new RestRequest("createTask", Method.POST);
request.AddJsonBody(requestBody);
// Execute a solicitação
var response = await client.ExecuteAsync(request);
if (!response.IsSuccessful)
{
throw new Exception("Falha ao criar a tarefa: " + response.Content);
}
JObject jsonResponse = JObject.Parse(response.Content);
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 CAPTCHA
private static async Task<string> GetTaskResult(string taskId)
{
// Inicialize o cliente RestSharp
var client = new RestClient(apiUrl);
// Carga útil da solicitação
var requestBody = new
{
clientKey = clientKey,
taskId = taskId
};
// Crie uma solicitação POST
var request = new RestRequest("getTaskResult", Method.POST);
request.AddJsonBody(requestBody);
// Sondar o resultado da tarefa a cada 5 segundos
while (true)
{
var response = await client.ExecuteAsync(request);
if (!response.IsSuccessful)
{
throw new Exception("Falha ao obter o resultado da tarefa: " + response.Content);
}
JObject jsonResponse = JObject.Parse(response.Content);
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, esperando 5 segundos...");
await Task.Delay(5000);
}
}
}
Método CreateTask:
RestClient e cria um RestRequest para o endpoint createTask com o método POST.clientKey, websiteURL, websiteKey e especifica o tipo de tarefa como ReCaptchaV2TaskProxyLess.taskId.Método GetTaskResult:
RestClient e cria um RestRequest para o endpoint getTaskResult com o método POST.status: ready).gRecaptchaResponse, que pode ser usado para contornar o CAPTCHA.Nesta seção, demonstraremos como resolver desafios reCAPTCHA v3 usando a API Capsolver e 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"; // Substitua pela sua Chave da API 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 CAPTCHA
private static async Task<string> CreateTask()
{
// Inicialize o cliente RestSharp
var client = new RestClient(apiUrl);
// Carga útil da solicitação
var requestBody = new
{
clientKey = clientKey,
task = new
{
type = "ReCaptchaV3TaskProxyLess", // Tipo de tarefa para reCAPTCHA v3 sem proxy
websiteURL = "https://www.example.com", // A URL do site para resolver CAPTCHA
websiteKey = "SITE_KEY_HERE", // Chave do site reCAPTCHA
minScore = 0.3, // Pontuação mínima desejada
pageAction = "your_action" // Nome da ação definido no site
}
};
// Crie uma solicitação POST
var request = new RestRequest("createTask", Method.POST);
request.AddJsonBody(requestBody);
// Execute a solicitação
var response = await client.ExecuteAsync(request);
if (!response.IsSuccessful)
{
throw new Exception("Falha ao criar a tarefa: " + response.Content);
}
JObject jsonResponse = JObject.Parse(response.Content);
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 CAPTCHA
private static async Task<string> GetTaskResult(string taskId)
{
// Inicialize o cliente RestSharp
var client = new RestClient(apiUrl);
// Carga útil da solicitação
var requestBody = new
{
clientKey = clientKey,
taskId = taskId
};
// Crie uma solicitação POST
var request = new RestRequest("getTaskResult", Method.POST);
request.AddJsonBody(requestBody);
// Sondar o resultado da tarefa a cada 5 segundos
while (true)
{
var response = await client.ExecuteAsync(request);
if (!response.IsSuccessful)
{
throw new Exception("Falha ao obter o resultado da tarefa: " + response.Content);
}
JObject jsonResponse = JObject.Parse(response.Content);
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, esperando 5 segundos...");
await Task.Delay(5000);
}
}
}
Método CreateTask:
RestClient e RestRequest para o endpoint createTask.minScore e pageAction específicos para reCAPTCHA v3.taskId.Método GetTaskResult:
Ao usar ferramentas de web scraping em C#, siga sempre essas boas práticas:
robots.txt: Certifique-se de que o site permite web scraping verificando o arquivo robots.txt.User-Agent, às suas solicitações HTTP.Usando RestSharp para web scraping e Capsolver para resolução de CAPTCHA, você pode automatizar de forma eficaz as 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 e requisitos legais do site de destino.
Feliz scraping!
Guia de captcha para fluxos de trabalho de dados aprovados: aprenda os tipos de desafios, tratamento de API, consistência de proxies, tentativas de repetição e uso responsável.

API de resolução rápida de CAPTCHA para automação: compare fluxos de trabalho de tokens, desafios suportados, verificações de latência e integração responsável da CapSolver.
