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

Pare de ser bloqueado por sistemas anti-bot! Este tutorial ensina você a definir e alternar o cabeçalho User-Agent nas em Python Requests para uma extração segura e bem-sucedida de dados da web.
10 min read
Requests User Agent Guide blog image

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.
  1. Chrome/125.0.0.0: nome do navegador e sua versão.
  2. 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:

  1. Definir um dicionário Python com uma propriedade user-agent.
  2. Passe o dicionário para o parâmetro headers do método requests 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