Guia do agente de usuário do Selenium: configuração e alteração

Aprenda a definir e rotacionar o cabeçalho User-Agent no Selenium para aprimorar seus recursos de web scraping e ignorar as medidas anti-bot.
12 min read
Selenium User Agent Guide Setting and Changing

Neste tutorial, você aprenderá:

  • Por que o cabeçalho User-Agent é tão importante
  • O valor padrão do agente de usuário Selenium em navegadores com cabeçalho e sem cabeçalho
  • Como alterar o agente do usuário no Selenium
  • Como implementar a rotação do agente de usuário no Selenium

Vamos nos aprofundar!  

Por que o cabeçalho agente do usuário é importante?

O cabeçalho User-Agent é uma string que identifica o software cliente que está fazendo a solicitação HTTP. Geralmente, inclui informações sobre o tipo de navegador ou aplicativo, sistema operacional e arquitetura de onde a solicitação vem. Isso geralmente é definido por navegadores, clientes HTTP ou qualquer outro aplicativo que executa solicitações da web.

Por exemplo, abaixo está o agente de usuário definido pelo Chrome no momento em que este artigo foi escrito:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36

Os componentes dessa string de agente de usuário são:

  • Mozilla/5.0: historicamente usado para indicar compatibilidade com os navegadores Mozilla. Agora representa um prefixo adicionado por motivos de compatibilidade.
  • Windows NT 10.0; Win64; x64: sistema operacional (Windows NT 10.0), plataforma (Win64) e arquitetura (x64).
  • AppleWebkit/537.36: mecanismo de navegação no qual o Chrome confia.
  • KHTML, como o Gecko: compatibilidade com o mecanismo KHTML e o mecanismo de layout Gecko usados pela Mozilla.
  • Chrome/125.0.0.0: nome e versão do navegador.
  • Safari/537.36: compatibilidade com Safari.

Simplificando, o agente de usuário identifica se a solicitação vem de um navegador conhecido ou de outro tipo de software.

Os bots de raspagem e os scripts de automação do navegador tendem a usar strings de agente de usuário padrão ou inconsistentes. Eles revelam sua natureza automatizada aos olhos das soluções anti-scraping, que protegem os dados da página da web monitorando as solicitações recebidas. Ao examinar o cabeçalho User-Agent, eles podem determinar se o usuário atual é legítimo ou um bot.

Para obter mais informações, leia nosso guia sobre agentes de usuário para web scraping

Qual é o agente de usuário padrão do Selenium?

O cabeçalho User-Agent definido pelo Selenium ao fazer a solicitação HTTP GET para recuperar uma página da web depende do navegador sob controle e se ele está no modo com ou sem interface. 

Nota: neste artigo, usaremos o Selenium em Python e o configuraremos para operar no Chrome. No entanto, você pode facilmente estender o que aprenderá aqui para diferentes linguagens de programação e navegadores.

Para ver a string do agente de usuário Selenium, crie um script básico de automação de navegador que visite a página httpbin.io /user-agent. Isso nada mais é do que uma API que retorna o cabeçalho User-Agent da solicitação recebida.

Importe selenium, inicialize uma instância do Chrome, visite a página desejada e gere seu conteúdo:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

# enable headless mode in Selenium

options = Options()

# options.add_argument('--headless')

# initialize a Chrome instance

driver = webdriver.Chrome(

    options=options,

)

# visit the desired page

driver.get("https://httpbin.org/user-agent")

# get the page content

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

# print the page content

print(user_agent_info)

# close the browser

driver.quit()

Inicie o script Python acima e ele fará o login no terminal da seguinte forma:

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

}

O valor corresponde ao cabeçalho User-Agent definido pelo Chrome no momento da escrita. Isso não deve surpreender você, pois o Selenium opera em uma janela real do navegador.

Ao mesmo tempo, o Selenium normalmente é configurado para controlar instâncias de navegador sem interface. O motivo é que carregar a interface de usuário de um navegador exige muitos recursos e não traz nenhum benefício na produção. Então, descomente a opção --headless para executar o script no modo headless. Desta vez, o resultado será:

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/125.0.6422.142 Safari/537.36"

}

Como você pode ver, Chrome/125.0.0.0 foi substituído por HeadlessChrome/125.0.6422.142. Esse valor identifica claramente a solicitação como proveniente de uma ferramenta de automação de navegador, já que nenhum usuário humano jamais usaria um navegador sem interface. A consequência é que sistemas anti-bot podem marcar tal solicitação como proveniente de um bot e bloqueá-la. É por isso que é tão crucial definir o valor do agente de usuário Selenium!

Descubra mais informações no nosso guia web scraping com Selenium.

Como alterar o agente de usuário no Selenium

O Selenium oferece duas maneiras de definir o valor do agente de usuário. Vamos nos aprofundar nos dois!

Defina o agente de usuário globalmente

Entre as opções suportadas pelo Chrome, há também o sinalizador --user-agent. Isso permite que você especifique o agente de usuário global que o processo do Chrome deve usar ao visitar páginas da web em suas guias ou janelas.

Defina um agente de usuário global no Selenium com Python conforme abaixo:

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

options = Options()

# set a custom user agent in the browser option

options.add_argument(f'--user-agent={custom_user_agent}')

# other options...

# initialize a Chrome instance with a custom user agent

driver = webdriver.Chrome(

    options=options,

)

Junte tudo e verifique se funciona com o seguinte script:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

options = Options()

# set a custom user agent in the browser option

options.add_argument(f'--user-agent={custom_user_agent}')

# enable headless mode

options.add_argument('--headless')

# initialize a headless Chrome instance with a custom user agent

driver = webdriver.Chrome(

    options=options,

)

# visit the desired page

driver.get("https://httpbin.org/user-agent")

# get the page content

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

# print the page content

print(user_agent_info)

# close the browser

driver.quit()

Agora, inicie o script e ele gerará:

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

}

Isso corresponde ao agente de usuário especificado na string custom_user_agent. Em particular, o navegador controlado pelo Selenium agora expõe o valor do agente de usuário de um navegador direcionado, mesmo que esteja no modo sem interface. Esse truque deve ser suficiente para enganar soluções anti-bot menos complexas.

A principal desvantagem dessa abordagem é que você só pode definir o sinalizador --user-agent uma vez, durante a configuração da instância do navegador. Uma vez especificado, o agente de usuário personalizado será usado em toda a sessão de navegação, sem a possibilidade de alterá-lo rapidamente antes de uma chamada get().

Defina o agente de usuário localmente

Os comandos do Chrome Devtools Protocol  (CDP) permitem que você se comunique com um navegador Chrome em execução. Em particular, eles oferecem a capacidade de alterar dinamicamente os valores padrão e as configurações definidas pelo navegador.

Você pode executar um comando CDP no Selenium usando o método execute_cdp_cmd() exposto pelo objeto driver. Especificamente, o comando CDP Network.setUserAgentOverride substitui o agente do usuário pela string fornecida. Use-o para alterar localmente o agente de usuário no Selenium conforme abaixo:

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': custom_user_agent})

Verifique se essa abordagem permite que você atualize o agente de usuário várias vezes na mesma sessão de navegação com a seguinte lógica:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

options = Options()

# enable headless mode

options.add_argument('--headless')

# initialize a headless Chrome instance

driver = webdriver.Chrome(

    options=options,

)

# configure a custom user agent

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': custom_user_agent})

# visit the desired page

driver.get("https://httpbin.org/user-agent")

# get the page content and print it

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

print(user_agent_info)

# set another user agent

custom_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': custom_user_agent})

# reload the page

driver.refresh()

# print the page content

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

print(user_agent_info)

# close the browser

driver.quit()

Inicie o script acima e ele produzirá:

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

}

{

  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"

}

Formidável! Duas sequências de caracteres diferentes do agente de usuário Selenium na mesma sessão de navegação.

Implemente a rotação do agente de usuário no Selenium

Definir um cabeçalho User-Agent com interface pode não ser suficiente para superar os anti-bots. O problema é que muitas solicitações vindas do mesmo endereço IP e com os mesmos cabeçalhos provavelmente revelarão a natureza automatizada do seu script Selenium. 

A chave para evitar a detecção de bots é randomizar suas solicitações, por exemplo, implementando rotação de agentes de usuário. A ideia por trás dessa abordagem é escolher aleatoriamente um agente de usuário antes de navegar para uma página no Selenium. Dessa forma, suas solicitações automatizadas aparecerão como provenientes de navegadores diferentes, reduzindo o risco de acionar bloqueios e banimentos.

Agora, siga as etapas abaixo e saiba como implementar a rotação do agente de usuário no Selenium!

Etapa #1: recuperar uma lista de agentes de usuário

Obtenha alguns agentes de usuário adequados de um portal como User Agent String.com e armazene-os em um array Python da seguinte forma:

user_agents = [

    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15"

    # other user agents...

]

Etapa #2: extrair um agente de usuário aleatório

Defina uma função personalizada para definir o agente de usuário aleatório no objeto do driver web Selenium:

def set_user_agent(driver):

    # set the user agent...

Importe o pacote random da Python Standard Library para se preparar para escolher aleatoriamente um agente de usuário da lista user_agents:

import random

Use a função random.choice() para extrair aleatoriamente uma string de agente de usuário do array:

random_user_agent = random.choice(user_agents)

Em seguida, atribua-o à janela do Chrome com a função execute_cdp_cmd():

driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': random_user_agent})

Sua função set_user_agent() agora conterá:

def set_user_agent(driver):

    # randmoly pick a user agent string from the list

    random_user_agent = random.choice(user_agents)

    # set the user agent in the driver

    driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': random_user_agent})

Etapa #3: definir o agente de usuário aleatório

Antes de navegar para uma página com get(), chame a função set_user_agent() para alterar o agente de usuário Selenium:

# set a custom user agent

set_user_agent(driver)

# visit the desired page

driver.get("https://httpbin.org/user-agent")

Step #4: juntar tudo 

Esta é a aparência do seu script de rotação do agente de usuário do Python Selenium:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

import random

user_agents = [

    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14.5; rv:126.0) Gecko/20100101 Firefox/126.0",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15"

]

def set_user_agent(driver):

    # randmoly pick a user agent string from the list

    random_user_agent = random.choice(user_agents)

    # set the user agent in the driver

    driver.execute_cdp_cmd('Network.setUserAgentOverride', {'userAgent': random_user_agent})

options = Options()

# enable headless mode

options.add_argument('--headless')

# initialize a headless Chrome instance

driver = webdriver.Chrome(

    options=options,

)

# set a custom user agent

set_user_agent(driver)

# visit the desired page

driver.get("https://httpbin.org/user-agent")

# get the page content and print it

user_agent_info = driver.find_element(By.TAG_NAME, "body").text

print(user_agent_info)

# close the browser

driver.quit()

Execute esse script algumas vezes e observe que ele gerará diferentes strings do agente de usuário.

E pronto! Agora você é mestre em mudar o agente de usuário no Selenium.

Conclusão

Neste guia, você aprendeu a importância do cabeçalho User-Agent e como substituí-lo no Selenium. Essa técnica permite que você engane os sistemas anti-bot básicos, fazendo-os pensar que suas solicitações vêm de um navegador legítimo e com interface. No entanto, soluções avançadas ainda podem detectar e bloquear você. Para evitar banimento de IP, você poderia usar um proxy com Selenium, mas mesmo isso pode não ser suficiente!

Evite esses problemas com o Scraping Browser, um navegador de última geração que se integra ao Selenium e a qualquer outra ferramenta de automação de navegador. O Scraping Browser pode facilmente ignorar as tecnologias anti-bot para você, evitando a impressão digital do navegador. Nos bastidores, ele se baseia em recursos como rotação do agente de usuário, rotação de IPe resolução de CAPTCHA. A automação do navegador nunca foi tão fácil!

Não é necessário cartão de crédito