🥳Junte-se à Comunidade Scrapeless e Solicite sua avaliação gratuita para acessar nosso poderoso kit de ferramentas de Web Scraping!
Voltar 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 Scrapeless, acessamos apenas dados disponíveis publicamente, cumprindo rigorosamente 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 quaisquer atividades ilegais ou infratoras. Não oferecemos garantias e nos isentamos de qualquer responsabilidade pelo uso de informações deste blog ou de links de terceiros. Antes de se envolver em qualquer atividade de scraping, 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