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

Contornar restrições e extrair dados de forma eficaz com proxies e C# HttpClient

Contornar restrições e extrair dados de forma eficaz com proxies e C# HttpClient

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

Caixa de diálogo «Criar um novo projeto» do Visual Studio filtrada para modelos C#

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.

Caixa de diálogo «Configurar o seu novo projeto» do Visual Studio, apresentando os campos de nome e localização do projeto para uma aplicação de consola em C#

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.

Painel de exemplos de código da WebScrapingAPI que mostra um exemplo de pedido via proxy com o curl e um botão «Copiar»

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.

Sobre o autor
Suciu Dan, cofundador da 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.