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.




