Proxy com SeleniumBase: autenticação e rotação

Publicado:

2 min de leitura

Acar Diveroli
Autor: Acar Diveroli
Proxy com SeleniumBase

O SeleniumBase é um framework de testes construído em cima do Selenium e aceita proxies com credenciais. É exatamente o que o Selenium sozinho não consegue, e por isso o desvio compensa em qualquer trabalho de scraping.

O problema dos proxies no Selenium

O Selenium consegue definir um proxy, mas não se autenticar nele: o Chrome ignora usuário e senha no argumento --proxy-server e abre no lugar uma janela de login que o WebDriver não consegue preencher. A ferramenta que antes cobria essa lacuna, o SeleniumWire, está sem manutenção há bastante tempo e não é mais recomendada.

Primeiros passos

Instalação

bash
pip install seleniumbase

Um caso de teste

O teste abaixo pede a informação em JSON do IPinfo e escreve o resultado no console: assim você vê na hora qual endereço aparece para fora.

python
from seleniumbase import BaseCase
from selenium.webdriver.common.by import By
import json

class ProxyTest(BaseCase):
    def test_proxy(self):
        # Abrir a página
        self.driver.get("https://ipinfo.io/json")

        # Ler a resposta JSON
        location_info = json.loads(self.driver.find_element(By.TAG_NAME, "body").text)

        # Imprimir o conteúdo
        for k, v in location_info.items():
            print(f"{k}: {v}")

Executar o teste

A execução é feita com o pytest.

Sem proxy

bash
pytest proxy_test.py -s

No console aparecem o seu próprio IP e a sua localização.

Com proxy

bash
pytest proxy_test.py --proxy=USUARIO:SENHA@pr.proxynet.io:8000 -s

Usuário, senha, nome de host e porta estão no seu painel da Proxynet. A saída fica parecida com esta:

=================================== test session starts ===================================
platform linux -- Python 3.10.12, pytest-8.3.4, pluggy-1.5.0
plugins: seleniumbase-4.34.6, rerunfailures-15.0, xdist-3.6.1
collected 1 item

proxy_test.py ip: 144.202.4.246
hostname: 144-202-4-246.pxnet.io
city: Piscataway
region: New Jersey
country: US
timezone: America/New_York
.

==================================== 1 passed in 3.25s ====================================

O endereço mudou e nenhuma janela de login apareceu — é esse o objetivo todo.

Rotacionar proxies

Com o que o Python já traz você monta uma rotação simples. O script a seguir roda o mesmo teste uma vez por país:

python
import subprocess

USER = "USUARIO"
PASSWORD = "SENHA"

# Países de onde a requisição deve sair
countries = ["us", "br", "gb", "tr"]

for country in countries:
    # Na Proxynet o país de destino vai dentro do nome de usuário
    proxy = f"{USER}-country-{country}:{PASSWORD}@pr.proxynet.io:8000"
    subprocess.run(f"pytest proxy_test.py --proxy={proxy} -s", shell=True)

A forma exata de indicar o país está no seu painel e muda conforme o produto. Como resolver a mesma coisa dentro de um script, em vez de pela linha de comando, explicamos em Como rotacionar proxies em Python.

Conclusão

Com o SeleniumBase, um teste do Selenium sai por um proxy com autenticação, confere a localização visível e a troca entre execuções: três coisas que, só com o Selenium, dão bem mais trabalho.

Quais dos nossos produtos de proxy servem para isso: