CAPSOLVER
Blog
Como usar HttpClient (Biblioteca C#) para Web Scraping

Como usar HttpClient (biblioteca C#) para web scraping

Logo of CapSolver

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:

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 Copy
Install-Package HtmlAgilityPack
  • Instale Newtonsoft.Json para lidar com respostas JSON:
bash Copy
Install-Package Newtonsoft.Json

Exemplo: Raspando "Quotes to Scrape"

Vamos raspar citações do site Quotes to Scrape usando HttpClient e HtmlAgilityPack.

csharp Copy
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 Copy
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 Copy
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:

  1. Método CreateTask:

    • Este método envia uma solicitação POST para o endpoint /createTask do Capsolver para criar uma nova tarefa para resolver um desafio reCAPTCHA v2.
    • A solicitação inclui a clientKey, websiteURL, websiteKey e especifica o tipo de tarefa como ReCaptchaV2TaskProxyLess.
    • O método retorna um taskId, que será usado para recuperar o resultado da tarefa.
  2. Método GetTaskResult:

    • Este método envia uma solicitação POST para o endpoint /getTaskResult para 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.

Exemplo: Resolvendo reCAPTCHA v3 com Capsolver

Nesta seção, demonstraremos como resolver desafios reCAPTCHA v3 usando a API Capsolver e HttpClient.

csharp Copy
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:

  1. Método CreateTask:

    • Este método envia uma solicitação POST para o endpoint /createTask do Capsolver para criar uma nova tarefa para resolver um desafio reCAPTCHA v3.
    • A solicitação inclui a clientKey, websiteURL, websiteKey e especifica o tipo de tarefa como ReCaptchaV3TaskProxyLess.
    • O método retorna um taskId, que será usado para recuperar o resultado da tarefa.
  2. Método GetTaskResult:

    • Este método envia uma solicitação POST para o endpoint /getTaskResult para 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.

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 arquivo robots.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