🎯 Um navegador em nuvem personalizável e anti-detecção alimentado por Chromium desenvolvido internamente, projetado para rastreadores web e agentes de IA. 👉Experimente agora
De volta ao blog

Usando um Proxy no Python com Selenium

James Thompson
James Thompson

Scraping and Proxy Management Expert

12-Sep-2024

Você foi identificado como um bot usando Selenium para web scraping?

Compreensível. Embora o Selenium seja uma ótima ferramenta para raspar páginas da web dinâmicas, ele não consegue funcionar contra defesas anti-bot sofisticadas por conta própria. Você pode adicionar um proxy ao seu raspador Selenium para controlar as limitações de taxa, evitar restrições geográficas e evitar bloqueios de IP.

Selenium Proxy: O que é?

Um proxy serve como um intermediário entre um cliente e um servidor. Ao usá-lo, o cliente contorna as limitações geográficas e envia solicitações anônimas e seguras para outros servidores.

Os servidores proxy podem ser usados por navegadores sem cabeça da mesma forma que os clientes HTTP. Ao acessar sites, um proxy Selenium ajuda a proteger seu endereço IP e contornar bloqueios.

O Selenium com suporte a proxy é muito útil para tarefas de automação do navegador, como raspar sites e testes. Para saber como configurar um proxy no Selenium para web scraping, continue lendo!

Como configurar um proxy Selenium

A linha de código a seguir carrega um driver Chrome sem cabeça e navega para httpbin, um site que fornece o endereço IP do cliente. O script imprime a resposta HTML no final.

language Copy
# pip install selenium webdriver-manager
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options

# definir opções do Chrome para executar no modo sem cabeça
options = Options()
options.add_argument("--headless=new")

# inicializar o driver Chrome
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()), 
    options=options
)

# navegar para a página da web de destino
driver.get("https://httpbin.io/ip")

# imprimir o HTML da página da web de destino
print(driver.page_source)

# liberar os recursos e fechar o navegador
driver.quit()

O código imprimirá o seguinte HTML:

language Copy
<html><head><meta name="color-scheme" content="light dark"><meta charset="utf-8"></head><body><pre>{
  "origin": "50.217.226.40:80"
}
</pre><div class="json-formatter-container"></div></body></html>

No Selenium, para definir um proxy, você deve:

  • Obter um servidor proxy confiável
  • Entrar no campo --proxy-server da opção Chrome
  • Vá para a página que você deseja visitar.

Primeiro, visite o site Free Proxy List para obter um endereço de proxy gratuito. Configure o Selenium com Opções para que um proxy seja usado para abrir o Chrome. Imprima o texto do corpo da página de destino depois disso.

language Copy
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

# definir o endereço e a porta do proxy
proxy = "20.235.159.154:80"

# definir opções do Chrome para executar no modo sem cabeça usando um proxy
options = Options()
options.add_argument("--headless=new")
options.add_argument(f"--proxy-server={proxy}")

# inicializar o driver Chrome
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    options=options
)

# navegar para a página da web de destino
driver.get("https://httpbin.io/ip")

# imprimir o conteúdo do corpo da página da web de destino
print(driver.find_element(By.TAG_NAME, "body").text)

# liberar os recursos e fechar o navegador
driver.quit()

Agora, todas as solicitações feitas pela instância controlada do Chrome serão roteados por meio do proxy designado.

O IP do servidor proxy e a resposta do site coincidem. Isso indica que o Selenium está usando o servidor proxy para ver sites.

Autenticação de proxy no Selenium

Alguns servidores proxy utilizam autenticação para impedir que usuários sem credenciais legítimas acessem seus servidores. Esse é geralmente o caso ao usar proxies premium ou soluções comerciais.

A sintaxe Selenium a seguir é para fornecer um nome de usuário e senha em um URL de proxy autenticado:

language Copy
<PROXY_PROTOCOL>://<YOUR_USERNAME>:<YOUR_PASSWORD>@<PROXY_IP_ADDRESS>:<PROXY_PORT>

No entanto, como o driver Chrome ignora o nome de usuário e senha por padrão, inserir um URL em --proxy-server não funcionará. Um plugin de terceiros como Selenium Wire pode ajudar nessa situação.

Com a ajuda do Selenium Wire, você pode modificar as solicitações do navegador da maneira que desejar e ter acesso às próprias solicitações. Para instalá-lo, use o comando mostrado abaixo:

language Copy
pip install blinker==1.7.0 selenium-wire

Para lidar com a autenticação de proxy, use Selenium Wire, como demonstrado abaixo:

language Copy
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

# configurar o proxy
proxy_username = "<YOUR_USERNAME>"
proxy_password = "<YOUR_PASSWORD>"
proxy_address = "20.235.159.154"
proxy_port = "80"

# formular o URL do proxy com autenticação
proxy_url = f"http://{proxy_username}:{proxy_password}@{proxy_address}:{proxy_port}"

# define as opções do selenium-wire para usar o proxy
seleniumwire_options = {
    "proxy": {
        "http": proxy_url,
        "https": proxy_url
    },
}

# define as opções do Chrome para rodar em modo headless
options = Options()
options.add_argument("--headless=new")

# inicializa o driver do Chrome com o serviço, as opções do selenium-wire e as opções do Chrome
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    seleniumwire_options=seleniumwire_options,
    options=options
)

# navega para a página da web alvo
driver.get("https://httpbin.io/ip")

# imprime o conteúdo do corpo da página da web alvo
print(driver.find_element(By.TAG_NAME, "body").text)

# libera os recursos e fecha o navegador
driver.quit()

Está cansado de bloqueios contínuos de scraping da web?

Scrapeless: a melhor solução de scraping online tudo-em-um disponível!

Mantenha o anonimato e evite banimentos baseados em IP com nossa rotação inteligente de proxy de alto desempenho:

Experimente grátis!

Os melhores protocolos de proxy de selénio

As alternativas mais populares para a seleção de um protocolo para um proxy de Selénio são HTTP, HTTPS e SOCKS5.

Os proxies HTTPS acrescentam um grau de segurança adicional, encriptando os dados que transferem pela Internet, em contraste com as proxies HTTP. Este último é, portanto, mais favorecido e seguro.

SoCKS5, ou SOCKS, é outro protocolo útil para os proxies Selenium. É um protocolo mais flexível, pois pode lidar com uma maior variedade de tráfego online, como protocolos de e-mail e transferência de ficheiros.

Todas as coisas consideradas, a raspagem web e o rastreio beneficiam muito dos proxies HTTP e HTTPS, enquanto as funções de tráfego não HTTP são adequadas para SOCKS.

Utilize um proxy rotativo em Python para o Selénio

Se o seu script enviar várias consultas num pequeno período de tempo, o servidor poderá sinalizar-a como suspeito e proibir o seu IP. Tem menos sucesso raspar dados quando tenta utilizar endereços IP específicos, uma vez que os sites podem identificar e bloquear os pedidos desses endereços.

No entanto, esta questão pode ser resolvida empregando uma estratégia de procuração rotativa. Após um determinado período de tempo ou pedidos, o seu IP final irá alterar-se continuamente como resultado da mudança de proxies. Isto impede que seja banido pelo servidor, fazendo com que pareça um utilizador distinto de cada vez.

Vejamos como utilizar o fio selénio para criar um rotador de proxy em Selenium.

É necessário primeiro estabelecer um pool de proxy. Faremos uso de vários proxies gratuitos neste exemplo.

Como se segue, coloque-os num array:

language Copy
PROXIES = [
    "http://19.151.94.248:88",
    "http://149.169.197.151:80",
    # ...
    "http://212.76.118.242:97"
]

Em seguida, utilize aleatório.choice() para extrair um proxy aleatório, que pode utilizar para iniciar uma nova instância do driver. É assim que o seu código final deve aparecer:

language Copy
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

import random

# a lista de proxy para rotacionar
PROXIES = [
    "http://20.235.159.154:80",
    "http://149.169.197.151:80",
    # ...
    "http://212.76.118.242:97"
]

# selecione um proxy aleatório
proxy = random.choice(PROXIES)

# define as opções do selenium-wire para usar o proxy
seleniumwire_options = {
    "proxy": {
        "http": proxy,
        "https": proxy
    },
}

# define as opções do Chrome para rodar em modo headless
options = Options()
options.add_argument("--headless=new")

# inicializa o driver do Chrome com o serviço, as opções do selenium-wire e as opções do Chrome
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    seleniumwire_options=seleniumwire_options,
    options=options
)

# navega para a página da web alvo
driver.get("https://httpbin.io/ip")

# imprime o conteúdo do corpo da página da web alvo
print(driver.find_element(By.TAG_NAME, "body").text)

# libera os recursos e fecha o navegador
driver.quit()

Na verdade, a utilização de proxies livres resultará normalmente no bloqueio. Embora os tenhamos utilizado para ilustrar os fundamentos, nunca deve depender deles para um projeto prático.

Erro de Selenium Grid 403: Proxy é proibido

A execução paralela dos scripts cruzados e do controlo remoto do navegador é possível utilizando o Selenium Grid. No entanto, se o utilizar, pode receber um dos problemas mais frequentes durante a raspagem da web: Erro 403: Peguei para Proxy. Existem duas razões pelas quais isso ocorre:

  • A porta 4444 já está em uso por outro processo.
  • O URL certo não está a ser recebido pelos seus pedidos de RemoteWebDriver.
    Certifique-se de que está a ligar o driver remoto ao URL do hub correto, conforme indicado abaixo, se não resolver o problema:
language Copy
import selenium.webdriver as webdriver
# ...
webdriver.Remote('http://localhost:4444/wd/hub', {})

Conclusão

Servidores proxy podem ajudar a contornar sistemas de detecção anti-bot, mas precisam de muita manutenção humana e nem sempre são confiáveis. Use uma API de web scraping, como Scrapeless, para contornar de forma confiável quaisquer medidas anti-bot e poupe-se do trabalho de localizar e configurar proxies. Obtenha uma versão de teste gratuita do Scrapeless!

Na Scorretless, acessamos apenas dados disponíveis ao público, enquanto cumprem estritamente as leis, regulamentos e políticas de privacidade do site aplicáveis. O conteúdo deste blog é apenas para fins de demonstração e não envolve atividades ilegais ou infratoras. Não temos garantias e negamos toda a responsabilidade pelo uso de informações deste blog ou links de terceiros. Antes de se envolver em qualquer atividade de raspagem, consulte seu consultor jurídico e revise os termos de serviço do site de destino ou obtenha as permissões necessárias.

Artigos mais populares

Catálogo