A configuração de proxy no Selenium consiste em ajustar opções ou capabilities do navegador para rotear o tráfego web através de um servidor proxy específico, viabilizando tarefas como desbloqueio geográfico, anonimato e inspeção do tráfego de rede. Essa configuração é essencial para automatizar tarefas que exigem contornar restrições geográficas, testar o comportamento de um site a partir de diferentes pontos de rede ou gerenciar o tráfego de rede durante testes ou extração de dados.
Usar um proxy com o Selenium permite redirecionar todo o tráfego do navegador através de um servidor intermediário. Esse recurso é crítico para:
* Contornar restrições geográficas de conteúdo.
* Manter o anonimato durante interações web automatizadas.
* Testar como um site funciona ou se comporta quando acessado de vários pontos de rede.
* Monitorar ou depurar requisições e respostas de rede.
* Acessar redes internas ou restritas.
Conceitos gerais de proxy
Antes de configurar o Selenium, entender os conceitos fundamentais de proxy é crucial.
Tipos de proxy
- Proxies HTTP/HTTPS: Esses proxies operam na camada de aplicação (Layer 7). Proxies HTTP tratam tráfego HTTP não criptografado, enquanto proxies HTTPS tratam tráfego HTTPS criptografado. Muitos proxies HTTPS fazem interceptação SSL (Man-in-the-Middle), descriptografando o tráfego, inspecionando-o e recriptografando-o antes de encaminhá-lo. Isso pode, às vezes, gerar erros de certificado SSL se o certificado do proxy não for confiável para o navegador.
- Proxies SOCKS (SOCKS4, SOCKS5): Proxies SOCKS (Socket Secure) operam em um nível mais baixo (Layer 5). São agnósticos de protocolo, ou seja, conseguem tratar qualquer tipo de tráfego TCP/UDP, não apenas HTTP/HTTPS. SOCKS5 é a versão mais comum, com suporte a autenticação e tráfego UDP, o que o torna versátil para diversas aplicações além da navegação web.
Autenticação de proxy
Muitos servidores proxy exigem autenticação (nome de usuário e senha) para conceder acesso. O Selenium trata a autenticação básica embutindo as credenciais diretamente na string do proxy, normalmente no formato username:password@host:port.
Opções/capabilities do navegador
O Selenium interage com os navegadores via executáveis de driver específicos (por exemplo, ChromeDriver para o Chrome, GeckoDriver para o Firefox). Esses drivers aceitam um objeto Options (por exemplo, ChromeOptions, FirefoxOptions) onde as configurações de proxy são definidas. Essas configurações são passadas ao navegador na inicialização, garantindo que todo o tráfego subsequente daquela instância do navegador seja roteado pelo proxy especificado.
Configuração de proxy no Selenium: exemplos por linguagem
As seções a seguir detalham como configurar proxies para Chrome e Firefox usando Python, Java e C#. Os princípios são transferíveis para outros navegadores suportados pelo Selenium, como Edge ou Safari, usando seus respectivos objetos Options.
Python
O Python usa selenium.webdriver.Proxy e ProxyType para definir as configurações de proxy dentro das opções do navegador.
Proxy HTTP/HTTPS básico
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.firefox.options import Options as FirefoxOptions
# Configurações do proxy
PROXY_HOST = "your_proxy_host"
PROXY_PORT = 8080 # Ou 443 para HTTPS
# --- Exemplo com Chrome ---
chrome_options = ChromeOptions()
chrome_options.add_argument(f'--proxy-server={PROXY_HOST}:{PROXY_PORT}')
# Opcional: desabilite a verificação de certificado SSL se o proxy causar problemas (use com cautela)
# chrome_options.add_argument('--ignore-certificate-errors')
driver_chrome = webdriver.Chrome(options=chrome_options)
driver_chrome.get("http://www.example.com")
# ... execute as ações ...
driver_chrome.quit()
# --- Exemplo com Firefox ---
firefox_options = FirefoxOptions()
firefox_options.set_preference("network.proxy.type", 1) # Configuração manual de proxy
firefox_options.set_preference("network.proxy.http", PROXY_HOST)
firefox_options.set_preference("network.proxy.http_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.ssl", PROXY_HOST)
firefox_options.set_preference("network.proxy.ssl_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.no_proxies_on", "") # Garante que o proxy seja usado para todos os hosts
driver_firefox = webdriver.Firefox(options=firefox_options)
driver_firefox.get("http://www.example.com")
# ... execute as ações ...
driver_firefox.quit()
Proxy HTTP/HTTPS com autenticação
Para proxies HTTP/HTTPS com autenticação, embuta as credenciais diretamente na string do proxy.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.firefox.options import Options as FirefoxOptions
PROXY_HOST = "your_proxy_host"
PROXY_PORT = 8080
PROXY_USER = "your_username"
PROXY_PASS = "your_password"
# --- Exemplo com Chrome ---
# Formato: user:pass@host:port
authenticated_proxy = f"{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"
chrome_options = ChromeOptions()
chrome_options.add_argument(f'--proxy-server={authenticated_proxy}')
driver_chrome = webdriver.Chrome(options=chrome_options)
driver_chrome.get("http://www.example.com")
driver_chrome.quit()
# --- Exemplo com Firefox ---
# As preferências nativas do Firefox não suportam diretamente usuário/senha na string do proxy
# para HTTP/HTTPS. Uma solução alternativa comum é usar uma extensão de navegador ou um gerenciador de proxy.
# No entanto, se você usar a opção de proxy "direct" via capabilities (o que é menos comum no Firefox
# em comparação com o argumento --proxy-server do Chrome), pode funcionar.
# Para um proxy autenticado robusto no Firefox, considere usar uma extensão de proxy ou um proxy SOCKS5.
# O que segue é uma abordagem geral que pode não funcionar diretamente para todos os proxies HTTP/HTTPS autenticados no Firefox.
# Para simplicidade e consistência entre navegadores, considere usar SOCKS5 se a autenticação for obrigatória.
# As preferências padrão do Firefox não suportam diretamente embutir user:pass para HTTP/HTTPS.
# Para proxies HTTP/HTTPS autenticados no Firefox, o navegador normalmente solicita as credenciais.
# O WebDriver não consegue interagir diretamente com esses prompts nativos de autenticação do navegador.
# Uma solução comum é usar um proxy que suporte autenticação via URL (como alguns proxies SOCKS5)
# ou usar uma extensão de navegador que trate a autenticação de proxy.
# Neste exemplo, omitimos uma configuração direta de proxy HTTP/HTTPS autenticado no Firefox devido à complexidade
# e à falta de suporte direto do WebDriver aos prompts nativos de autenticação do navegador.
Proxy SOCKS
Proxies SOCKS exigem que se especifique a versão do SOCKS. SOCKS5 costuma ser preferido por causa de seus recursos.
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.firefox.options import Options as FirefoxOptions
PROXY_HOST = "your_socks_proxy_host"
PROXY_PORT = 1080 # Porta SOCKS comum
PROXY_USER = "your_username" # Opcional para SOCKS5
PROXY_PASS = "your_password" # Opcional para SOCKS5
# --- Exemplo com Chrome ---
chrome_options = ChromeOptions()
# Para SOCKS5 com autenticação, o formato é socks5://user:pass@host:port
# Para SOCKS5 sem autenticação, o formato é socks5://host:port
# Para SOCKS4, use socks4://host:port
socks_proxy_string = f"socks5://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}" if PROXY_USER else f"socks5://{PROXY_HOST}:{PROXY_PORT}"
chrome_options.add_argument(f'--proxy-server={socks_proxy_string}')
driver_chrome = webdriver.Chrome(options=chrome_options)
driver_chrome.get("http://www.example.com")
driver_chrome.quit()
# --- Exemplo com Firefox ---
firefox_options = FirefoxOptions()
firefox_options.set_preference("network.proxy.type", 1) # Configuração manual de proxy
firefox_options.set_preference("network.proxy.socks", PROXY_HOST)
firefox_options.set_preference("network.proxy.socks_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.socks_version", 5) # Para SOCKS5
firefox_options.set_preference("network.proxy.socks_username", PROXY_USER) # Para SOCKS5 autenticado
firefox_options.set_preference("network.proxy.socks_password", PROXY_PASS) # Para SOCKS5 autenticado
firefox_options.set_preference("network.proxy.no_proxies_on", "")
driver_firefox = webdriver.Firefox(options=firefox_options)
driver_firefox.get("http://www.example.com")
driver_firefox.quit()
Java
O Java usa a classe org.openqa.selenium.Proxy e a define dentro das capabilities do driver do navegador.
Proxy HTTP/HTTPS básico
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
public class SeleniumProxySetup {
public static void main(String[] args) {
String PROXY_HOST = "your_proxy_host";
int PROXY_PORT = 8080;
// --- Exemplo com Chrome ---
ChromeOptions chromeOptions = new ChromeOptions();
Proxy proxyChrome = new Proxy();
proxyChrome.setHttpProxy(PROXY_HOST + ":" + PROXY_PORT);
proxyChrome.setSslProxy(PROXY_HOST + ":" + PROXY_PORT); // Defina também para HTTPS
chromeOptions.setCapability("proxy", proxyChrome);
WebDriver driverChrome = new ChromeDriver(chromeOptions);
driverChrome.get("http://www.example.com");
// ... execute as ações ...
driverChrome.quit();
// --- Exemplo com Firefox ---
FirefoxOptions firefoxOptions = new FirefoxOptions();
Proxy proxyFirefox = new Proxy();
proxyFirefox.setHttpProxy(PROXY_HOST + ":" + PROXY_PORT);
proxyFirefox.setSslProxy(PROXY_HOST + ":" + PROXY_PORT); // Defina também para HTTPS
firefoxOptions.setCapability("proxy", proxyFirefox);
WebDriver driverFirefox = new FirefoxDriver(firefoxOptions);
driverFirefox.get("http://www.example.com");
// ... execute as ações ...
driverFirefox.quit();
}
}
Proxy HTTP/HTTPS com autenticação
Assim como no Python, para autenticação básica HTTP/HTTPS as credenciais são embutidas na string do proxy.
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
// O exemplo do Firefox para HTTP/HTTPS autenticado é complexo por causa dos prompts nativos.
// Considere SOCKS5 ou uma extensão de navegador para autenticação no Firefox.
public class SeleniumAuthenticatedProxySetup {
public static void main(String[] args) {
String PROXY_HOST = "your_proxy_host";
int PROXY_PORT = 8080;
String PROXY_USER = "your_username";
String PROXY_PASS = "your_password";
// --- Exemplo com Chrome ---
ChromeOptions chromeOptions = new ChromeOptions();
Proxy proxyChrome = new Proxy();
// Formato: user:pass@host:port
String authenticatedProxyString = PROXY_USER + ":" + PROXY_PASS + "@" + PROXY_HOST + ":" + PROXY_PORT;
proxyChrome.setHttpProxy(authenticatedProxyString);
proxyChrome.setSslProxy(authenticatedProxyString); // Defina também para HTTPS
chromeOptions.setCapability("proxy", proxyChrome);
WebDriver driverChrome = new ChromeDriver(chromeOptions);
driverChrome.get("http://www.example.com");
driverChrome.quit();
// --- Exemplo com Firefox ---
// Como observado no Python, as preferências nativas do Firefox não suportam diretamente
// embutir usuário/senha para proxies HTTP/HTTPS via capabilities do WebDriver
// sem uma extensão de navegador. O navegador normalmente solicita as credenciais.
// Para um proxy autenticado robusto no Firefox, considere usar um proxy SOCKS5 ou uma extensão de proxy.
}
}
Proxy SOCKS
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
public class SeleniumSocksProxySetup {
public static void main(String[] args) {
String PROXY_HOST = "your_socks_proxy_host";
int PROXY_PORT = 1080; // Porta SOCKS comum
String PROXY_USER = "your_username"; // Opcional para SOCKS5
String PROXY_PASS = "your_password"; // Opcional para SOCKS5
// --- Exemplo com Chrome ---
ChromeOptions chromeOptions = new ChromeOptions();
Proxy proxyChrome = new Proxy();
// Para SOCKS5 com autenticação, o formato é socks5://user:pass@host:port
// Para SOCKS5 sem autenticação, o formato é socks5://host:port
String socksProxyString = PROXY_USER != null && !PROXY_USER.isEmpty()
? "socks5://" + PROXY_USER + ":" + PROXY_PASS + "@" + PROXY_HOST + ":" + PROXY_PORT
: "socks5://" + PROXY_HOST + ":" + PROXY_PORT;
chromeOptions.addArguments("--proxy-server=" + socksProxyString); // O Chrome usa o argumento --proxy-server para SOCKS
WebDriver driverChrome = new ChromeDriver(chromeOptions);
driverChrome.get("http://www.example.com");
driverChrome.quit();
// --- Exemplo com Firefox ---
FirefoxOptions firefoxOptions = new FirefoxOptions();
Proxy proxyFirefox = new Proxy();
proxyFirefox.setSocksProxy(PROXY_HOST + ":" + PROXY_PORT);
proxyFirefox.setSocksVersion(5); // Para SOCKS5
// Preferências do Firefox para autenticação SOCKS
firefoxOptions.setPreference("network.proxy.socks_username", PROXY_USER);
firefoxOptions.setPreference("network.proxy.socks_password", PROXY_PASS);
firefoxOptions.setCapability("proxy", proxyFirefox);
WebDriver driverFirefox = new FirefoxDriver(firefoxOptions);
driverFirefox.get("http://www.example.com");
driverFirefox.quit();
}
}
C
O C# usa a classe OpenQA.Selenium.Proxy e a define dentro das opções do navegador.
Proxy HTTP/HTTPS básico
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Firefox;
public class SeleniumProxySetup
{
public static void Main(string[] args)
{
string PROXY_HOST = "your_proxy_host";
int PROXY_PORT = 8080;
// --- Exemplo com Chrome ---
ChromeOptions chromeOptions = new ChromeOptions();
Proxy proxyChrome = new Proxy();
proxyChrome.HttpProxy = $"{PROXY_HOST}:{PROXY_PORT}";
proxyChrome.SslProxy = $"{PROXY_HOST}:{PROXY_PORT}"; // Defina também para HTTPS
chromeOptions.Proxy = proxyChrome;
IWebDriver driverChrome = new ChromeDriver(chromeOptions);
driverChrome.Navigate().GoToUrl("http://www.example.com");
// ... execute as ações ...
driverChrome.Quit();
// --- Exemplo com Firefox ---
FirefoxOptions firefoxOptions = new FirefoxOptions();
Proxy proxyFirefox = new Proxy();
proxyFirefox.HttpProxy = $"{PROXY_HOST}:{PROXY_PORT}";
proxyFirefox.SslProxy = $"{PROXY_HOST}:{PROXY_PORT}"; // Defina também para HTTPS
firefoxOptions.Proxy = proxyFirefox;
IWebDriver driverFirefox = new FirefoxDriver(firefoxOptions);
driverFirefox.Navigate().GoToUrl("http://www.example.com");
// ... execute as ações ...
driverFirefox.Quit();
}
}
Proxy HTTP/HTTPS com autenticação
Para autenticação básica, embuta as credenciais na string do proxy.
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
// O exemplo do Firefox para HTTP/HTTPS autenticado é complexo por causa dos prompts nativos.
// Considere SOCKS5 ou uma extensão de navegador para autenticação no Firefox.
public class SeleniumAuthenticatedProxySetup
{
public static void Main(string[] args)
{
string PROXY_HOST = "your_proxy_host";
int PROXY_PORT = 8080;
string PROXY_USER = "your_username";
string PROXY_PASS = "your_password";
// --- Exemplo com Chrome ---
ChromeOptions chromeOptions = new ChromeOptions();
Proxy proxyChrome = new Proxy();
// Formato: user:pass@host:port
string authenticatedProxyString = $"{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}";
proxyChrome.HttpProxy = authenticatedProxyString;
proxyChrome.SslProxy = authenticatedProxyString; // Defina também para HTTPS
chromeOptions.Proxy = proxyChrome;
IWebDriver driverChrome = new ChromeDriver(chromeOptions);
driverChrome.Navigate().GoToUrl("http://www.example.com");
driverChrome.Quit();
// --- Exemplo com Firefox ---
// Como observado no Python e no Java, as preferências nativas do Firefox não suportam diretamente
// embutir usuário/senha para proxies HTTP/HTTPS via capabilities do WebDriver
// sem uma extensão de navegador. O navegador normalmente solicita as credenciais.
// Para um proxy autenticado robusto no Firefox, considere usar um proxy SOCKS5 ou uma extensão de proxy.
}
}
Proxy SOCKS
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Firefox;
public class SeleniumSocksProxySetup
{
public static void Main(string[] args)
{
string PROXY_HOST = "your_socks_proxy_host";
int PROXY_PORT = 1080; // Porta SOCKS comum
string PROXY_USER = "your_username"; // Opcional para SOCKS5
string PROXY_PASS = "your_password"; // Opcional para SOCKS5
// --- Exemplo com Chrome ---
ChromeOptions chromeOptions = new ChromeOptions();
// O Chrome usa o argumento --proxy-server para SOCKS.
// Para SOCKS5 com autenticação, o formato é socks5://user:pass@host:port
// Para SOCKS5 sem autenticação, o formato é socks5://host:port
string socksProxyString = string.IsNullOrEmpty(PROXY_USER)
? $"socks5://{PROXY_HOST}:{PROXY_PORT}"
: $"socks5://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}";
chromeOptions.AddArgument($"--proxy-server={socksProxyString}");
IWebDriver driverChrome = new ChromeDriver(chromeOptions);
driverChrome.Navigate().GoToUrl("http://www.example.com");
driverChrome.Quit();
// --- Exemplo com Firefox ---
FirefoxOptions firefoxOptions = new FirefoxOptions();
Proxy proxyFirefox = new Proxy();
proxyFirefox.SocksProxy = $"{PROXY_HOST}:{PROXY_PORT}";
proxyFirefox.SocksVersion = 5; // Para SOCKS5
// Preferências do Firefox para autenticação SOCKS
firefoxOptions.SetPreference("network.proxy.socks_username", PROXY_USER);
firefoxOptions.SetPreference("network.proxy.socks_password", PROXY_PASS);
firefoxOptions.Proxy = proxyFirefox;
IWebDriver driverFirefox = new FirefoxDriver(firefoxOptions);
driverFirefox.Navigate().GoToUrl("http://www.example.com");
driverFirefox.Quit();
}
}
Comparação entre tipos de proxy
| Recurso | Proxy HTTP | Proxy HTTPS | Proxy SOCKS (SOCKS5) |
|---|---|---|---|
| Camada de protocolo | Aplicação (Layer 7) | Aplicação (Layer 7) | Sessão (Layer 5) |
| Tráfego tratado | Apenas tráfego HTTP | Apenas tráfego HTTP criptografado (HTTPS) | Qualquer tráfego TCP/UDP |
| Criptografia | Nenhuma (cliente-proxy) | Cliente-proxy (pode recriptografar) | Nenhuma (cliente-proxy), a criptografia em nível de aplicação continua funcionando |
| Anonimato | Pode revelar o IP original nos cabeçalhos | Melhor, mas ainda é um proxy | Alto, mais agnóstico de protocolo, menos manipulação de cabeçalhos |
| Autenticação | Basic, Digest (via cabeçalhos) | Basic, Digest (via cabeçalhos) | Usuário/senha, GSS-API |
| Caso de uso | Navegação web simples, cache, filtragem de conteúdo | Navegação web segura, dados sensíveis, inspeção SSL | Uso geral, P2P, jogos, funcionalidade semelhante a VPN |
| Desempenho | Geralmente mais rápido para HTTP | Overhead de criptografia/descriptografia | Pode ser mais lento por causa do tratamento em nível mais baixo |
Problemas comuns e solução de problemas
- Proxy não funciona: Verifique o host e a porta do proxy. Confirme que o servidor proxy está online e acessível a partir da máquina que executa o Selenium. Regras de firewall podem bloquear as conexões com o proxy.
- Falha de autenticação: Confira novamente o nome de usuário e a senha. Confirme que o proxy suporta o método de autenticação usado pelo Selenium (normalmente autenticação básica embutida na URL).
- Erros de certificado SSL: Se um proxy HTTPS fizer interceptação SSL, o navegador pode exibir avisos de certificado porque não confia no certificado gerado dinamicamente pelo proxy. As opções incluem:
- Desabilitar a validação de certificado (por exemplo,
--ignore-certificate-errorsno Chrome), mas isso é um risco de segurança e não é recomendado em produção. - Instalar o certificado raiz do proxy no armazenamento de confiança do navegador.
- Desabilitar a validação de certificado (por exemplo,
- Erros de timeout: O servidor proxy pode estar lento, sobrecarregado ou com problemas de rede. Aumente os tempos de espera implícitos ou explícitos do Selenium, ou teste com outro proxy.
- Peculiaridades de cada navegador: Embora a abordagem geral seja consistente, existem pequenas diferenças na forma como cada driver de navegador trata as configurações de proxy. Consulte a documentação específica do navegador se encontrar comportamentos inesperados.
Boas práticas
- Variáveis de ambiente para credenciais: Evite deixar nomes de usuário e senhas de proxy fixos no código do script. Em vez disso, obtenha-os de variáveis de ambiente ou de um sistema seguro de gerenciamento de configuração.
- Gerenciador de proxy dedicado: Para cenários complexos, como rotação de proxies, gerenciamento de grandes listas de proxies ou implementação de lógica avançada de proxy, considere usar uma biblioteca dedicada de gerenciamento de proxy ou o SDK de um serviço comercial de proxy.
- Tratamento de erros: Implemente blocos
try-catchrobustos para lidar de forma controlada com falhas de conexão ao proxy, erros de autenticação ou timeouts de rede. - Compatibilidade com modo headless: As configurações de proxy funcionam perfeitamente com os modos headless do navegador, o que é vantajoso para automação no lado do servidor.
