Um proxy HTTP é um servidor intermediário que fica entre sua aplicação Node.js e o servidor de destino, encaminhando requisições e respostas. Usar proxies no Node.js com bibliotecas como axios, Puppeteer e Playwright permite mascarar seu endereço IP, contornar restrições geográficas, distribuir a carga das requisições e fazer scraping de sites com mais eficiência. Este artigo traz exemplos práticos de como configurar essas bibliotecas para usar proxies.
Configurando proxies com o Axios
O Axios é um cliente HTTP baseado em promises muito usado no Node.js. Configurar um proxy no Axios é simples, com a opção de configuração proxy.
Configuração básica de proxy
A opção proxy aceita um objeto com propriedades como host, port, username e password.
const axios = require('axios');
async function fetchData() {
try {
const response = await axios.get('https://api.example.com/data', {
proxy: {
host: 'your_proxy_host',
port: 8080,
username: 'your_username', // Opcional
password: 'your_password' // Opcional
}
});
console.log(response.data);
} catch (error) {
console.error('Error fetching data:', error);
}
}
fetchData();
Substitua your_proxy_host e 8080 pelo host e pela porta reais do seu proxy. Se o proxy exigir autenticação, informe username e password.
Usando variáveis de ambiente
Por segurança e facilidade de manutenção, o ideal é guardar as credenciais do proxy em variáveis de ambiente.
const axios = require('axios');
async function fetchData() {
try {
const proxyHost = process.env.PROXY_HOST;
const proxyPort = process.env.PROXY_PORT;
const proxyUsername = process.env.PROXY_USERNAME;
const proxyPassword = process.env.PROXY_PASSWORD;
const response = await axios.get('https://api.example.com/data', {
proxy: {
host: proxyHost,
port: parseInt(proxyPort), // Garante que a porta seja um inteiro
username: proxyUsername,
password: proxyPassword
}
});
console.log(response.data);
} catch (error) {
console.error('Error fetching data:', error);
}
}
fetchData();
Defina as variáveis de ambiente antes de rodar o script. Por exemplo, no seu terminal:
export PROXY_HOST=your_proxy_host
export PROXY_PORT=8080
export PROXY_USERNAME=your_username
export PROXY_PASSWORD=your_password
node your_script.js
Lidando com proxies HTTPS
Para proxies HTTPS, verifique se o seu proxy oferece suporte ao método CONNECT. O Axios lida com proxies HTTPS de forma transparente, com a mesma configuração.
Configurando proxies com o Puppeteer
O Puppeteer é uma biblioteca Node.js que oferece uma API de alto nível para controlar o Chrome ou o Chromium em modo headless. Usar proxies com o Puppeteer é essencial em tarefas de web scraping e automação nas quais você precisa evitar banimentos de IP ou acessar conteúdo com restrição geográfica.
Iniciando o Puppeteer com um proxy
Você pode configurar um proxy ao iniciar o Puppeteer usando o argumento de inicialização --proxy-server.
const puppeteer = require('puppeteer');
async function scrapeWebsite() {
const browser = await puppeteer.launch({
args: [
`--proxy-server=http://${process.env.PROXY_HOST}:${process.env.PROXY_PORT}`
]
});
const page = await browser.newPage();
await page.goto('https://www.example.com');
console.log(await page.title());
await browser.close();
}
scrapeWebsite();
Substitua process.env.PROXY_HOST e process.env.PROXY_PORT pelo host e pela porta do seu proxy. Observe que este exemplo assume um proxy HTTP; para proxies HTTPS, use https:// no argumento --proxy-server.
Proxies autenticados com o Puppeteer
O Puppeteer não oferece suporte direto a autenticação por usuário e senha via argumentos de inicialização. É preciso tratar a autenticação no contexto da página.
const puppeteer = require('puppeteer');
async function scrapeWebsite() {
const browser = await puppeteer.launch({
args: [
`--proxy-server=http://${process.env.PROXY_HOST}:${process.env.PROXY_PORT}`
]
});
const page = await browser.newPage();
// Autentica no proxy usando page.authenticate
await page.authenticate({
username: process.env.PROXY_USERNAME,
password: process.env.PROXY_PASSWORD,
});
await page.goto('https://www.example.com');
console.log(await page.title());
await browser.close();
}
scrapeWebsite();
O método page.authenticate() fornece as credenciais necessárias ao servidor proxy. Ele deve ser chamado antes de navegar para a página de destino.
Considerações sobre proxy por requisição
O Puppeteer aplica a configuração de proxy globalmente para toda a instância do navegador. Se precisar de proxies diferentes para requisições diferentes, será necessário iniciar várias instâncias do navegador, cada uma configurada com um proxy distinto. Como alternativa, considere usar uma biblioteca que intercepte requisições e aplique as configurações de proxy por requisição (menos comum e mais complexo).
Configurando proxies com o Playwright
O Playwright é outra biblioteca Node.js poderosa para automação de navegadores e testes end-to-end. Assim como o Puppeteer, ele permite configurar proxies para suas instâncias de navegador.
Iniciando o Playwright com um proxy
O Playwright oferece uma forma mais direta de configurar proxies em comparação com o Puppeteer, usando a propriedade proxy nas opções de launch.
const { chromium } = require('playwright');
async function scrapeWebsite() {
const browser = await chromium.launch({
proxy: {
server: `http://${process.env.PROXY_HOST}:${process.env.PROXY_PORT}`,
username: process.env.PROXY_USERNAME,
password: process.env.PROXY_PASSWORD,
}
});
const page = await browser.newPage();
await page.goto('https://www.example.com');
console.log(await page.title());
await browser.close();
}
scrapeWebsite();
Essa abordagem é mais limpa e explícita, já que dá suporte direto à autenticação por usuário e senha dentro da configuração do proxy.
Proxy por contexto
O Playwright oferece suporte a contextos de navegador, o que permite sessões de navegação isoladas dentro de uma única instância. Cada contexto pode ter sua própria configuração de proxy. Isso é útil para rodar tarefas em paralelo, cada uma com um proxy diferente.
const { chromium } = require('playwright');
async function scrapeWebsite() {
const browser = await chromium.launch();
const context = await browser.newContext({
proxy: {
server: `http://${process.env.PROXY_HOST}:${process.env.PROXY_PORT}`,
username: process.env.PROXY_USERNAME,
password: process.env.PROXY_PASSWORD,
}
});
const page = await context.newPage();
await page.goto('https://www.example.com');
console.log(await page.title());
await browser.close();
}
scrapeWebsite();
Tabela comparativa: configuração de proxy
| Recurso | Axios | Puppeteer | Playwright |
|---|---|---|---|
| Configuração | Opção proxy na config da requisição |
Argumento de inicialização --proxy-server, page.authenticate() |
Opção proxy em launch ou newContext |
| Autenticação | username e password em proxy |
page.authenticate() |
username e password em proxy |
| Suporte a HTTPS | Sim, mesma configuração do HTTP | Sim, use https:// em --proxy-server |
Sim, mesma configuração do HTTP |
| Proxy por requisição | Não, é global para a instância do Axios | Não, é global para a instância do navegador | Sim, usando contextos de navegador |
Boas práticas
- Use variáveis de ambiente: guarde as credenciais do proxy em variáveis de ambiente para não deixá-las fixas no código.
- Trate erros: implemente tratamento de erros para lidar de forma elegante com falhas de conexão do proxy.
- Faça rotação de proxies: em web scraping, rotacione os proxies com frequência para evitar banimentos de IP. Considere usar um pool de proxies.
- Teste sua configuração: confirme que o proxy está funcionando verificando seu endereço IP através dele. Use sites como whatismyipaddress.com.
- Use proxies seguros: prefira proxies seguros (HTTPS ou SOCKS5) para criptografar seu tráfego.
- Aspectos legais: garanta que suas atividades de scraping estejam em conformidade com os termos de serviço do site-alvo e com toda a legislação aplicável.
Conclusão
Configurar proxies no Node.js com bibliotecas como axios, Puppeteer e Playwright é essencial para diversas tarefas, incluindo web scraping, contornar geo-restrições e reforçar a privacidade. Cada biblioteca adota uma abordagem diferente para a configuração de proxy, sendo o Playwright o mais flexível e direto, especialmente para proxies autenticados e configurações por contexto. Seguindo as boas práticas descritas neste artigo, você consegue usar proxies com eficiência nas suas aplicações Node.js.
