Configuração de proxy no Selenium: conectar SOCKS5 e HTTP no Chrome e Firefox
Este guia explica como conectar proxies HTTP e SOCKS5 da Socks5Proxy no Selenium 4 para Chrome e Firefox, e como usar autorização por IP quando Chrome não aceita senhas de proxy.
Por que a autenticação de proxy é difícil no Selenium?
O Chrome aceita o endereço do proxy como argumento de linha de comando --proxy-server, mas não aceita o nome de usuário e senha dentro desse endereço. Se você se conectar a um proxy que requer nome de usuário e senha, o navegador exibirá uma janela de autenticação, o que é difícil de preencher com Selenium.
A solução mais limpa é a autorização por IP. Registre o IPv4 do servidor ou PC onde o Selenium é executado no dashboard, e o proxy aceitará conexões desse IP sem nome de usuário e senha. No Chrome, basta usar ip:porta. Até 10 IPs podem ser registrados para uso em vários servidores.
O exemplo usa IP 198.51.100.23, porta HTTP 8000 e porta SOCKS5 1080.
pip install seleniumComo conectar um proxy HTTP ao Chrome?
Após registrar autorização por IP, adicione o endereço em ChromeOptions com --proxy-server. Selenium 4.6+ usa Selenium Manager para baixar automaticamente o chromedriver correto.
Os mesmos parâmetros se aplicam no modo headless. Para verificar a conexão, abra um verificador de IP e confirme se o IP exibido é o do proxy.
from selenium import webdriver
from selenium.webdriver.common.by import By
opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000") # this machine's IP is authorized in the dashboard
opts.add_argument("--headless=new")
driver = webdriver.Chrome(options=opts)
try:
driver.get("https://api.ipify.org")
print(driver.find_element(By.TAG_NAME, "body").text) # should print the proxy IP
finally:
driver.quit()Como usar um proxy SOCKS5 no Chrome?
Basta colocar o endereço socks5:// no --proxy-server. O Chrome usa o SOCKS5 para resolver nomes de domínio pelo proxy, mas em alguns ambientes a resolução DNS interna pode permanecer, então é comum bloquear a resolução local com o argumento --host-resolver-rules.
O SOCKS5 também suporta conexão por autorização de IP, já que o Chrome não suporta autenticação por nome de usuário e senha em proxies SOCKS.
from selenium import webdriver
opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=socks5://198.51.100.23:1080")
# make sure host names are resolved through the proxy
opts.add_argument('--host-resolver-rules=MAP * ~NOTFOUND , EXCLUDE 198.51.100.23')
driver = webdriver.Chrome(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()Como conectar ao Firefox?
O Firefox permite definir o proxy por configurações. Defina network.proxy.type como 1 (manual) e insira o endereço e porta HTTP ou SOCKS. Para SOCKS5, defina network.proxy.socks_version como 5 e network.proxy.socks_remote_dns como True para resolver nomes pelo proxy.
O Firefox também não tem uma maneira de inserir a senha do proxy por configurações de execução, então a autorização por IP é a mais simples.
from selenium import webdriver
opts = webdriver.FirefoxOptions()
opts.set_preference("network.proxy.type", 1)
opts.set_preference("network.proxy.socks", "198.51.100.23")
opts.set_preference("network.proxy.socks_port", 1080)
opts.set_preference("network.proxy.socks_version", 5)
opts.set_preference("network.proxy.socks_remote_dns", True)
driver = webdriver.Firefox(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()Como executar vários navegadores com IPs diferentes simultaneamente?
Execute navegadores separadamente com diferentes endereços de proxy. O código abaixo obtém uma lista ip:port via API e abre 3 navegadores com IPs distintos. Como cada navegador consome muita memória, ajuste o número de instâncias conforme a capacidade do servidor.
Para tarefas que exigem uso prolongado do navegador, como uma sessão de login, é recomendável fixar um IP por navegador e não alterá-lo até o final da tarefa.
import requests
from selenium import webdriver
KEY = "YOUR_API_KEY"
lines = requests.get(
"https://socks5proxy.io/api/v1/proxies/download",
params={"format": "ip:port", "protocol": "http"},
headers={"Authorization": "Bearer " + KEY},
timeout=30,
).text.split()
drivers = []
for line in lines[:3]:
opts = webdriver.ChromeOptions()
opts.add_argument("--headless=new")
opts.add_argument("--proxy-server=http://" + line)
drivers.append(webdriver.Chrome(options=opts))
for d in drivers:
d.get("https://api.ipify.org")
print(d.page_source)
d.quit()E se eu precisar usar autenticação por usuário/senha?
Em ambientes com IP variável, onde autorização por IP não funciona, há duas opções: 1) Usar bibliotecas como selenium-wire para injetar credenciais, ou 2) Executar um proxy local sem autenticação que redirecione para o Socks5Proxy com usuário/senha.
Ambos os métodos adicionam um componente a mais, aumentando a complexidade de gerenciamento. Se possível, usar autorização por IP em servidores de IP fixo é a opção mais simples e rápida.
Quais configurações são necessárias para adaptar o navegador ao país alvo?
Altere o argumento --lang do Chrome e o cabeçalho Accept-Language conforme o país do IP para abrir páginas no idioma local. Para sites sensíveis a fuso horário, use o comando CDP Emulation.setTimezoneOverride.
Defina o tamanho da janela com o argumento --window-size e, se precisar de uma tela de celular, use a configuração de emulação de dispositivo móvel. Armazene esses valores em pacotes de configuração por país para executar testes consistentes em várias regiões.
from selenium import webdriver
opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")
opts.add_argument("--lang=de-DE")
opts.add_argument("--window-size=1366,900")
driver = webdriver.Chrome(options=opts)
driver.execute_cdp_cmd("Emulation.setTimezoneOverride", {"timezoneId": "Europe/Berlin"})
driver.get("https://example.com/")
driver.quit()As mesmas configurações funcionam no Selenium Grid ou navegadores remotos?
Sim. ChromeOptions e FirefoxOptions funcionam igualmente em execução remota. Passando as mesmas opções para webdriver.Remote, o navegador no nó Grid usará esse proxy. Para autorização por IP, registre o IP de saída do nó Grid onde o navegador é executado, não o da máquina local.
Se você tiver vários nós, registre todos os IPs de cada nó. Você pode registrar até 10 IPs. Se o ambiente de nuvem mudar frequentemente, é mais fácil gerenciar se você atribuir IPs fixos aos nós.
from selenium import webdriver
opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000") # authorize the Grid node IP, not this machine
driver = webdriver.Remote(command_executor="http://grid.example.internal:4444", options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()O que verificar se não conseguir conectar?
ERR_PROXY_CONNECTION_FAILED geralmente ocorre quando o endereço ou porta está incorreto. Verifique se você não inseriu uma porta SOCKS5 em um endereço HTTP. Se ERR_TUNNEL_CONNECTION_FAILED aparecer ou uma janela de autenticação for exibida, o IP registrado para autorização pode ser diferente do IP real. Use cURL no servidor para abrir api.ipify.org sem proxy e registre o IP exibido.
Servidores em nuvem podem mudar o IP de saída ao reiniciar. Use um IP fixo ou atualize a lista de registros no painel quando o IP mudar.