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