Voltar ao blog

Automatização da troca de proxy via API: como configurar a rotação para scraping e arbitragem

Guia completo para automação da troca de proxy via API: exemplos de código, integração com parsers e navegadores anti-detect, solução de problemas comuns.

📅16 de fevereiro de 2026
```html

A troca manual de proxies ao trabalhar com centenas de requisições é perda de tempo e dinheiro. A rotação via API permite alternar automaticamente endereços IP em caso de bloqueios, distribuir a carga e escalar scraping ou multicontas. Neste guia, vamos abordar como configurar a troca automática de proxies para diferentes tarefas: desde scraping de marketplaces até farming de contas no Facebook Ads.

O material é adequado tanto para desenvolvedores que criam scrapers em Python ou Node.js, quanto para arbitradores que utilizam ferramentas prontas com integração API.

Por que automatizar a rotação de proxies via API

A rotação automática de endereços IP via API resolve várias tarefas críticas enfrentadas por especialistas em diferentes áreas:

Para scraping de marketplaces e sites: Ao coletar dados do Wildberries, Ozon ou Avito, cada IP pode fazer um número limitado de requisições (geralmente 50-200 por hora). A rotação via API permite alternar automaticamente para um novo IP ao atingir o limite ou receber um captcha, garantindo coleta contínua de dados.

Para arbitragem e multicontas: Ao trabalhar com 20-50 contas publicitárias do Facebook Ads ou contas do Instagram, é necessário isolar cada perfil. A API permite atribuir programaticamente um proxy único a cada conta no Dolphin Anty ou AdsPower, recriar automaticamente sessões em caso de bloqueios.

Para automação de SMM: Serviços de postagem em massa no Instagram, TikTok ou VK devem distribuir ações entre endereços IP para evitar rate limits. A API oferece a possibilidade de obter dinamicamente novos proxies para cada sessão ou grupo de contas.

Principais vantagens da automação via API em comparação com a troca manual:

  • Velocidade: A troca de IP ocorre em milissegundos programaticamente, sem intervenção humana
  • Escalabilidade: É possível gerenciar milhares de proxies simultaneamente através de uma interface única
  • Tolerância a falhas: Substituição automática de proxies não funcionais sem interromper o processo
  • Flexibilidade: Configuração de regras de rotação para tarefas específicas: por tempo, por número de requisições, por geografia
  • Economia: Uso otimizado de tráfego através de balanceamento de carga

Cenário típico de uso: você está fazendo scraping de preços de concorrentes no Wildberries. Sem API, você precisa monitorar manualmente os bloqueios, acessar o painel do provedor de proxy, copiar novos dados e inseri-los no script. Com API, tudo isso acontece automaticamente: o script recebe erro 429 (Too Many Requests), envia uma requisição à API do serviço de proxy, obtém um novo IP e continua funcionando.

Tipos de rotação de proxy: sticky sessions vs troca automática

Antes de configurar a automação, é importante entender a diferença entre os tipos de rotação de endereços IP. A escolha da estratégia depende da sua tarefa.

Sticky Sessions (proxies de sessão)

Ao usar sticky sessions, um endereço IP é fixado à sua sessão por um determinado tempo (geralmente de 5 a 30 minutos). A troca ocorre apenas após o término do tempo da sessão ou por sua requisição via API.

Quando usar:

  • Trabalho com contas em redes sociais (Instagram, Facebook) — troca frequente de IP gera suspeitas
  • Preenchimento de formulários de várias páginas, onde é necessário manter a sessão
  • Teste de anúncios de uma região específica durante a sessão
  • Scraping de sites com autenticação, onde a troca de IP levará ao logout

Exemplo de requisição API para criar sticky session (geralmente usa-se formato especial de login):

// Formato: username-session-SESSIONID:password
// SESSIONID — qualquer string, mesma = mesmo IP

proxy = "username-session-abc123:password@gate.proxycove.com:8000"

// Todas as requisições com session-abc123 receberão o mesmo IP durante a sessão
// Para novo IP use outro SESSIONID: session-xyz789

Rotação automática a cada requisição

O endereço IP muda a cada nova conexão ao servidor proxy. Este é o comportamento padrão de proxies residenciais sem especificar parâmetros de sessão.

Quando usar:

  • Scraping em massa sem autenticação (preços, contatos, anúncios)
  • Contornar rate limits agressivos em APIs públicas
  • Coleta de dados de sites que banem IP após 10-20 requisições
  • Verificação de disponibilidade de conteúdo de diferentes regiões

Exemplo de uso em Python (cada requisição = novo IP):

import requests

proxy = {
    "http": "http://username:password@gate.proxycove.com:8000",
    "https": "http://username:password@gate.proxycove.com:8000"
}

# Cada requisição receberá um novo IP
for i in range(10):
    response = requests.get("https://api.ipify.org", proxies=proxy)
    print(f"Requisição {i+1}, IP: {response.text}")

Rotação por temporizador

Você controla programaticamente quando trocar o IP: a cada N minutos, após M requisições ou ao receber determinados erros. Esta é uma abordagem híbrida, implementada através da API do serviço de proxy.

Quando usar:

  • Otimização de consumo de tráfego — troca apenas quando necessário
  • Trabalho com sites que rastreiam padrões (troca muito frequente = ban)
  • Balanceamento entre anonimato e estabilidade de sessão
Tipo de rotação Frequência de troca de IP Tarefas Consumo de tráfego
Sticky Session 5-30 minutos Multicontas, autenticação Baixo
Auto-rotação Cada requisição Scraping, contornar rate limits Médio
Por temporizador Configurável Universal Otimizado

Fundamentos de trabalho com API de serviços de proxy

A maioria dos provedores modernos de proxy oferece duas formas de gerenciamento: através do painel web e através da API. A API fornece acesso programático às funções: obter lista de proxies, criar novas sessões, verificar saldo, estatísticas de uso.

Métodos API típicos de serviços de proxy

Embora cada provedor tenha sua própria documentação, os métodos padrão geralmente incluem:

  • GET /api/v1/proxy/list — obter lista de proxies disponíveis com filtro por país, tipo
  • POST /api/v1/proxy/rotate — forçar troca de IP na sessão ativa
  • GET /api/v1/account/balance — verificar saldo de tráfego ou dinheiro na conta
  • GET /api/v1/stats — estatísticas de uso: volume de tráfego, número de requisições, erros
  • POST /api/v1/session/create — criar nova sticky session com parâmetros (país, cidade, duração)

A autenticação geralmente ocorre através de chave API no cabeçalho da requisição:

curl -X GET "https://api.provider.com/v1/proxy/list?country=US" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"

A resposta geralmente vem em formato JSON:

{
  "status": "success",
  "data": {
    "proxies": [
      {
        "ip": "123.45.67.89",
        "port": 8000,
        "country": "US",
        "city": "New York",
        "protocol": "http",
        "username": "user123",
        "password": "pass456"
      }
    ],
    "total": 150,
    "available": 147
  }
}

Gerenciamento de sessões via API

Para tarefas que exigem controle sobre o tempo de vida do IP (multicontas, trabalho com contas), usa-se a criação de sessões nomeadas via API. Isso permite gerenciar programaticamente dezenas e centenas de endereços IP isolados.

Exemplo de criação de sessão com parâmetros:

POST /api/v1/session/create
{
  "country": "US",
  "state": "California",
  "session_duration": 600,  // 10 minutos
  "session_id": "facebook_account_001"
}

// Resposta:
{
  "status": "success",
  "session": {
    "id": "facebook_account_001",
    "proxy": "gate.provider.com:8000",
    "username": "user-session-facebook_account_001",
    "password": "your_password",
    "ip": "45.67.89.123",
    "expires_at": "2024-01-15T15:30:00Z"
  }
}

Agora você pode usar este proxy no seu script ou navegador antidetecção, e o IP permanecerá inalterado por 10 minutos. Para renovar a sessão, envia-se uma requisição repetida com o mesmo session_id.

Exemplos de automação em Python: requests, Selenium, Scrapy

Python é a linguagem mais popular para scraping e automação. Vamos ver exemplos de integração de rotação de proxies via API com as principais ferramentas.

Troca automática de proxy em requests

A biblioteca requests é usada para requisições HTTP simples. Para rotação automática, criaremos uma classe wrapper que troca proxies em caso de erros:

import requests
import random
import time

class RotatingProxySession:
    def __init__(self, proxy_list):
        """
        proxy_list: lista de dicionários com dados de proxy
        [{"http": "http://user:pass@ip:port", "https": "..."}]
        """
        self.proxy_list = proxy_list
        self.current_proxy = None
        self.session = requests.Session()
        self.rotate()
    
    def rotate(self):
        """Selecionar proxy aleatório da lista"""
        self.current_proxy = random.choice(self.proxy_list)
        self.session.proxies.update(self.current_proxy)
        print(f"Alternado para proxy: {self.current_proxy['http']}")
    
    def get(self, url, max_retries=3, **kwargs):
        """Requisição GET com rotação automática em caso de erros"""
        for attempt in range(max_retries):
            try:
                response = self.session.get(url, timeout=10, **kwargs)
                
                # Se recebeu bloqueio — trocar proxy
                if response.status_code in [403, 429, 503]:
                    print(f"Recebido {response.status_code}, trocando proxy...")
                    self.rotate()
                    time.sleep(2)
                    continue
                
                return response
                
            except requests.exceptions.ProxyError:
                print(f"Proxy não funciona, tentativa {attempt+1}/{max_retries}")
                self.rotate()
                time.sleep(2)
            
            except requests.exceptions.Timeout:
                print("Timeout, trocando proxy...")
                self.rotate()
                time.sleep(2)
        
        raise Exception(f"Não foi possível executar requisição após {max_retries} tentativas")

# Uso:
proxies = [
    {"http": "http://user1:pass@gate1.com:8000", "https": "http://user1:pass@gate1.com:8000"},
    {"http": "http://user2:pass@gate2.com:8000", "https": "http://user2:pass@gate2.com:8000"},
]

session = RotatingProxySession(proxies)

# Fazendo scraping do Wildberries
for page in range(1, 50):
    url = f"https://www.wildberries.ru/catalog/page={page}"
    response = session.get(url)
    print(f"Página {page}: {response.status_code}")

Integração com Selenium para automação de navegador

Selenium é usado para scraping de sites com JavaScript e automação de ações no navegador. Para trocar proxy é necessário recriar o driver, pois as configurações de proxy são definidas na inicialização:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

class SeleniumRotatingProxy:
    def __init__(self, proxy_list):
        self.proxy_list = proxy_list
        self.driver = None
        self.current_proxy_index = 0
    
    def create_driver(self):
        """Criar novo driver com proxy atual"""
        if self.driver:
            self.driver.quit()
        
        proxy = self.proxy_list[self.current_proxy_index]
        
        chrome_options = Options()
        chrome_options.add_argument(f'--proxy-server={proxy}')
        chrome_options.add_argument('--headless')  # sem GUI
        
        self.driver = webdriver.Chrome(options=chrome_options)
        print(f"Driver criado com proxy: {proxy}")
    
    def rotate(self):
        """Alternar para próximo proxy"""
        self.current_proxy_index = (self.current_proxy_index + 1) % len(self.proxy_list)
        self.create_driver()
    
    def get_with_retry(self, url, max_retries=3):
        """Abrir URL com troca automática de proxy em caso de erros"""
        for attempt in range(max_retries):
            try:
                if not self.driver:
                    self.create_driver()
                
                self.driver.get(url)
                
                # Verificação de bloqueio (por exemplo, busca de captcha)
                if "captcha" in self.driver.page_source.lower():
                    print("Captcha detectado, trocando proxy...")
                    self.rotate()
                    time.sleep(3)
                    continue
                
                return self.driver.page_source
                
            except Exception as e:
                print(f"Erro: {e}, trocando proxy (tentativa {attempt+1})")
                self.rotate()
                time.sleep(3)
        
        raise Exception("Não foi possível carregar a página")

# Uso:
proxies = [
    "http://user:pass@gate1.com:8000",
    "http://user:pass@gate2.com:8000",
]

bot = SeleniumRotatingProxy(proxies)

# Fazendo scraping do Ozon
for i in range(10):
    html = bot.get_with_retry(f"https://www.ozon.ru/category/page-{i}")
    print(f"Obtido HTML da página {i}, tamanho: {len(html)}")

bot.driver.quit()

Scrapy com middleware para rotação de proxy

Scrapy é um framework para scraping em larga escala. A rotação de proxies é implementada através de middleware, que é aplicado automaticamente a todas as requisições:

# middlewares.py

import random
from scrapy.exceptions import IgnoreRequest

class RotatingProxyMiddleware:
    def __init__(self, proxy_list):
        self.proxy_list = proxy_list
    
    @classmethod
    def from_crawler(cls, crawler):
        # Obter lista de proxies das configurações
        proxy_list = crawler.settings.getlist('ROTATING_PROXY_LIST')
        return cls(proxy_list)
    
    def process_request(self, request, spider):
        # Atribuir proxy aleatório a cada requisição
        proxy = random.choice(self.proxy_list)
        request.meta['proxy'] = proxy
        spider.logger.info(f'Usando proxy: {proxy}')
    
    def process_exception(self, request, exception, spider):
        # Em caso de erro de proxy — repetir com outro
        proxy = random.choice(self.proxy_list)
        spider.logger.warning(f'Erro de proxy, alternando para: {proxy}')
        request.meta['proxy'] = proxy
        return request  # repetir requisição

# settings.py

DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.RotatingProxyMiddleware': 350,
}

ROTATING_PROXY_LIST = [
    'http://user:pass@gate1.com:8000',
    'http://user:pass@gate2.com:8000',
    'http://user:pass@gate3.com:8000',
]

# Repetir requisições em caso de erros
RETRY_TIMES = 5
RETRY_HTTP_CODES = [403, 429, 500, 502, 503]

Agora cada requisição do Scrapy receberá automaticamente um proxy aleatório da lista, e em caso de erros será repetida com outro IP.

Automação em Node.js: axios, Puppeteer, Playwright

Node.js é popular para criar scrapers e bots graças à assincronia e boa integração com ferramentas de navegador. Vamos ver exemplos de rotação de proxies nas principais bibliotecas.

Axios com rotação automática

Axios é uma biblioteca para requisições HTTP. Criaremos uma classe com pool de proxies e substituição automática em caso de erros:

const axios = require('axios');
const HttpsProxyAgent = require('https-proxy-agent');

class RotatingProxyClient {
  constructor(proxyList) {
    this.proxyList = proxyList;
    this.currentIndex = 0;
  }

  getProxy() {
    const proxy = this.proxyList[this.currentIndex];
    this.currentIndex = (this.currentIndex + 1) % this.proxyList.length;
    return proxy;
  }

  async request(url, options = {}, maxRetries = 3) {
    for (let i = 0; i < maxRetries; i++) {
      const proxy = this.getProxy();
      const agent = new HttpsProxyAgent(proxy);

      try {
        const response = await axios.get(url, {
          ...options,
          httpsAgent: agent,
          timeout: 10000
        });

        // Se recebeu bloqueio — próxima tentativa
        if ([403, 429, 503].includes(response.status)) {
          console.log(`Status ${response.status}, trocando proxy...`);
          continue;
        }

        return response.data;

      } catch (error) {
        console.log(`Erro com proxy ${proxy}: ${error.message}`);
        if (i === maxRetries - 1) throw error;
      }
    }
  }
}

// Uso:
const proxies = [
  'http://user:pass@gate1.com:8000',
  'http://user:pass@gate2.com:8000',
];

const client = new RotatingProxyClient(proxies);

(async () => {
  for (let page = 1; page <= 20; page++) {
    const data = await client.request(`https://api.example.com/products?page=${page}`);
    console.log(`Página ${page}: obtidos ${data.length} produtos`);
  }
})();

Puppeteer com rotação de proxy

Puppeteer controla o navegador Chrome. O proxy é definido ao iniciar o navegador, portanto para trocar é necessário recriar a instância:

const puppeteer = require('puppeteer');

class PuppeteerRotatingProxy {
  constructor(proxyList) {
    this.proxyList = proxyList;
    this.currentIndex = 0;
    this.browser = null;
  }

  async createBrowser() {
    if (this.browser) await this.browser.close();

    const proxy = this.proxyList[this.currentIndex];
    console.log(`Iniciando navegador com proxy: ${proxy}`);

    this.browser = await puppeteer.launch({
      headless: true,
      args: [`--proxy-server=${proxy}`]
    });
  }

  rotate() {
    this.currentIndex = (this.currentIndex + 1) % this.proxyList.length;
  }

  async scrape(url, maxRetries = 3) {
    for (let i = 0; i < maxRetries; i++) {
      try {
        if (!this.browser) await this.createBrowser();

        const page = await this.browser.newPage();
        
        // Autenticação de proxy (se necessário)
        await page.authenticate({
          username: 'your_username',
          password: 'your_password'
        });

        await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });

        // Verificação de captcha
        const content = await page.content();
        if (content.includes('captcha')) {
          console.log('Captcha detectado, trocando proxy...');
          this.rotate();
          await this.createBrowser();
          continue;
        }

        return content;

      } catch (error) {
        console.log(`Erro: ${error.message}, tentativa ${i+1}`);
        this.rotate();
        await this.createBrowser();
      }
    }
    throw new Error('Não foi possível carregar a página');
  }
}

// Uso:
const proxies = ['gate1.com:8000', 'gate2.com:8000'];
const scraper = new PuppeteerRotatingProxy(proxies);

(async () => {
  const html = await scraper.scrape('https://www.avito.ru/moskva');
  console.log(`Obtido HTML com tamanho: ${html.length}`);
  await scraper.browser.close();
})();

Playwright com suporte a rotação

Playwright é uma alternativa moderna ao Puppeteer com melhor desempenho. A configuração de proxy é análoga:

const { chromium } = require('playwright');

async function scrapeWithRotation(urls, proxyList) {
  let proxyIndex = 0;

  for (const url of urls) {
    const proxy = proxyList[proxyIndex];
    
    const browser = await chromium.launch({
      headless: true,
      proxy: {
        server: proxy,
        username: 'your_user',
        password: 'your_pass'
      }
    });

    const page = await browser.newPage();
    
    try {
      await page.goto(url, { timeout: 30000 });
      const title = await page.title();
      console.log(`${url} → ${title} (proxy: ${proxy})`);
    } catch (error) {
      console.log(`Erro em ${url}: ${error.message}`);
    }

    await browser.close();
    
    // Próximo proxy para próxima URL
    proxyIndex = (proxyIndex + 1) % proxyList.length;
  }
}

const urls = [
  'https://www.wildberries.ru',
  'https://www.ozon.ru',
  'https://www.avito.ru'
];

const proxies = [
  'http://gate1.com:8000',
  'http://gate2.com:8000'
];

scrapeWithRotation(urls, proxies);

Integração de API com navegadores antidetecção: Dolphin Anty, AdsPower

Para arbitradores e especialistas em SMM que trabalham com multicontas, a atribuição manual de proxy a cada perfil no Dolphin Anty ou AdsPower leva horas. A API desses navegadores permite automatizar a criação de perfis e vinculação de proxies.

Automação do Dolphin Anty via API

Dolphin Anty fornece uma API local (geralmente em http://localhost:3001/v1.0), através da qual é possível criar perfis, atribuir proxies, iniciar navegadores programaticamente.

Exemplo de script em Python para criação em massa de perfis com proxies únicos:

import requests
import json

DOLPHIN_API = "http://localhost:3001/v1.0"
API_TOKEN = "your_dolphin_api_token"

# Lista de proxies do seu provedor (obtidos via API deles)
proxies = [
    {"host": "gate1.com", "port": 8000, "login": "user1", "password": "pass1"},
    {"host": "gate2.com", "port": 8000, "login": "user2", "password": "pass2"},
]

def create_profile_with_proxy(name, proxy):
    """Criar perfil no Dolphin com vinculação de proxy"""
    
    payload = {
        "name": name,
        "tags": ["Facebook Ads", "Auto-created"],
        "proxy": {
            "type": "http",  # ou socks5
            "host": proxy["host"],
            "port": proxy["port"],
            "login": proxy["login"],
            "password": proxy["password"]
        },
        "fingerprint": {
            "os": "win",
            "webRTC": {
                "mode": "altered",
                "fillBasedOnIp": True
            },
            "canvas": {
                "mode": "noise"
            }
        }
    }
    
    headers = {
        "Authorization": f"Bearer {API_TOKEN}",
        "Content-Type": "application/json"
    }
    
    response = requests.post(
        f"{DOLPHIN_API}/browser_profiles",
        headers=headers,
        data=json.dumps(payload)
    )
    
    if response.status_code == 200:
        profile = response.json()
        print(f"✓ Perfil criado: {name}, ID: {profile['id']}")
        return profile['id']
    else:
        print(f"✗ Erro ao criar {name}: {response.text}")
        return None

# Criar 50 perfis com rotação de proxies
for i in range(50):
    proxy = proxies[i % len(proxies)]  # rotação cíclica
    profile_name = f"FB_Account_{i+1:03d}"
    create_profile_with_proxy(profile_name, proxy)

Agora você tem 50 perfis no Dolphin Anty, cada um com fingerprint único de navegador e proxy. Para iniciar o perfil programaticamente:

def start_profile(profile_id):
    """Iniciar perfil do navegador"""
    response = requests.get(
        f"{DOLPHIN_API}/browser_profiles/{profile_id}/start",
        headers={"Authorization": f"Bearer {API_TOKEN}"}
    )
    
    if response.status_code == 200:
        data = response.json()
        print(f"Perfil iniciado, porta WebDriver: {data['automation']['port']}")
        return data['automation']['port']
    else:
        print(f"Erro ao iniciar: {response.text}")

# Iniciar perfil e controlar via Selenium
port = start_profile("profile_id_here")

from selenium import webdriver
driver = webdriver.Remote(
    command_executor=f'http://127.0.0.1:{port}',
    options=webdriver.ChromeOptions()
)
driver.get("https://facebook.com")

Automação do AdsPower

AdsPower também fornece uma API local. A lógica é análoga ao Dolphin, mas com endpoints diferentes:

import requests

ADSPOWER_API = "http://local.adspower.net:50325/api/v1"

def create_adspower_profile(name, proxy):
    payload = {
        "name": name,
        "group_id": "0",  # ID do grupo de perfis
        "domain_name": "facebook.com",
        "open_urls": ["https://facebook.com"],
        "repeat_config": ["0"],
        "username": proxy["login"],
        "password": proxy["password"],
        "proxy_type": "http",
        "proxy_host": proxy["host"],
        "proxy_port": proxy["port"],
        "proxy_user": proxy["login"],
        "proxy_password": proxy["password"]
    }
    
    response = requests.post(
        f"{ADSPOWER_API}/user/create",
        json=payload
    )
    
    if response.json()["code"] == 0:
        user_id = response.json()["data"]["id"]
        print(f"✓ Perfil AdsPower criado: {name}, ID: {user_id}")
        return user_id
    else:
        print(f"✗ Erro: {response.json()['msg']}")

# Criação de perfis
for i, proxy in enumerate(proxies):
    create_adspower_profile(f"TikTok_Account_{i+1}", proxy)

Essa automação é criticamente importante ao trabalhar com dezenas de contas. Em vez de copiar manualmente dados de proxy em cada perfil, você executa um script e obtém uma infraestrutura pronta em minutos.

Tratamento de erros e fallback automático

Ao trabalhar com proxies, situações inevitáveis ocorrem: IP bloqueado pelo site alvo, servidor proxy não responde, tráfego esgotado. O tratamento adequado de erros é a chave para automação estável.

Tipos de erros e estratégias de tratamento

Erro Causa Solução
HTTP 403 Forbidden IP na lista de bloqueio do site Trocar proxy, adicionar atraso
HTTP 429 Too Many Requests Rate limit excedido Trocar IP, aumentar intervalo
ProxyError / Timeout Servidor proxy não responde Remover do pool, pegar próximo
407 Proxy Authentication Required Login/senha incorretos Verificar credenciais, atualizar
Captcha na página Site detectou bot Trocar IP, usar proxies móveis

Implementação de sistema inteligente de retry

Em vez de simples repetição de requisição, criaremos um sistema com atraso exponencial e lista negra de proxies não funcionais:

import requests
import time
from collections import defaultdict

class SmartProxyRotator:
    def __init__(self, proxy_list):
        self.proxy_list = proxy_list
        self.blacklist = set()  # IPs que não funcionam
        self.error_count = defaultdict(int)  # contador de erros por IP
        self.max_errors = 3  # após 3 erros — para lista negra
    
    def get_working_proxy(self):
        """Obter proxy que não está na lista negra"""
        available = [p for p in self.proxy_list if p not in self.blacklist]
        if not available:
            # Todos os proxies banidos — limpar lista negra
            print("⚠ Todos os proxies bloqueados, resetando lista negra")
            self.blacklist.clear()
            self.error_count.clear()
            available = self.proxy_list
        return available[0]
    
    def mark_error(self, proxy):
        """Marcar erro de proxy"""
        self.error_count[proxy] += 1
        if self.error_count[proxy] >= self.max_errors:
            self.blacklist.add(proxy)
            print(f"✗ Proxy {proxy} adicionado à lista negra")
    
    def request_with_retry(self, url, max_retries=5):
        """Requisição com tentativas inteligentes"""
        for attempt in range(max_retries):
            proxy = self.get_working_proxy()
            
            try:
                # Atraso exponencial: 1s, 2s, 4s, 8s...
                if attempt > 0:
                    delay = 2 ** attempt
                    print(f"Aguardando {delay}s antes da tentativa {attempt+1}")
                    time.sleep(delay)
                
                response = requests.get(
                    url,
                    proxies={"http": proxy, "https": proxy},
                    timeout=15
                )
                
                # Sucesso — resetar contador de erros
                if response.status_code == 200:
                    self.error_count[proxy] = 0
                    return response
                
                # Bloqueio — trocar proxy
                elif response.status_code in [403, 429]:
                    print(f"Status {response.status_code}, trocando proxy")
                    self.mark_error(proxy)
                    continue
                
            except requests.exceptions.ProxyError:
                print(f"ProxyError com {proxy}")
                self.mark_error(proxy)
                
            except requests.exceptions.Timeout:
                print(f"Timeout com {proxy}")
                self.mark_error(proxy)
        
        raise Exception(f"Não foi possível executar requisição após {max_retries} tentativas")

# Uso:
proxies = [
    "http://user:pass@gate1.com:8000",
    "http://user:pass@gate2.com:8000",
    "http://user:pass@gate3.com:8000",
]

rotator = SmartProxyRotator(proxies)

for i in range(100):
    try:
        response = rotator.request_with_retry(f"https://api.example.com/data?page={i}")
        print(f"✓ Página {i}: {len(response.text)} bytes")
    except Exception as e:
        print(f"✗ Erro crítico na página {i}: {e}")

Monitoramento e alertas

Para sistemas de produção, é importante monitorar a saúde do pool de proxies em tempo real. Adicione registro de métricas:

import logging
from datetime import datetime

class ProxyMonitor:
    def __init__(self):
        self.stats = {
            "total_requests": 0,
            "successful": 0,
            "failed": 0,
            "proxy_errors": defaultdict(int),
            "start_time": datetime.now()
        }
        
        # Configuração de logging
        logging.basicConfig(
            filename='proxy_rotation.log',
            level=logging.INFO,
            format='%(asctime)s - %(levelname)s - %(message)s'
        )
    
    def log_request(self, proxy, success, error=None):
        self.stats["total_requests"] += 1
        
        if success:
            self.stats["successful"] += 1
            logging.info(f"✓ Sucesso com {proxy}")
        else:
            self.stats["failed"] += 1
            self.stats["proxy_errors"][proxy] += 1
            logging.error(f"✗ Erro com {proxy}: {error}")
    
    def get_report(self):
        uptime = datetime.now() - self.stats["start_time"]
        success_rate = (self.stats["successful"] / self.stats["total_requests"] * 100) if self.stats["total_requests"] > 0 else 0
        
        return f"""
=== Relatório de rotação de proxies ===
Tempo de execução: {uptime}
Total de requisições: {self.stats["total_requests"]}
Bem-sucedidas: {self.stats["successful"]} ({success_rate:.1f}%)
Erros: {self.stats["failed"]}

Proxies problemáticos:
{self._format_errors()}
        """
    
    def _format_errors(self):
        sorted_errors = sorted(
            self.stats["proxy_errors"].items(),
            key=lambda x: x[1],
            reverse=True
        )
        return "\n".join([f"  {proxy}: {count} erros" for proxy, count in sorted_errors[:5]])

# Integração com rotator
monitor = ProxyMonitor()

# No loop de requisições:
try:
    response = rotator.request_with_retry(url)
    monitor.log_request(current_proxy, success=True)
except Exception as e:
    monitor.log_request(current_proxy, success=False, error=str(e))

Melhores práticas e otimização de consumo de tráfego

Para maximizar a eficiência da rotação de proxies e minimizar custos, siga estas recomendações:

  • Use sticky sessions quando possível: Para tarefas que não exigem troca frequente de IP, sessões fixas economizam tráfego e reduzem a probabilidade de bloqueios
  • Implemente cache inteligente: Armazene respostas bem-sucedidas para evitar requisições repetidas desnecessárias
  • Distribua a carga uniformemente: Use algoritmos de balanceamento (round-robin, least-connections) para não sobrecarregar proxies individuais
  • Monitore métricas em tempo real: Taxa de sucesso, latência média, consumo de tráfego por proxy
  • Configure timeouts adequados: Timeouts muito curtos causam falsos positivos; muito longos desperdiçam tempo
  • Use geolocalização estrategicamente: Proxies do país alvo geralmente têm melhor desempenho e menor taxa de bloqueio

Conclusão

A automação de rotação de proxies via API é essencial para operações de scraping, arbitragem e multicontas em escala profissional. Com as ferramentas e técnicas apresentadas neste guia, você pode:

  • Automatizar completamente o gerenciamento de proxies em seus projetos
  • Implementar sistemas robustos de tratamento de erros e fallback
  • Integrar rotação de proxies com navegadores antidetecção
  • Otimizar custos através de uso inteligente de tráfego
  • Escalar operações sem intervenção manual

Lembre-se de que a escolha do provedor de proxies é tão importante quanto a implementação técnica. Procure serviços com API bem documentada, suporte responsivo e pool de IPs de qualidade.

```