Neste tutorial, você aprenderá:
- Por que você precisa definir o cabeçalho agente de usuário
- O agente de usuário padrão do Python
requests
- Como alterar e cancelar a configuração do agente de usuário em Requests
- Como implementar a rotação do agente de usuário em Python
Vamos nos aprofundar!
Por que você deve sempre definir o cabeçalho agente de usuário
O cabeçalho HTTP User-Agent é definido por navegadores, aplicativos que executam solicitações da web e clientes HTTP para identificar o software cliente que está fazendo a solicitação. Esse valor normalmente inclui detalhes sobre o tipo de navegador ou aplicativo, sistema operacional e arquitetura de origem da solicitação.
Por exemplo, aqui está o agente de usuário definido pelo Chrome no momento em que este artigo foi escrito ao visitar páginas da web:
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 desse agente de usuário são:
Mozilla/5.0:
historicamente usado para indicar compatibilidade com os navegadores Mozilla. Agora é um prefixo comum adicionado aos agentes de usuário 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 usado pela versão do Chrome que fez a solicitação.KHTML, como o Gecko
: compatibilidade com o mecanismo KHTML e o mecanismo de layout Gecko usados pela Mozilla.
Chrome/125.0.0.0
: nome do navegador e sua versão.Safari/537.36
: compatibilidade com Safari.
Resumindo, o agente do usuário é crucial para identificar se uma solicitação se origina de um navegador conhecido ou de outro tipo de software.
Os bots de raspagem tendem a usar sequências de agentes de usuário padrão ou inconsistentes, revelando sua natureza automatizada. Consequentemente, as soluções anti-scraping protegem os dados em páginas da web examinando o cabeçalho User-Agent
para determinar se o usuário atual é legítimo ou um bot.
Para mais informações, leia nosso guia sobre agentes de usuário para web scraping.
Qual é o agente de usuário padrão em Requests do Python?
Como a maioria dos clientes HTTP, Requests define um cabeçalho User-Agent
ao fazer solicitações HTTP. Em particular, o agente de usuário padrão definido por requests
segue o formato abaixo:
python-requests/X.Y.Z
Onde X.Y.Z
é a versão do pacote requests
instalado no seu projeto.
Verifique se a string acima é realmente o agente de usuário Requests fazendo uma solicitação GET para o endpoint httpbin.io /user-agent
. Essa API retorna o cabeçalho User-Agent
lido da solicitação recebida. Em outros termos, permite que você verifique o agente do usuário definido automaticamente por um cliente HTTP.
Importe requests
e use seu método get() para realizar a solicitação HTTP desejada:
import requests
# make an HTTP GET request to the specified URL
response = requests.get('https://httpbin.io/user-agent')
# parse the API response as JSON and print it
print(response.json())
Execute o trecho de Python acima e você obterá algo assim:
{'user-agent': 'python-requests/2.32.3'}
O agente do usuário é python-requests/2.32.3
, que identifica claramente a solicitação como originária da biblioteca requests
. Como resultado, sistemas anti-bot podem marcar tal solicitação como não proveniente de um usuário humano e bloqueá-la imediatamente. É por isso que é tão crucial alterar o valor do agente de usuário Python Requests!
Para obter mais informações, confira nosso guia completo sobre a biblioteca Requests do Python.
Como alterar o agente de usuário de Requests do Python
Vamos ver como alterar e remover a definição do valor do cabeçalho User-Agent
em Requests!
Definir um agente de usuário personalizado
As solicitações não fornecem uma opção direta para definir o valor do agente de usuário. Ao mesmo tempo, User-Agent
nada mais é do que um cabeçalho HTTP. Portanto, você pode personalizar seu valor como qualquer outro cabeçalho HTTP usando a opção headers
conforme abaixo:
import requests
# custom user agent header
headers = {
'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'
}
# make an HTTP GET request to the specified URL
# setting custom headers
response = requests.get('https://httpbin.io/user-agent', headers=headers)
# parse the API response as JSON and print it
print(response.json())
Execute o trecho de Python acima de novo, e desta vez 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'}
Excelente! Você acabou de aprender que, para definir um agente de usuário personalizado em requests de Python, você precisa:
- Definir um dicionário Python com uma propriedade
user-agent
. - Passe o dicionário para o parâmetro
headers
do métodorequests
que você está usando para fazer a solicitação HTTP.
Não se esqueça de que os nomes dos cabeçalhos HTTP não diferenciam maiúsculas de minúsculas, então os nomes das propriedades no dicionário de cabeçalhos podem ter o formato que você preferir.
Nota: essa abordagem também funciona com request()
, post()
, patch()
, put()
, delete()
e head()
.
Para definir um agente de usuário global de requests
, você precisa configurar uma sessão HTTP personalizada da seguinte forma:
import requests
# initialize an HTTP session
session = requests.Session()
# set a custom header in the session
session.headers['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'
# perform a GET request within the HTTP session
response = session.get('https://httpbin.io/user-agent')
# print the data returned by the API
print(response.json())
# other requests with a custom user agent within the session ...
Isso produzirá a mesma saída de antes. Se você não estiver familiarizado com as sessões HTTP em Requests, confira a documentação.
Desativar o agente de usuário
Fazer solicitações HTTP sem definir o agente do usuário é uma prática ruim que pode acionar facilmente soluções anti-bot. No entanto, há situações em que talvez seja necessário remover o cabeçalho User-Agent
.
A primeira abordagem para remover o agente de usuário em Requests que você pode criar é definir o cabeçalho User-Agent
como None
:
import requests
# custom user agent header
headers = {
'user-agent': None
}
# make an HTTP GET request to the specified URL
# setting custom headers
response = requests.get('https://httpbin.io/user-agent', headers=headers)
# parse the API response as JSON and print it
print(response.json())
Isso não funcionará porque requests
usa urllib3
nos bastidores. Portanto, ele assumirá como padrão o valor do agente de usuário urllib3
:
python-urllib3/2.2.1
Em detalhes, o endpoint /user-agent
retornará algo como:
{'user-agent': 'python-urllib3/2.2.1'}
Em vez disso, o que você precisa fazer é configurar urllib3
para ignorar o valor padrão do agente de usuário usando urllib3.util.SKIP_HEADER
. Verifique se o agente do usuário foi desativado direcionando o endpoint /
headers
do httpbin.io, que retorna os cabeçalhos HTTP da solicitação recebida:
import requests
import urllib3
# exclude the default user agent value
headers = {
'user-agent': urllib3.util.SKIP_HEADER
}
# prepare the HTTP request to make
req = requests.Request('GET', 'https://httpbin.io/headers')
prepared_request = req.prepare()
# set the custom headers with no user agent
prepared_request.headers = headers
# create a requests session and perform
# the request
session = requests.Session()
response = session.send(prepared_request)
# print the returned data
print(response.json())
Execute o código Python acima e você receberá:
{'headers': {'Accept-Encoding': ['identity'], 'Host': ['httpbin.io']}}
Incrível! Como esperado, nenhum agente de usuário em requests do Python.
Implemente a rotação do agente de usuário nas solicitações
Alterar o cabeçalho padrão User-Agent
para um valor adequado de um navegador real pode não ser suficiente. Se você fizer muitas solicitações do mesmo endereço IP usando o mesmo agente de usuário, isso poderá gerar suspeitas por parte das tecnologias anti-bot. Esses sistemas monitoram todas as solicitações recebidas, sabendo que as solicitações automatizadas geralmente seguem padrões regulares.
A chave para evitar a detecção de bots é randomizar suas solicitações. Uma boa maneira de tornar cada solicitação diferente da outra é rotação do agente de usuário. A ideia por trás dessa técnica é continuar alterando o cabeçalho do agente do usuário usado pelo cliente HTTP. Dessa forma, você pode fazer com que suas solicitações automatizadas pareçam provenientes de navegadores diferentes, reduzindo o risco de acionar bloqueios ou banimentos temporários.
Agora, siga as etapas abaixo para implementar a rotação do agente do usuário em Requests!
Etapa #1: recuperar uma lista de agentes de usuário válidos
Reúna uma lista de agentes de usuário adequados de um site como User Agent String.com e armazene-a em um array Python:
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 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
# other user agents...
]
Etapa #2: extrair um agente de usuário aleatório
Extraia aleatoriamente uma string de agente de usuário do array usando random.choice()
:
random_user_agent = random.choice(user_agents)
Não esqueça que a linha acima requer a seguinte importação:
import random
Etapa #3: definir o agente de usuário aleatório e fazer a solicitação HTTP
Defina o dicionário de cabeçalho com o agente de usuário aleatório e use-o na solicitação requests
:
headers = {
'user-agent': random_user_agent
}
response = requests.get('https://httpbin.io/user-agent', headers=headers)
print(response.json())
Essas instruções exigem esta importação:
import requests
Step #4: juntar tudo
Esta é a aparência da lógica de rotação do agente de usuário do Python Requests:
import random
import requests
# list of user agents
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 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"
# other user agents...
]
# pick a random user agent from the list
random_user_agent = random.choice(user_agents)
# set the random user agent
headers = {
'user-agent': random_user_agent
}
# perform a GET request to the specified URL
# and print the response data
response = requests.get('https://httpbin.io/user-agent', headers=headers)
print(response.json())
Execute esse script algumas vezes e você obterá diferentes sequências de agentes de usuário.
E pronto! Agora você é mestre em definir os valores do agente de usuário no Requests do Python.
Conclusão
Neste guia, você aprendeu a importância de definir o cabeçalho User-Agent
e como fazer isso em requests
. Dessa forma, você pode fazer com que os sistemas anti-bot básicos pensem que suas solicitações vêm de navegadores legítimos. No entanto, soluções avançadas ainda podem detectar e bloquear você. Para evitar banimento de IP, você poderia usar um proxy com requests
, mas mesmo isso pode não ser suficiente!
Evite essas complicações com Web Scraper API. Essa API de extração de última geração fornece tudo o que você precisa para realizar solicitações automatizadas da web usando requests
ou qualquer outro cliente HTTP. Ela ignora facilmente as tecnologias anti-bot para você, contando com recursos como IP e rotação de agentes de usuário. Nunca foi tão fácil fazer solicitações automatizadas bem-sucedidas!
Converse com um de nossos especialistas em dados sobre nossas soluções de extração de dados ou simplesmente explore todos os produtos disponíveis registrando-se agora. Testes gratuitos disponíveis!
Não é necessário cartão de crédito