Se você está escolhendo entre Selenium e Playwright para um trabalho que roda através de proxies residenciais, ou mantendo os dois, o mais útil não são dois guias de configuração separados, mas a comparação: o que é idêntico, o que é genuinamente diferente e quais dessas diferenças devem influenciar a forma como você constrói. Aqui está o mesmo trabalho feito em cada um, lado a lado.
Para o detalhe mais aprofundado de cada framework, incluindo os casos extremos que cada um tem, veja proxies residenciais no Selenium e proxies residenciais com Playwright. Esta é a camada de comparação acima disso.
O que é idêntico: o gateway
Os dois frameworks falam com o mesmo endpoint com as mesmas credenciais, porque o proxy não se importa com o que está por trás do controle. Host p.shifter.io, porta 443, e todo o seu direcionamento (targeting) codificado no nome de usuário:
customer-USERNAME # rotate, no geo
customer-USERNAME-country-de # German exit
customer-USERNAME-country-us-city-new_york # city level
customer-USERNAME-country-de-sid-abc123-ttl-600 # sticky, ten minutes
Isso significa que toda decisão sobre geografia, rotação e duração de sessão é uma string, idêntica nos dois frameworks. Nada nas seções abaixo muda o gateway, apenas a forma como cada framework entrega suas credenciais a ele. A referência de formato está em como conectar.
A única diferença real: autenticação
Esta é a diferença que importa, e ela explica a maior parte do atrito que as pessoas encontram.
O Playwright oferece suporte nativo a proxies autenticados. Nome de usuário e senha são opções de primeira classe, então funciona pronto de fábrica.
O Selenium não. Ele consegue definir um host e uma porta de proxy, mas a especificação do WebDriver não tem mecanismo para passar credenciais, então o Chrome exibe uma caixa de diálogo de autenticação nativa que seu script não consegue dispensar. Toda solução no Selenium é uma forma de contornar essa lacuna, e existem três: Selenium Wire, que cuida das credenciais para você; uma pequena extensão do Chrome gerada que as fornece; ou CDP, controlando diretamente o protocolo de depuração do navegador.
Se você está começando do zero e seu trabalho precisa de proxies autenticados, essa diferença sozinha já é um motivo legítimo para preferir o Playwright.
A mesma configuração nos dois
Playwright, Python:
from playwright.sync_api import sync_playwright
USER = "customer-USERNAME-country-de-sid-abc123-ttl-600"
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context(
proxy={"server": "http://p.shifter.io:443",
"username": USER, "password": "PASSWORD"},
locale="de-DE", timezone_id="Europe/Berlin", # match the exit
)
page = context.new_page()
page.goto("https://ipinfo.io/json")
print(page.inner_text("body"))
Playwright, Node:
const ctx = await browser.newContext({
proxy: { server: 'http://p.shifter.io:443',
username: 'customer-USERNAME-country-de-sid-abc123-ttl-600',
password: 'PASSWORD' },
locale: 'de-DE', timezoneId: 'Europe/Berlin',
});
Selenium, Python, usando Selenium Wire:
from seleniumwire import webdriver
USER = "customer-USERNAME-country-de-sid-abc123-ttl-600"
proxy_url = f"http://{USER}:PASSWORD@p.shifter.io:443"
opts = {"proxy": {"http": proxy_url, "https": proxy_url,
"no_proxy": "localhost,127.0.0.1"}}
driver = webdriver.Chrome(seleniumwire_options=opts)
driver.get("https://ipinfo.io/json")
print(driver.find_element("tag name", "body").text)
Mesmo gateway, mesmo nome de usuário, mesmo resultado. A única diferença é como as credenciais entram.
A diferença estrutural: como você isola identidades
Esta é a que realmente deveria moldar seu design, e ela decorre de quão caro é manter uma identidade isolada em cada framework.
No Playwright, os contexts são baratos. Um browser context é um perfil isolado com seus próprios cookies, armazenamento e, o mais importante, seu próprio proxy. Você pode rodar um único processo de navegador e criar um context por identidade, o que faz da rotação de geografia ou de sessões uma questão de criar um novo context em vez de um novo navegador.
browser = p.chromium.launch() # one process
for country in ["de", "fr", "us"]:
ctx = browser.new_context(proxy={"server": "http://p.shifter.io:443",
"username": f"customer-USERNAME-country-{country}",
"password": "PASSWORD"})
page = ctx.new_page()
page.goto("https://example.com")
ctx.close() # identity discarded, process stays
No Selenium, o proxy está vinculado ao driver. Mudá-lo geralmente significa um novo driver, e um driver é um processo de navegador inteiro: lento para iniciar e pesado em memória. Então o padrão do Selenium é o oposto, reutilizar um driver para muitas requisições em uma identidade, e tratar uma troca de identidade como uma operação cara que você agrupa em lote em vez de fazer a cada requisição.
A consequência prática: um trabalho que precisa de muitas identidades de curta duração é marcadamente mais barato no Playwright, enquanto um trabalho que mantém uma identidade por uma longa sequência serve para qualquer um dos dois. Se você está rodando Selenium e se pega iniciando um driver por requisição, isso é o que deve ser corrigido primeiro, não a configuração do proxy.
Geo, rotação e sessões
Como o direcionamento está no nome de usuário, essa parte é independente do framework. Omita sid e cada nova conexão recebe uma saída nova; inclua um e o mesmo endereço é mantido até o TTL expirar. No Playwright você define esse escopo por context; no Selenium você define esse escopo por driver.
Uma coisa para acertar nos dois: quando você define um país, defina o locale e o fuso horário do navegador para corresponder a ele. Uma saída alemã reportando um fuso horário de Nova York é uma contradição fácil de detectar e fácil de evitar, e ambos os frameworks expõem isso como opções de context, conforme combinando geo, fuso horário e locale.
Banda: o custo que os dois frameworks compartilham
Navegadores são caros num produto cobrado por GB porque eles buscam tudo o que um navegador real buscaria: imagens, fontes, mídia, analytics. Bloquear o que você não precisa é a maior economia disponível, e ambos os frameworks oferecem suporte a isso.
Playwright:
context.route("**/*", lambda route: route.abort()
if route.request.resource_type in {"image", "media", "font", "stylesheet"}
else route.continue_())
O Selenium não tem um equivalente de uma linha só na forma nativa; com o Selenium Wire você pode filtrar requisições, ou pode bloquear tipos de recurso via CDP. De qualquer forma vale a pena fazer, já que isso comumente reduz o peso da página por um múltiplo grande. O argumento mais amplo, incluindo se você precisa de um navegador de fato, está em quando você precisa de um navegador headless e reduzindo custos de banda de proxy.
Verificando se funciona, nos dois
Não presuma que o proxy está sendo aplicado. Navegue até um endpoint que reporte o endereço e verifique se ele não é o seu:
# Playwright
page.goto("https://ipinfo.io/json"); print(page.inner_text("body"))
# Selenium
driver.get("https://ipinfo.io/json"); print(driver.find_element("tag name", "body").text)
Se o endereço for o seu próprio, o proxy não está sendo aplicado de forma alguma. Se estiver correto, mas o conteúdo estiver errado para a região, suspeite de DNS ou de uma incompatibilidade de locale antes de culpar o pool, conforme prevenindo vazamentos de DNS.
Qual escolher
Se você não tem nenhum compromisso já existente e seu trabalho envolve proxies autenticados e muitas identidades, o Playwright é o caminho mais fácil: suporte nativo a credenciais e isolamento barato por context eliminam dois problemas que você teria de projetar contornos para resolver.
O Selenium continua sendo uma escolha razoável quando você já tem um ecossistema Selenium estabelecido, quando precisa do seu grid e do ecossistema multi-navegador, ou quando o trabalho é uma sessão longa em vez de muitas curtas. O suporte a proxy é totalmente viável, só custa uma biblioteca ou uma pequena extensão para colocar as credenciais.
E em ambos os casos, lembre-se de que o navegador é só metade de não ser bloqueado: o endereço te leva até a porta, e cabeçalhos, fingerprint e ritmo decidem o que acontece depois, conforme evitando bloqueios.
Conclusão
O gateway é idêntico para os dois frameworks, então geografia, rotação e duração de sessão são a mesma string em cada um. A diferença real é a autenticação, que o Playwright oferece nativamente e o Selenium não, exigindo Selenium Wire, uma extensão ou CDP. A diferença que deveria moldar sua arquitetura é o custo de isolamento: contexts do Playwright são baratos, então você rotaciona a identidade por context, enquanto um proxy no Selenium está vinculado a um driver, então você reutiliza drivers e agrupa mudanças de identidade em lote. Combine locale e fuso horário com a saída nos dois, bloqueie recursos desnecessários nos dois porque você paga por gigabyte, e verifique o endereço de saída antes de confiar em qualquer coisa.
Os dois rodam sobre os mesmos proxies residenciais, um gateway com direcionamento por país e cidade e sessões sticky quando um fluxo precisa de uma, cobrado por GB, de modo que o bloqueio de recursos acima se traduz diretamente numa conta menor.