Voltar ao blogue
Guias
Suciu DanLast updated on Mar 31, 20267 min read

Contorne restrições e extraia dados de forma eficaz com proxies e o HttpClient do C#

Contorne restrições e extraia dados de forma eficaz com proxies e o HttpClient do C#

O web scraping é uma ferramenta poderosa que permite extrair dados valiosos de sites para diversos fins. No entanto, muitos sites bloqueiam as tentativas de scraping para proteger os seus dados. Uma forma de contornar esses bloqueios é utilizar um servidor proxy.

Neste artigo, exploraremos como utilizar um proxy com o C# HttpClient, uma biblioteca popular para efetuar pedidos HTTP em C#. Abordaremos os pré-requisitos, a configuração e dicas para depuração e resolução de problemas.

Além disso, abordaremos como enviar uma solicitação e melhorar o desempenho das solicitações. Ao final deste artigo, terá uma boa compreensão de como utilizar um proxy com o C# HttpClient e como isso pode beneficiar os seus esforços de web scraping.

O que são proxies?

Os proxies, também conhecidos como servidores proxy, atuam como intermediários entre um cliente (como um navegador web ou um scraper) e um servidor de destino (como um site). O cliente envia uma solicitação ao proxy, que a encaminha para o servidor de destino.

Assim que o servidor de destino responde, o proxy envia a resposta de volta ao cliente. No web scraping, a utilização de proxies pode mascarar o endereço IP do scraper, impedindo que o site detete e bloqueie a solicitação.

A utilização de vários proxies também pode ajudar a evitar a deteção e o bloqueio. Alguns fornecedores de proxies oferecem até a opção de alternar IPs, proporcionando proteção adicional contra o bloqueio das suas solicitações.

Criação de 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 suspenso Todas as linguagens. Se o modelo Aplicação de consola não estiver visível, utilize o campo Pesquisar modelos para o localizar. Em seguida, clique em Seguinte.

Escolha a localização para o 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!");

Fazer um pedido HTTP

Vamos fazer a nossa primeira solicitação com `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); 

Este código utiliza a classe HttpClient do namespace System.Net.Http para efetuar uma solicitação HTTP GET para o endpoint https://api.ipify.org/ e recuperar a resposta como uma string.

Aqui está uma descrição detalhada do código:

  • `using var client = new HttpClient();`: Esta linha cria uma nova instância da classe `HttpClient` e atribui-a à variável client. A instrução `using` garante a eliminação correta do objeto client assim que este deixar de ser necessário.
  • `var result = await client.GetStringAsync("https://api.ipify.org/");`: Esta linha utiliza o método `GetStringAsync()` do objeto client para enviar uma solicitação GET para o endpoint https://api.ipify.org/. Este método lê a resposta como uma string e armazena-a na variável result. A palavra-chave `await` torna a solicitação assíncrona, permitindo que o programa continue a executar outro código enquanto a solicitação está a ser processada.
  • `Console.WriteLine(result);`: Esta linha escreve o conteúdo da variável result na consola, que é a resposta da solicitação GET.

Guarde o código e execute-o. Verá o seu endereço IP no terminal.

Usar proxies com o HttpClient

Antes de voltarmos à programação, visite o site Free Proxy List e selecione um proxy que esteja mais próximo da sua localização. Para este exemplo, selecionarei um proxy localizado na Alemanha. Anote o endereço IP e a porta do proxy selecionado.

Para utilizar um proxy com o HttpClient, precisamos de criar uma instância de HttpClientHandler. Dentro desta instância, definimos duas propriedades: o URL do proxy e a porta, e `ServerCertificateCustomValidationCallback`. É um nome longo para uma variável, mas é importante.

`ServerCertificateCustomValidationCallback` diz ao HttpClientHandler para ignorar quaisquer erros de certificado HTTPS. Pode estar a perguntar-se por que tem de fazer isto.

O servidor proxy intercepta e inspeciona 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 daquele apresentado ao cliente.

Por predefinição, o HttpClient e outras bibliotecas semelhantes validam o certificado apresentado pelo servidor de destino e, se este não for válido ou não corresponder ao apresentado ao cliente, lançam uma exceção. É daí que provêm os erros de certificado.

Ignorar os erros de certificado HTTPS ao utilizar 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 é interceptado e modificado pelo servidor proxy.

É hora de escrever o código. Comecemos pela instância HttpClientHandler:

using System.Net;

using var httpClientHandler = new HttpClientHandler

{

	Proxy = new WebProxy("http://5.9.139.204:24000"),

	ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator

};

Precisamos de fornecer à classe HttpClient uma instância do HttpClientHandler. O código do cliente modificado deve ficar assim:

using var client = new HttpClient(httpClientHandler);

O código completo deve ficar assim:

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 irá devolver o endereço IP do proxy em vez do seu endereço IP. Pode abrir o URL do ipify no seu navegador e comparar os resultados.

Vamos fazer a autenticação

Quando se inscreve num serviço de proxy premium, recebe um nome de utilizador e uma palavra-passe para utilizar na sua aplicação para autenticação.

É hora de substituir a definição do WebProxy por esta:

Proxy = new WebProxy

{

    	Address = new Uri($"http://5.9.139.204:24000"),

    	Credentials = new NetworkCredential(

        	userName: "PROXY_USERNAME",

        	password: "PROXY_PASSWORD"

    	)

},

Ao substituir as credenciais do espaço reservado, atualizar a URL do proxy e executar o código, verá que o endereço IP apresentado é 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 sites bloqueiem o seu endereço IP. Os sites podem monitorizar e bloquear endereços IP que efetuem pedidos excessivos num curto espaço de tempo ou aqueles associados a atividades de scraping.

Podemos usar o site Free Proxy List para gerar uma lista de proxies que podemos alternar a cada pedido enviado. Ao implementar esta técnica, cada pedido terá um endereço IP distinto, tornando o site de destino menos suspeito.

Tenha em atenção que a lista de proxies que poderá encontrar no site poderá diferir da lista que compilei. Escolhi cinco proxies e defini-os numa Lista da seguinte forma:

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 seu código de scraper deverá ficar assim:

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);

Utilizar proxies da WebScrapingAPI

Optar por proxies premium de um serviço como o WebScrapingAPI é uma escolha melhor 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 suscetíveis de serem bloqueados pelos sites e têm um tempo de resposta mais baixo.

Em comparação, os proxies gratuitos podem ser lentos, pouco fiáveis, conter malware e são mais propensos a ter uma elevada taxa de falhas, uma vez que o site de destino bloqueará os seus pedidos.

Interessado em experimentar a WebScrapingAPI? Não há problema, basta inscrever-se na nossa versão de avaliação gratuita de 14 dias. Pode usar os 5.000 créditos para testar todas as funcionalidades disponíveis.

Assim que tiver uma conta, aceda ao API Playground e selecione o separador «Proxy Mode» na secção «Code Samples».

Agora vamos utilizar o URL do proxy gerado no separador «Proxy Mode» com a nossa implementação em C#.

Atualize o URL do proxy e as credenciais no httpClientHandler para ficarem assim:

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 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 alterna os IPs a cada pedido. Pode saber mais sobre esta funcionalidade lendo a documentação sobre o Modo Proxy.

Tem também 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 do web scraping, uma vez que permite ocultar o seu endereço IP e aceder a sites restritos. A biblioteca HttpClient do C# é uma ferramenta poderosa para a extração de dados e, quando combinada com um proxy fiável, permite 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 rotação de IP e a opção de alternar entre proxies de datacenter e residenciais.

Esperamos que este artigo lhe tenha proporcionado uma compreensão útil sobre a utilização de um proxy com o HttpClient e como este pode beneficiar as suas necessidades de scraping. Não hesite em inscrever-se na nossa avaliação gratuita de 14 dias, para testar o nosso serviço e explorar todas as características e funcionalidades.

Sobre o autor
Suciu Dan, Co-fundador @ WebScrapingAPI
Suciu DanCo-fundador

Suciu Dan é cofundador da WebScrapingAPI e escreve guias práticos, voltados para programadores, sobre web scraping em Python, web scraping em Ruby e infraestruturas de proxy.

Comece a construir

Pronto para expandir a sua recolha de dados?

Junte-se a mais de 2.000 empresas que utilizam a WebScrapingAPI para extrair dados da Web à escala empresarial, sem quaisquer custos de infraestrutura.