Contornar restrições e extrair dados de forma eficaz com proxies e C# HttpClient
Suciu Dan em 13 de abril de 2023

A raspagem da Web é uma ferramenta poderosa que permite extrair dados valiosos de sítios Web para vários fins. No entanto, muitos sítios Web bloqueiam as tentativas de recolha de dados para proteger os seus dados. Uma forma de contornar estes bloqueios é através da utilização de um servidor proxy.
Neste artigo, exploraremos como usar um proxy com o C# HttpClient, uma biblioteca popular para fazer solicitações HTTP em C#. Cobriremos os pré-requisitos, a configuração e as dicas para depuração e solução de problemas.
Além disso, veremos como enviar uma solicitação e melhorar o desempenho das solicitações. No final deste artigo, você terá uma boa compreensão de como usar um proxy com o C# HttpClient e como ele pode beneficiar seus esforços de raspagem da Web.
O que são proxies?
Os proxies, também designados por servidores proxy, actuam como intermediários entre um cliente (como um navegador Web ou um scraper) e um servidor de destino (como um sítio Web). O cliente envia um pedido ao proxy, que o reencaminha para o servidor de destino.
Quando o servidor de destino responde, o proxy envia a resposta de volta para o cliente. No scraping da Web, a utilização de proxies pode mascarar o endereço IP do scraper, impedindo que o sítio Web detecte e bloqueie o pedido.
A utilização de múltiplos proxies também pode ajudar a evitar a deteção e o bloqueio. Alguns fornecedores de proxy até oferecem a opção de rotação de IPs, proporcionando uma proteção adicional contra o bloqueio dos seus pedidos.
Criando um projeto C#
Este artigo utilizará o Visual Studio 2022 para Windows e o .Net 6.0. Para acompanhar, abra o Visual

No Visual Studio, selecione C# no menu pendente Todas as linguagens. Se o modelo da Aplicação de Consola não estiver visível, utilize a entrada Procurar modelos para o localizar. Em seguida, clique em Avançar.
Escolha a localização do seu projeto no ecrã seguinte. Em seguida, clique em Seguinte para avançar para o ecrã Informações adicionais. Certifique-se de que tem o .NET 7.0 selecionado antes de clicar em Criar.

Após a criação do projeto, verá o código Hello World no ecrã:
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
Efetuar um pedido HTTP
Vamos fazer nossa primeira requisição com o `HttpClient`. Substitua o código fictício por este:
using var client = new HttpClient();
var result = await client.GetStringAsync("https://api.ipify.org?format=json");
Console.WriteLine(result);
Esse código usa a classe HttpClient do namespace System.Net.Http para fazer uma solicitação HTTP GET para o ponto de extremidade https://api.ipify.org/ e recuperar a resposta como uma cadeia de caracteres.
Segue-se uma análise do código:
- `usando var client = new HttpClient();`: Esta linha cria uma nova instância da classe `HttpClient` e a atribui à variável client. A instrução `using` garante o descarte correto do objeto cliente quando ele não for mais necessário.
- `var result = await client.GetStringAsync("https://api.ipify.org/");`: Esta linha utiliza o método `GetStringAsync()` do objeto cliente para enviar uma solicitação GET para o ponto de extremidade https://api.ipify.org/. Esse método lê a resposta como uma string e a armazena na variável result. A palavra-chave await torna a solicitação assíncrona, permitindo que o programa continue executando outro código enquanto a solicitação está sendo processada.
- `Console.WriteLine(result);`: Esta linha escreve o conteúdo da variável result no console, que é a resposta da solicitação GET.
Guarde o código e execute-o. Verá o seu endereço IP no terminal.
Usando Proxies com HttpClient
Antes de voltarmos à codificação, visite o site Free Proxy List e selecione um proxy que esteja mais próximo da sua localização. Para este exemplo, vou selecionar um proxy localizado na Alemanha. Anote o endereço IP e a porta do proxy selecionado.
Para utilizar um proxy com HttpClient, precisamos criar uma instância de HttpClientHandler. Dentro desta instância, definimos duas propriedades: a URL do proxy e a porta e `ServerCertificateCustomValidationCallback`. Esse é um nome longo para uma variável, mas isso é importante.
O `ServerCertificateCustomValidationCallback` diz ao HttpClientHandler para ignorar qualquer erro de certificado HTTPS. Você pode estar se perguntando por que você tem que fazer isso.
O servidor proxy intercepta e inspecciona o tráfego, incluindo o certificado HTTPS, antes de o reencaminhar para o servidor de destino. Como resultado, o certificado apresentado pelo servidor de destino ao servidor proxy pode ser diferente do apresentado ao cliente.
Por predefinição, o HttpClient e outras bibliotecas semelhantes validarão o certificado apresentado pelo servidor de destino e, se não for válido ou não corresponder ao apresentado ao cliente, será aberta uma exceção. É daí que surgem os erros de certificado.
Ignorar os erros do certificado HTTPS quando se utiliza o modo proxy permite que o pedido continue mesmo que o certificado não seja válido, o que é útil em alguns casos em que o certificado é intercetado e modificado pelo servidor proxy.
É hora de escrever o código. Vamos começar com a instância HttpClientHandler:
using System.Net;
using var httpClientHandler = new HttpClientHandler
{
Proxy = new WebProxy("http://5.9.139.204:24000"),
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
};
Precisamos fornecer à classe HttpClient uma instância do HttpClientHandler. O código do cliente modificado deve ter a seguinte aparência:
using var client = new HttpClient(httpClientHandler);
O código completo deve ter o seguinte aspeto:
using System.Net;
using var httpClientHandler = new HttpClientHandler
{
Proxy = new WebProxy("http://5.9.139.204:24000"),
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
};
using var client = new HttpClient(httpClientHandler);
var result = await client.GetStringAsync("https://api.ipify.org?format=json");
Console.WriteLine(result);
A execução do código devolverá o endereço IP do proxy em vez do seu endereço IP. Pode abrir o URL do ipify no seu browser e comparar os resultados.
Vamos fazer a autenticação
Quando se inscreve num serviço proxy premium, recebe um nome de utilizador e uma palavra-passe para utilizar na sua aplicação para autenticação.
É altura de substituir a definição WebProxy por esta:
Proxy = new WebProxy
{
Address = new Uri($"http://5.9.139.204:24000"),
Credentials = new NetworkCredential(
userName: "PROXY_USERNAME",
password: "PROXY_PASSWORD"
)
},
Substituindo as credenciais do marcador de posição, actualizando o URL do proxy e executando o código, verá que o endereço IP impresso é diferente do utilizado pelo seu computador. Experimente!
Proxies rotativos
A rotação de proxies é benéfica, pois ajuda a evitar a deteção e impede que os sítios Web bloqueiem o seu endereço IP. Os sítios Web podem monitorizar e bloquear os endereços IP que fazem pedidos excessivos num curto espaço de tempo ou os que estão ligados a actividades de scraping.
Podemos usar o site Free Proxy List para gerar uma lista de proxies que podemos rodar com cada pedido enviado. Ao implementar esta técnica, cada pedido terá um endereço IP distinto, tornando o sítio Web alvo menos suspeito.
Tenha em atenção que a lista de proxies que pode encontrar no sítio Web pode ser diferente da lista que eu compilei. Escolhi cinco proxies e defini-los numa lista como esta:
List<string> proxiesList = new List<string> {
"http://65.108.230.238:45977",
"http://163.116.177.46:808",
"http://163.116.177.31:808",
"http://20.111.54.16:80",
"http://185.198.61.146:3128"
};
Vamos escolher um índice aleatório desta lista e utilizar o item desse índice selecionado com a classe Uri:
var random = new Random();
int index = random.Next(proxiesList.Count);
O que precisamos de fazer agora é combinar todas as partes. A versão final do código do seu raspador deve ser a seguinte:
using System.Net;
List<string> proxiesList = new List<string> {
"http://65.108.230.238:45977",
"http://163.116.177.46:808",
"http://163.116.177.31:808",
"http://20.111.54.16:80",
"http://185.198.61.146:3128"
};
var random = new Random();
int index = random.Next(proxiesList.Count);
using var httpClientHandler = new HttpClientHandler
{
Proxy = new WebProxy(proxiesList[index]),
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
};
using var client = new HttpClient(httpClientHandler);
var result = await client.GetStringAsync("https://api.ipify.org?format=json");
Console.WriteLine(result);
Utilização de proxies WebScrapingAPI
Optar por proxies premium de um serviço como o WebScrapingAPI é uma melhor escolha do que utilizar proxies gratuitos, porque são mais fiáveis, mais rápidos e oferecem maior segurança. Os proxies premium são menos susceptíveis de serem bloqueados pelos sítios Web e têm um tempo de resposta inferior.
Em comparação, os proxies gratuitos podem ser lentos, pouco fiáveis, conter malware e é mais provável que tenham uma grande taxa de insucesso porque o sítio de destino bloqueará os seus pedidos.
Interessado em experimentar o WebScrapingAPI? Não há problema, basta inscrever-se no nosso teste gratuito de 14 dias. Pode utilizar os 5.000 créditos para testar todas as funcionalidades disponíveis.
Depois de ter uma conta, vá para o API Playground e escolha o separador Modo Proxy na secção Amostras de código.

Agora vamos usar o URL de proxy gerado no separador Modo de proxy com a nossa implementação C#.
Actualize o URL do proxy e as credenciais no httpClientHandler para que tenham o seguinte aspeto:
using var httpClientHandler = new HttpClientHandler
{
Proxy = new WebProxy
{
Address = new Uri($"http://proxy.webscrapingapi.com:80"),
Credentials = new NetworkCredential(
userName: "webscrapingapi.render_js=0.device=desktop.proxy_type=datacenter",
password: "YOUR_API_KEY"
)
},
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
};
Pode utilizar a propriedade username para ativar ou desativar funcionalidades específicas da API. Lembre-se de definir também a sua chave de API na propriedade password. Pode consultar a documentação completa aqui.
Sempre que executar este código, receberá um endereço IP diferente, uma vez que a WebScrapingAPI roda os IPs em cada pedido. Para saber mais sobre esse recurso, leia a documentação sobre o Modo proxy.
Também tem a opção de alternar entre proxies de centro de dados e residenciais. Pode encontrar mais detalhes sobre isto na secção Proxies da nossa documentação.
Conclusão
A utilização de um proxy é um aspeto essencial da recolha de dados da Web, uma vez que lhe permite ocultar o seu endereço IP e aceder a sítios Web restritos. A biblioteca HttpClient do C# é uma ferramenta poderosa para extrair dados e, quando combinada com um proxy fiável, pode conseguir uma extração de dados eficiente e rápida.
Ao subscrever um serviço de proxy premium como o WebScrapingAPI, terá acesso a uma vasta gama de funcionalidades, incluindo a rotação de IP e a opção de alternar entre proxies de centros de dados e residenciais.
Esperamos que este artigo lhe tenha proporcionado uma compreensão útil da utilização de um proxy com o HttpClient e da forma como pode beneficiar as suas necessidades de scraping. Sinta-se à vontade para se inscrever no nosso teste gratuito de 14 dias, para testar o nosso serviço e explorar todas as caraterísticas e funcionalidades.
Notícias e actualizações
Mantenha-se atualizado com os mais recentes guias e notícias sobre raspagem da Web, subscrevendo a nossa newsletter.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Artigos relacionados

Aprenda a extrair sites dinâmicos renderizados em JavaScript usando o Scrapy e o Splash. Desde a instalação até à escrita de um spider, à manipulação da paginação e à gestão das respostas do Splash, este guia abrangente oferece instruções passo a passo tanto para principiantes como para especialistas.


Os selectores XPath são melhores do que os selectores CSS para a recolha de dados da Web? Conheça os pontos fortes e as limitações de cada método e faça a escolha certa para o seu projeto!


Saiba como usar proxies com Axios e Node.js para uma raspagem eficiente da Web. Dicas, exemplos de código e os benefícios de usar WebScrapingAPI incluídos.
