Voltar ao blogue
Guias
Suciu Dan13 de abril de 20238 minutos de leitura

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

Visual Studio 'Create a new project' dialog filtered to C# templates

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.

Visual Studio 'Configure your new project' dialog showing project name and location fields for a C# console app

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».

WebScrapingAPI code samples panel showing a curl proxy request example with a Copy button

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.