Voltar ao blogue
Guias
Suciu DanLast updated on May 1, 202611 min read

Como configurar o proxy Axios no Node.js: Autenticação, rotação, SOCKS5

Como configurar o proxy Axios no Node.js: Autenticação, rotação, SOCKS5
Resumo: O Axios encaminha os pedidos através de um proxy ao aceitar um proxy objeto com host, porte campos opcionais auth . Este guia explica como configurar o Axios para utilizar um proxy a partir do zero: ligações básicas, proxies autenticados, tunelamento HTTPS, um sistema de rotação utilizando interceptores, SOCKS5 via socks-proxy-agente diagnóstico de erros comuns. Todos os trechos de código são código Node.js pronto para copiar e colar.

Se precisar de encaminhar tráfego HTTP através de um servidor intermediário no Node.js, compreender como configurar corretamente o proxy do Axios é o primeiro obstáculo. O Axios é um dos clientes HTTP mais utilizados no ecossistema Node.js, oferecendo pedidos baseados em promessas e uma API de configuração simples. Ao contrário de muitas outras bibliotecas HTTP, expõe um proxy na sua configuração de pedidos, em vez de depender de variáveis de ambiente ou truques com strings de URL.

Este artigo não é um manual introdutório sobre «o que é um proxy». Já sabe o que os proxies fazem. Em vez disso, passamos diretamente à implementação específica do Axios: a configuração mínima de proxy Node.js de três linhas, proxies autenticados, mecanismos de tunelamento HTTPS, um padrão de rotação de nível de produção usando interceptores, suporte a proxy SOCKS5, bypass seletivo de proxy e uma referência para resolução de problemas. Todos os exemplos de proxy Axios aqui apresentados destinam-se ao Node.js e foram concebidos para serem executados tal como estão após um npm install.

Introdução rápida: Proxy Axios mínimo em três linhas

O caminho mais rápido para um proxy HTTP Axios funcional é passar um proxy objeto diretamente numa solicitação GET. Aqui está o mínimo absoluto de que precisa:

const axios = require('axios');

axios.get('https://httpbin.org/ip', {
  proxy: { host: '123.45.67.89', port: 8080 }
}).then(res => console.log(res.data));

Execute node app.js e verifique o campo origin . Se mostrar o IP do proxy em vez do endereço real da sua máquina, a configuração está a funcionar. Essa única proxy chave é o que distingue uma solicitação direta de uma que passa por proxy, e todo o resto deste guia sobre como configurar conexões de proxy do Axios se baseia nela.

Como configurar o proxy do Axios

O proxy aceita várias propriedades: host (string, obrigatório), port (número, obrigatório), protocol (padrão http) e um auth subobjeto opcional que abordaremos na próxima secção. Ao contrário das bibliotecas que analisam uma string de URL de proxy, o Axios mantém estes como campos distintos, o que torna a configuração programática do proxy do Axios simples.

Configuração por solicitação vs. configuração ao nível da instância

Tem duas formas de configurar um proxy em projetos Axios Node.js: inline em cada chamada ou incorporado numa instância reutilizável através da axios.create().

Abordagem

Quando usar

Cenário de exemplo

Por solicitação (axios.get(url, { proxy }))

Alterna proxies em cada pedido ou necessita de proxies diferentes para diferentes pontos finais

Rastreamento de vários sites com restrições geográficas

Ao nível da instância (axios.create({ proxy }))

Um proxy para toda a sessão, ou se quiser uma configuração padrão limpa que as chamadas individuais possam substituir

Proxy de encaminhamento corporativo, ambiente de teste

Um proxy ao nível da instância ainda permite substituições por pedido. Se passar proxy a configuração de uma chamada individual, esta tem precedência sobre o padrão da instância. Para desativar o proxy para uma chamada específica numa instância que tenha um, passe proxy: false explicitamente. Esta flexibilidade por pedido é uma das razões pelas quais vale a pena aprender a configurar padrões de proxy do Axios.

Adicionar autenticação de proxy

A maioria dos proxies comerciais requer credenciais. O Axios lida com isso através de um auth objeto aninhado no interior proxy, simplificando a autenticação do proxy do Axios:

const axios = require('axios');

const client = axios.create({
  proxy: {
    host: process.env.PROXY_HOST,
    port: Number(process.env.PROXY_PORT),
    auth: {
      username: process.env.PROXY_USER,
      password: process.env.PROXY_PASS
    }
  }
});

client.get('https://httpbin.org/ip')
  .then(res => console.log(res.data))
  .catch(err => console.error(err.message));

Algumas notas práticas:

  • Guarde as credenciais em variáveis de ambiente, não no código-fonte. Um .env ficheiro carregado com dotenv funciona bem durante o desenvolvimento.
  • Caracteres especiais nas senhas (como @, #, ou %) são seguros dentro do auth objeto porque o Axios não os codifica como URL da mesma forma que uma string de URL de proxy faria. Esta é uma vantagem da abordagem de configuração estruturada.
  • Se o seu proxy rejeitar as credenciais, receberá um estado 407 Proxy Authentication Required. Verifique novamente o nome de utilizador e a palavra-passe e confirme se o seu fornecedor de proxy não expirou as credenciais.

Proxies HTTPS e o túnel CONNECT

Quando a sua URL de destino é HTTPS, o Axios não encaminha a solicitação através do proxy em texto simples. Em vez disso, ele emite uma solicitação HTTP CONNECT ao proxy, solicitando que este abra um túnel TCP bruto para o destino. Assim que o túnel é estabelecido, o handshake TLS ocorre de ponta a ponta entre o seu processo Node.js e o servidor de destino. O proxy retransmite bytes encriptados sem poder lê-los ou modificá-los.

Isto é importante por duas razões. Primeiro, os seus dados extraídos permanecem confidenciais mesmo que o proxy seja operado por terceiros. Segundo, o site de destino vê uma ligação TLS legítima, pelo que os seus pedidos parecem mais naturais em comparação com o HTTP simples. O Axios gere este tunelamento automaticamente quando configura um proxy para um URL de destino HTTPS (consulte a documentação do Node.js HTTPS), pelo que não há código adicional da sua parte. Tenha apenas em atenção que o próprio proxy só precisa de suportar o método CONNECT, o que praticamente todos os proxies HTTP modernos fazem.

Criação de um sistema de rotação de proxies

Um único IP de proxy será rapidamente sinalizado se enviar centenas de pedidos para o mesmo site. A rotação de proxies distribui o seu tráfego por vários IPs, para que o destino veja o que parece ser muitos visitantes diferentes. A criação de um conjunto de proxies em projetos Axios Node.js requer uma classe de conjunto e algum tratamento de proxies inativos.

Aqui está um conjunto round-robin mínimo que rastreia proxies com falha:

class ProxyPool {
  constructor(proxies) {
    this.proxies = proxies.map(p => ({ ...p, alive: true }));
    this.index = 0;
  }

  next() {
    const alive = this.proxies.filter(p => p.alive);
    if (!alive.length) throw new Error('All proxies dead');
    const proxy = alive[this.index % alive.length];
    this.index++;
    return { host: proxy.host, port: proxy.port, auth: proxy.auth };
  }

  markDead(host, port) {
    const p = this.proxies.find(
      px => px.host === host && px.port === port
    );
    if (p) p.alive = false;
  }
}

Utilize o conjunto com o Axios da seguinte forma:

const pool = new ProxyPool([
  { host: '1.2.3.4', port: 8080, auth: { username: 'u1', password: 'p1' } },
  { host: '5.6.7.8', port: 8080, auth: { username: 'u2', password: 'p2' } },
  { host: '9.10.11.12', port: 3128 }
]);

async function fetchWithRotation(url) {
  const proxy = pool.next();
  try {
    const res = await axios.get(url, { proxy, timeout: 10000 });
    return res.data;
  } catch (err) {
    pool.markDead(proxy.host, proxy.port);
    return fetchWithRotation(url); // retry with next proxy
  }
}

Definir um timeout (em milissegundos) é fundamental. Alguns proxies ficam bloqueados indefinidamente em vez de devolverem um erro e, sem um tempo limite, o seu script ficará paralisado. Dez segundos é um ponto de partida razoável para a maioria das tarefas de scraping. Se quiser saber mais sobre como evitar bloqueios durante o scraping, vale a pena consultar as dicas sobre como prevenir o banimento de IPs.

Troca automática de proxies com interceptores Axios

A lógica de rotação acima reside na função de chamada. Um padrão mais limpo utiliza interceptores de resposta do Axios para alternar automaticamente os proxies quando o alvo retorna um 403 ou 429, removendo o código de repetição manual de cada local de chamada:

const client = axios.create({ timeout: 10000 });

client.interceptors.request.use(config => {
  config.proxy = pool.next();
  return config;
});

client.interceptors.response.use(
  response => response,
  async error => {
    const { config } = error;
    const status = error.response?.status;
    if ((status === 403 || status === 429) && !config._retried) {
      config._retried = true;
      pool.markDead(config.proxy.host, config.proxy.port);
      config.proxy = pool.next();
      return client.request(config);
    }
    return Promise.reject(error);
  }
);

O interceptor de solicitação atribui um novo proxy antes de cada chamada de saída. O interceptor de resposta deteta sinais de bloqueio e tenta novamente com um IP diferente uma vez por solicitação (o _retried bandeira evita loops infinitos). Esta abordagem baseada em interceptores é um exemplo poderoso de proxy Axios para sistemas de produção, e pode trocar a estratégia de rotação sem alterar nenhum local de chamada.

Utilização de proxies SOCKS5 com o Axios

A opção integrada do Axios proxy opção integrada do Axios suporta apenas proxies HTTP e HTTPS. Se precisar de um proxy SOCKS5 com o Axios (que opera numa camada de rede inferior e suporta UDP, bem como TCP), necessita do socks-proxy-agent pacote.

Instale-o juntamente com o Axios:

npm install axios socks-proxy-agent

Em seguida, crie um agente e passe-o através de httpAgent e httpsAgent:

const axios = require('axios');
const { SocksProxyAgent } = require('socks-proxy-agent');

const agent = new SocksProxyAgent('socks5://user:pass@127.0.0.1:1080');

axios.get('https://httpbin.org/ip', {
  httpAgent: agent,
  httpsAgent: agent,
  proxy: false  // disable built-in proxy so the agent handles routing
})
.then(res => console.log('SOCKS5 IP:', res.data.origin))
.catch(err => console.error(err.message));

Repare na proxy: false na linha 8. Isto é essencial ao configurar um proxy SOCKS5 com o Axios. Se deixar o proxy integrado ativado juntamente com um agente personalizado, eles entrarão em conflito. Definir proxy: false indica ao Axios para transferir todo o encaminhamento de ligação para o seu agente SOCKS.

Variáveis de ambiente e desvio seletivo

Uma armadilha comum ao aprender a configurar ligações de proxy no Axios: o Axios não lê automaticamente HTTP_PROXY ou HTTPS_PROXY variáveis de ambiente da mesma forma que ferramentas como curl . Se definir essas variáveis e esperar que o Axios as detecte, nada acontecerá. Tem de as ler você mesmo e inseri-las na configuração:

const proxy = process.env.HTTP_PROXY
  ? { host: new URL(process.env.HTTP_PROXY).hostname,
      port: Number(new URL(process.env.HTTP_PROXY).port) }
  : undefined;

const res = await axios.get('https://example.com', { proxy });

Para desativar o proxy seletivamente para determinadas solicitações (por exemplo, chamadas a APIs internas que não devem sair da sua rede), passe proxy: false nessas solicitações individuais. Isto é útil quando tem um proxy definido ao nível da instância através de axios.create() mas precisa de o ignorar para verificações de integridade, chamadas ao localhost ou pedidos a APIs públicas de programadores, onde um proxy apenas adiciona latência sem oferecer qualquer benefício.

Quando os proxies simples não são suficientes

Alternar endereços IP permite contornar os limites de taxa mais simples, mas sistemas anti-bot sofisticados analisam muito mais do que o seu IP de origem. De acordo com pesquisas do setor, plataformas modernas de deteção de bots analisam padrões de temporização de pedidos, impressões digitais TLS, consistência de cabeçalhos e sinais comportamentais, como movimentos do rato ou profundidade de rolagem. A simples rotação por uma lista de IPs de centros de dados não enganará esses sistemas.

Se já aprendeu a configurar a rotação de proxies do Axios e continua a ser bloqueado, considere estas camadas adicionais:

  • Cabeçalhos HTTP realistas: alterne User-Agent e inclua cabeçalhos como Accept-Language e Referer que um navegador real enviaria. A utilização estratégica de cabeçalhos Axios ajuda a evitar a deteção.
  • Diversidade de impressões digitais TLS: o Node.js produz uma impressão digital TLS distinta. Ferramentas que emulam o comportamento TLS do navegador podem reduzir a sua superfície de deteção.
  • Redes de proxies residenciais: estas encaminham o tráfego através de IPs domésticos reais, tornando os pedidos praticamente indistinguíveis do tráfego normal dos utilizadores. Custam mais do que os proxies de centros de dados, mas são muito mais eficazes contra a deteção agressiva.

Resolução de erros comuns de proxy

Mesmo uma configuração correta do proxy Axios pode falhar em tempo de execução. Aqui estão os erros que irá encontrar com mais frequência e o que fazer em relação a eles:

  • ECONNREFUSED: O Axios não consegue aceder ao proxy de todo. Verifique o host e port , confirme se o servidor proxy está em execução e verifique se nenhuma firewall está a bloquear a ligação.
  • 407 Autenticação de proxy necessária: O proxy rejeitou as suas credenciais. Confirme o seu auth.username e auth.password estão corretas e verifique se o seu fornecedor atualizou ou expirou as credenciais.
  • Tempos de espera e pedidos pendentes: Alguns proxies aceitam a ligação, mas nunca respondem. Defina sempre um timeout valor na sua configuração do Axios para que o seu script falhe rapidamente. Compreender os erros de estado do proxy em profundidade pode poupar-lhe horas de depuração.
  • Conflitos de VPN: Executar uma VPN enquanto se encaminha através de um proxy pode causar comportamentos inesperados, incluindo tráfego a passar pelo caminho errado ou falhas completas nas ligações. Adicionar um proxy por cima de uma VPN é normalmente redundante, a menos que necessite especificamente de rotação de IP numa localização geográfica diferente.
  • X-Forwarded-For Divulgação do seu IP real: Alguns proxies acrescentam o seu IP original a este cabeçalho. Os proxies de elite ou de alta anonimidade removem-no, por isso verifique o nível de anonimato do seu proxy se a ocultação do IP for importante.

Pontos-chave

  • A forma mais simples de configurar um proxy Axios é passar um proxy objeto com host e port em qualquer configuração de pedido. A autenticação adiciona um auth subobjeto com username e password.
  • Use axios.create() para um proxy válido para toda a sessão e substituir por proxy ou proxy: false quando precisar de flexibilidade.
  • Para scraping em produção, crie um conjunto de proxies e integre-o nos interceptores do Axios para que a lógica de repetição de tentativas fique fora do seu código de negócios.
  • Os proxies SOCKS5 requerem socks-proxy-agent passado via httpAgent/httpsAgent, com o proxy definido como false.
  • Defina sempre um timeout em pedidos proxy. Proxies em espera irão silenciosamente paralisar todo o seu pipeline.

Perguntas frequentes

O Axios suporta proxies SOCKS5 de forma nativa?

Não. O objeto proxy só suporta proxies HTTP e HTTPS. Para SOCKS5, instale o socks-proxy-agent pacote e passe o agente resultante para httpAgent e httpsAgent na configuração da solicitação. Defina proxy: false para evitar conflitos com o manipulador de proxy integrado.

Como desativo o proxy para uma única solicitação Axios?

Passe proxy: false na configuração da solicitação para essa chamada específica. Isso substitui qualquer proxy definido no nível da instância via axios.create(). É útil para solicitações a serviços internos ou pontos de extremidade localhost que não devem ser encaminhadas através do proxy.

Por que é que o Axios ignora as minhas definições de proxy quando as variáveis de ambiente estão definidas?

O Axios não lê automaticamente HTTP_PROXY ou HTTPS_PROXY variáveis de ambiente. Deve analisá-las você mesmo no Node.js utilizando new URL(process.env.HTTP_PROXY) e injetar o host e a porta resultantes na proxy config manualmente.

Qual é a diferença entre proxies residenciais e de datacenter para scraping?

Os proxies de datacenter utilizam IPs de fornecedores de serviços na nuvem. São rápidos, acessíveis e estão disponíveis em grandes quantidades, mas os seus intervalos de IP são bem conhecidos e mais fáceis de bloquear pelos sites. Os proxies residenciais utilizam IPs atribuídos pelos ISP a residências reais, tornando-os mais difíceis de detetar, mas mais caros e mais lentos.

Como posso testar se a minha solicitação Axios está realmente a passar pelo proxy?

Envie uma solicitação GET para https://httpbin.org/ip através do seu proxy configurado. Compare o origin campo na resposta com o endereço IP real da sua máquina. Se forem diferentes, o proxy está ativo. Para uma verificação mais aprofundada, consulte https://httpbin.org/headers para confirmar se os cabeçalhos da solicitação correspondem às expectativas.

Conclusão

Saber como configurar corretamente as ligações de proxy do Axios começa por ser simples (três campos de configuração), mas torna-se mais complexo quando se tem em conta a autenticação, o tunelamento HTTPS, a lógica de rotação, o suporte a SOCKS5 e o tratamento de erros. Os padrões neste guia abrangem tudo, desde experiências rápidas até pipelines de scraping prontos para produção.

A lição mais importante: a configuração do proxy é apenas metade da batalha. Também precisa de proxies fiáveis, tempos de espera razoáveis e uma lógica de repetição que não sobrecarregue um endpoint inativo. Se acertar nestes fundamentos, o seu scraper baseado em Axios será muito mais resiliente.

Se a gestão de conjuntos de proxies, rotação e evasão anti-bot está a consumir mais tempo de engenharia do que a própria extração de dados, a WebScrapingAPI trata da rotação de proxies, resolução de CAPTCHA e lógica de repetição por trás de um único ponto de extremidade, permitindo-lhe manter o seu código Axios e concentrar-se no que faz com os dados.

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.