In this Article
Toda atividade online deixa rastros. Às vezes, isso pode colocar sua segurança em risco ou impedir que você faça scraping na web. Os proxies ajudam você a passar despercebido por sistemas anti-detecção sem atrapalhar suas tarefas. Neste artigo, mostraremos como integrar proxies DataImpulse em C# usando .NET para que você não precise mais se preocupar em atingir rate limits ou deixar brechas para agentes mal-intencionados.
Primeiros passos
Primeiro, confira se estas ferramentas estão instaladas no seu dispositivo:
- Visual Studio Code (Visual Studio 2022 ou qualquer outro IDE compatível com .NET também funciona)
- .NET 8
- HtmlAgilityPack (neste tutorial usamos a versão 1.6.11)
Como usaremos proxies neste tutorial, você precisa de uma conta DataImpulse e de um plano adequado às suas necessidades. Temos um guia passo a passo explicando como fazer isso.
Neste tutorial, usamos nosso próprio site, DataImpulse.com, como exemplo de scraping. No entanto, você pode adaptar facilmente o código às suas tarefas e fazer scraping de qualquer fonte necessária. Claro, sempre verifique se você não está violando os termos de serviço dos sites dos quais coleta dados.
Criando um cliente HTTP
Primeiro, crie um cliente HTTP para rotear seu tráfego por meio de um servidor proxy específico. É um aplicativo de console simples que envia solicitações para a URL indicada e recebe as respostas, tudo por meio de um servidor proxy. Você pode copiar o trecho de código abaixo.
using System.Net;
class HttpClientApp
{
public static void Main(string[] args)
{
DownloadPageAsync().Wait();
}
private static async Task DownloadPageAsync()
{
string page = "https://api.ipify.org/"; // Example API to get the public IP address
// Configure proxy
var proxy = new WebProxy("gw.dataimpulse.com:823")
{
UseDefaultCredentials = false,
Credentials = new NetworkCredential("your login", "your password")
};
// Set up HTTP client handler with proxy
var httpClientHandler = new HttpClientHandler
{
Proxy = proxy,
UseProxy = true
};
using (var client = new HttpClient(handler: httpClientHandler, disposeHandler: true))
{
try
{
// Send the HTTP GET request
var response = await client.GetAsync(page);
// Check if the response is successful
response.EnsureSuccessStatusCode();
// Get the content of the response
string result = await response.Content.ReadAsStringAsync();
Console.WriteLine("Response received: ");
Console.WriteLine(result);
Console.WriteLine("Press any key to exit.");
Console.ReadLine(); // Keep the console open to display the result
}
catch (HttpRequestException e)
{
Console.WriteLine($"Request error: {e.Message}");
Console.WriteLine("Press any key to exit.");
Console.ReadLine(); // Keep the console open to display the result
}
catch (Exception ex)
{
Console.WriteLine($"Unexpected error: {ex.Message}");
Console.WriteLine("Press any key to exit.");
Console.ReadLine(); // Keep the console open to display the result
}
}
}
}
Para executar este aplicativo e os próximos, digite o comando abaixo no terminal, no diretório raiz do aplicativo.
dotnet run --project NameOfProject
A saída deve se parecer com isto:
Implementando a rotação de proxies
Não basta rotear o tráfego por meio de um servidor proxy. Para seguir as regras de tráfego, você precisa usar um novo endereço IP em cada solicitação. Portanto, o próximo passo é criar um rotator de proxies para escolher um endereço aleatório do nosso pool.
using System.Net;
class ProxyRotator
{
// List of proxies to rotate through
private static List proxies = new List
{
new WebProxy("http://gw.dataimpulse.com:10000"),
new WebProxy("http://gw.dataimpulse.com:10001"),
new WebProxy("http://gw.dataimpulse.com:10002")
};
public static void Main(string[] args)
{
MakeRequestsWithRotation().Wait();
}
private static async Task MakeRequestsWithRotation()
{
// Example URLs to request
string url = "https://api.ipify.org/";
for (int i = 0; i < proxies.Count; i++)
{
// Send request using each proxy
Console.WriteLine($"Using proxy: {proxies[i].Address}");
try
{
var response = await SendRequestWithProxy(url, proxies[i]);
if (response.IsSuccessStatusCode)
{
Console.WriteLine($"Request succeeded with proxy {proxies[i].Address}");
string responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine($"IP address from API website: {responseBody}"); // Print or process the response as needed
}
else
{
Console.WriteLine($"Request failed with proxy {proxies[i].Address}, Status Code: {response.StatusCode}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Exception with proxy {proxies[i].Address}: {ex.Message}");
}
}
}
// Function to send request using a specific proxy
private static async Task SendRequestWithProxy(string url, WebProxy proxy)
{
HttpClientHandler handler = new HttpClientHandler
{
Proxy = proxy,
UseProxy = true
};
using (HttpClient client = new HttpClient(handler))
{
return await client.GetAsync(url);
}
}
}
No exemplo acima, fornecemos uma lista de proxies para rotação (3 proxies no nosso caso) e verificamos os endereços IP rotativos pela http://api.ipify.org/ URL. O resultado deve se parecer com isto:
Criando um verificador de proxies
Para garantir que os proxies funcionem, precisamos configurar um verificador de proxies. Ele envia uma solicitação HTTP para um servidor proxy e retorna uma resposta indicando se o servidor é válido ou não. Usamos dataimpulse.com, mas qualquer outro link serve.
using System.Net;
class ProxyChecker
{
// Entry point renamed to avoid conflict
public static void Main(string[] args)
{
string proxyAddress = "gw.dataimpulse.com"; // Replace with your proxy address
// Replace with your proxy ports
var proxyPortStart = 10000;
var proxyPortEnd = 10100;
var tasks = new List();
for (var proxyPort = proxyPortStart; proxyPort < proxyPortEnd; proxyPort++)
{
tasks.Add(CheckProxy(proxyAddress, proxyPort));
}
Task.WaitAll(tasks.ToArray());
}
public static async Task CheckProxy(string proxyAddress, int proxyPort)
{
var proxy = new WebProxy(proxyAddress, proxyPort)
{
// Uncomment and modify if the proxy requires credentials
Credentials = new NetworkCredential("your login", "your password"),
BypassProxyOnLocal = false
};
var httpClientHandler = new HttpClientHandler
{
Proxy = proxy,
UseProxy = true
};
using (var client = new HttpClient(httpClientHandler))
{
try
{
client.Timeout = TimeSpan.FromSeconds(10); // Set a timeout
var response = await client.GetAsync("https://api.ipify.org/"); // You can use any URL for testing
if (response.IsSuccessStatusCode)
{
Console.WriteLine("Proxy is working: " + proxyAddress + ":" + proxyPort);
}
else
{
Console.WriteLine("Proxy is not working (Invalid response): " + proxyAddress + ":" + proxyPort);
}
}
catch (Exception ex)
{
Console.WriteLine("Proxy is not working (Exception): " + proxyAddress + ":" + proxyPort + " - " + ex.Message);
}
}
}
}
Aqui, você deve especificar o nome do host, a porta e as credenciais. Você pode encontrá-los no painel DI, na aba do plano correspondente. Também é preciso definir um tempo limite em segundos.
Aqui está um exemplo do resultado obtido:
Fazendo scraping de dados
O núcleo do nosso projeto é um web scraper. Ele envia uma solicitação HTTP e coleta dados HTML da página inicial da DataImpulse.
using System.Net;
using HtmlAgilityPack;
class WebScraper
{
public static void Main(string[] args)
{
Scrape().Wait();
}
private static async Task Scrape()
{
// Define the proxy details
string proxyAddress = "http://gw.dataimpulse.com:823"; // Replace with your proxy address
string proxyUsername = "your login"; // Replace with your proxy username (if needed)
string proxyPassword = "your password"; // Replace with your proxy password (if needed)
// Create a Proxy Handler
var httpClientHandler = new HttpClientHandler
{
Proxy = new WebProxy(proxyAddress)
{
Credentials = new NetworkCredential(proxyUsername, proxyPassword)
},
UseProxy = true
};
// Create an HttpClient using the handler with the proxy
using (var client = new HttpClient(httpClientHandler))
{
// Define the target URL to scrape
string url = "https://dataimpulse.com/";
var baseUri = new Uri(url);
try
{
// Send GET request
var response = await client.GetAsync(url);
// Use the new code snippet here
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
// Load the HTML content into an HtmlDocument
HtmlDocument doc = new();
doc.LoadHtml(content);
// Use XPath to find all tags that are direct children of , , or
var nodes = doc.DocumentNode.SelectNodes("//li/a[@href] | //p/a[@href] | //td/a[@href]");
if (nodes != null)
{
foreach (var node in nodes)
{
string hrefValue = node.GetAttributeValue("href", string.Empty);
string title = node.InnerText; // This gets the text content of the tag, which is usually the title
var fullUri = new Uri(baseUri, hrefValue);
Console.WriteLine($"Title: {title}, Link: {fullUri.AbsoluteUri}");
// You can process each title and link as required
}
}
else
{
Console.WriteLine("No matching nodes found.");
}
}
else
{
Console.WriteLine($"Failed to scrape. Status code: {response.StatusCode}");
}
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
}
}
}
Para criar um web scraper, você precisa fornecer seu endereço proxy e suas credenciais, além de especificar a URL de destino. Também é preciso indicar qual conteúdo você deseja coletar. No nosso exemplo, recuperamos todos os títulos e links. A resposta se parece com isto:
No entanto, você pode modificar isso para obter os dados de que precisa.
Por que DataImpulse?
Você pode ficar tentado a usar proxies públicos em projetos de scraping web, pois isso parece uma excelente forma de economizar dinheiro. No entanto, proxies gratuitos apresentam muitos riscos, de conexões lentas ou com falha a vazamentos de dados pessoais, já que você nunca sabe quem gerencia esses servidores. Se quiser conhecer todos os motivos para evitar proxies gratuitos, confira estes artigos: Por que você não deve usar IPs falsos e proxies gratuitos e Da baixa velocidade às ameaças de segurança: por que você deve evitar proxies gratuitos. Por isso, você deve recorrer a provedores confiáveis. A DataImpulse oferece endereços IP obtidos legalmente, que não estão associados a atividades maliciosas, além de planos econômicos. Por exemplo, você pode comprar proxies residenciais por $1 por 1 GB. Operamos com um modelo de pagamento conforme o uso, então você não precisa se preocupar com a expiração do tráfego. Clique no botão “Experimente agora” no canto superior direito da tela ou escreva para nós em [email protected].





