A biblioteca Requests é a ferramenta mais popular do Python para trabalhar com protocolos HTTP. Se você precisa consumir APIs, fazer web scraping, baixar arquivos ou integrar sistemas, o Requests é a escolha ideal pela sua simplicidade e poder.
Neste guia completo, você vai aprender desde a instalação até técnicas avançadas como autenticação, sessões persistentes e tratamento de erros. Ao final, terá domínio completo para trabalhar com qualquer tipo de requisição HTTP em Python.
📦 Instalação e Configuração
O Requests não vem incluso na biblioteca padrão do Python, então você precisa instalá-lo via pip. A instalação é extremamente simples:
# Instalando via pip
pip install requests
Ou usando pip3 em sistemas Linux/Mac
pip3 install requests
Para verificar se a instalação foi bem-sucedida, você pode importar o módulo e verificar sua versão:
import requests
print(requests.version)
A biblioteca é mantida pela comunidade Python e possui excelente documentação oficial. Você pode consultar a documentação completa em requests.readthedocs.io.
🌐 Fazendo sua Primeira Requisição GET
A requisição GET é o método mais básico e comum para retrieving dados de um servidor. Com o Requests, fazer uma requisição GET é incrivelmente simples:
import requests
Requisição GET simples
response = requests.get("https://api.github.com")
Verificando o status da resposta
print(f"Status Code: {response.status_code}")
print(f"Reason: {response.reason}")
Visualizando o conteúdo (texto)
print(response.text[:500])
O objeto response contém diversas informações sobre a resposta do servidor:
status_code: Código HTTP de status (200 = OK, 404 = Not Found, etc)reason: Frase descritiva do status ("OK", "Not Found", etc)text: Conteúdo da resposta em formato textojson(): Conteúdo parsed como JSONheaders: Cabeçalhos da respostacookies: Cookies recebidos
Verificando Status de FormaSeguro
É uma boa prática verificar se a requisição foi bem-sucedida antes de processar os dados. O Requests facilita isso com o atributo ok:
import requests
response = requests.get("https://api.github.com")
if response.ok:
print("Requisição bem-sucedida!")
data = response.json()
print(data)
else:
print(f"Erro: {response.status_code} - {response.reason}")
📋 Trabalhando com Parâmetros de Query
Muitas APIs utilizam parâmetros de query string para filtrar ou paginar resultados. O Requests permite passar esses parâmetros de forma organizada:
import requests
Parâmetros de query passados como dicionário
params = {
"page": 1,
"per_page": 10,
"sort": "created",
"direction": "desc"
}
response = requests.get(
"https://api.github.com/repos/python/cpython/releases",
params=params
)
print(f"URL gerada: {response.url}")
print(f"Status: {response.status_code}")
Vendo os dados JSON retornados
releases = response.json()
for release in releases[:3]:
print(f"- {release['tag_name']}: {release['name']}")
Esta abordagem é muito mais limpa do que concatenar strings manualmente, pois o Requests trata automaticamente da codificação URL.
📤 Enviando Dados com POST
O método POST é utilizado para enviar dados ao servidor, seja para criar novos recursos, submeter formulários ou enviar payloads JSON:
import requests
Dados para enviar (dicionário Python)
data = {
"username": "usuario_teste",
"email": "[email protected]",
"password": "senha_segura123"
}
Enviando POST com dados de formulário
response = requests.post(
"https://httpbin.org/post",
data=data
)
print(f"Status: {response.status_code}")
print(response.json())
Enviando JSON no Corpo da Requisição
Muitas APIs modernas esperam receber dados no formato JSON. Você pode usar o parâmetro json para isso:
import requests
Payload JSON
payload = {
"title": "Novo Post",
"body": "Conteúdo do post aqui",
"userId": 1
}
response = requests.post(
"https://jsonplaceholder.typicode.com/posts",
json=payload
)
A resposta já vem em JSON automaticamente
result = response.json()
print(f"ID criado: {result['id']}")
print(f"Título: {result['title']}")
O Requests automaticamente define o header Content-Type como application/json quando você usa o parâmetro json.
🎯 Headers Personalizados
Em algumas situações, você precisa enviar cabeçalhos personalizados na requisição, como tokens de autenticação, identificação de aplicação ou preferências de formato:
import requests
Definindo headers personalizados
headers = {
"Authorization": "Bearer seu_token_aqui",
"Accept": "application/json",
"User-Agent": "MinhaApp/1.0",
"Accept-Language": "pt-BR,pt;q=0.9"
}
response = requests.get(
"https://api.exemplo.com/dados-protegidos",
headers=headers
)
print(f"Status: {response.status_code}")
print(response.json())
🔐 Autenticação com Requests
O Requests suporta diversos métodos de autenticação de forma nativa. Os mais comuns são Basic Auth e Bearer Token:
Basic Authentication
import requests
from requests.auth import HTTPBasicAuth
Autenticação Basic (usuário e senha)
auth = HTTPBasicAuth("usuario", "senha")
response = requests.get(
"https://httpbin.org/basic-auth/usuario/senha",
auth=auth
)
print(f"Status: {response.status_code}")
print(response.text)
Bearer Token (JWT)
import requests
Bearer Token para APIs que usam JWT
headers = {
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
response = requests.get(
"https://api.exemplo.com/usuario/perfil",
headers=headers
)
print(response.json())
Para autenticação mais complexa, você pode implementar sua própria classe de autenticação herdando de requests.auth.AuthBase. A documentação oficial sobre autenticação está disponível em docs.python-requests.org.
🍪 Trabalhando com Cookies e Sessões
Cookies são fundamentais para manter estado entre requisições, como sessões de usuário. O Requests facilita o trabalho com cookies:
import requests
Verificando cookies da resposta
response = requests.get("https://httpbin.org/cookies")
print("Cookies recebidos:")
print(response.json())
Enviando cookies customizados
cookies = {
"session_id": "abc123xyz",
"user_preference": "dark_mode"
}
response = requests.get(
"https://httpbin.org/cookies",
cookies=cookies
)
print(response.json())
Usando Sessões Persistentes
Quando você precisa fazer múltiplas requisições mantendo os mesmos cookies e configurações, usar uma Session é muito mais eficiente:
import requests
Criar uma sessão
session = requests.Session()
A sessão mantém cookies automaticamente entre requisições
session.headers.update({
"User-Agent": "MeuBot/1.0"
})
Primeira requisição - login
login_data = {"username": "admin", "password": "123456"}
response = session.post("https://exemplo.com/login", data=login_data)
print(f"Login: {response.status_code}")
Segunda requisição - já autenticado
response = session.get("https://exemplo.com/dashboard")
print(f"Dashboard: {response.status_code}")
Terceira requisição - continuar usando a sessão
response = session.get("https://exemplo.com/perfil")
print(f"Perfil: {response.status_code}")
A sessão também permite compartilhar conexões TCP, melhorando a performance em requisições múltiplas. Para mais detalhes sobre sessões, consulte a documentação avançada.
⏱️Timeouts e Tratamento de Erros
Por padrão, o Requests espera indefinidamente por uma resposta. É crucial definir timeouts para evitar que sua aplicação trave:
import requests
from requests.exceptions import Timeout, ConnectionError
Timeout de 5 segundos (connect e read)
try:
response = requests.get(
"https://api.exemplo.com/dados",
timeout=5
)
print(response.json())
except Timeout:
print("Tempo limite excedido!")
except ConnectionError:
print("Erro de conexão!")
except requests.exceptions.RequestException as e:
print(f"Erro geral: {e}")
Exceções Disponíveis
O Requests levanta várias exceções que você pode capturar:
requests.exceptions.RequestException: Classe base para todas exceçõesrequests.exceptions.ConnectionError: Erro de conexão de rederequests.exceptions.Timeout: Tempo limite excedidorequests.exceptions.HTTPError: Resposta HTTP com erro (4xx ou 5xx)requests.exceptions.TooManyRedirects: Excesso de redirects
Verificando Errors HTTP Automaticamente
Você também pode configurar o Requests para levantar exceções automaticamente em erros HTTP:
import requests
from requests.exceptions import HTTPError
Definir para levantar exceções em status de erro
response = requests.get("https://httpbin.org/status/404")
response.raise_for_status() # Levanta HTTPError para 4xx/5xx
📥 Download de Arquivos e Stream de Dados
Para arquivos grandes, você não quer carregar tudo na memória de uma vez. O Requests permite fazer streaming de dados:
import requests
Streaming de download - não baixa tudo na memória
url = "https://example.com/arquivo-grande.zip"
response = requests.get(url, stream=True)
Obter tamanho total (se disponível)
total_size = response.headers.get("content-length")
print(f"Tamanho total: {total_size} bytes")
Baixar em chunks
with open("arquivo.zip", "wb") as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
print("Download concluído!")
A técnica de streaming é essencial para arquivos grandes ou para processar dados em tempo real. Para download de imagens ou outros arquivos binários, o Requests automaticamente detecta o tipo de conteúdo.
🔄 Retry e Retry Strategy
Em aplicações de produção, você frequentemente precisa tentar novamente requisições que falharam temporariamente:
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
Configurar retry strategy
session = requests.Session()
retry_strategy = Retry(
total=3,
backoff_factor=1,
status_forcelist=[429, 500, 502, 503, 504],
allowed_methods=["GET", "POST"]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)
Agora as requisições会自动重试
response = session.get("https://api.exemplo.com/dados")
print(f"Status: {response.status_code}")
Esta configuração faz a requisição tentar novamente até 3 vezes, com delay exponencial entre tentativas, apenas para erros de servidor (5xx) ou rate limiting (429).
📊 Timeout Adaptativo com Session
Para aplicações que fazem muitas requisições, você pode configurar timeouts padrão na sessão:
import requests
session = requests.Session()
Configurar timeout padrão para todas as requisições
session.timeout = 10
Timeout específico para uma requisição
response = session.get("https://api.exemplo.com", timeout=30)
print(response.status_code)
🛡️ Verificação de SSL
Por padrão, o Requests verifica certificados SSL. Em ambientes de desenvolvimento, você pode precisar desabilitar essa verificação:
import requests
Desabilitar verificação SSL (NÃO use em produção!)
response = requests.get(
"https://exemplo.com",
verify=False
)
Para ignorar apenas certificados específicos
response = requests.get("https://exemplo.com", verify="/path/to/cert.pem")
Aviso importante: Nunca desabilite a verificação SSL em ambiente de produção, pois isso expõe sua aplicação a ataques man-in-the-middle.
🔗 Integração com Web Scraping
O Requests é frequentemente usado junto com BeautifulSoup para web scraping. Após obter o HTML com Requests, você pode parsear com BeautifulSoup:
import requests
from bs4 import BeautifulSoup
Obter página HTML
response = requests.get("https://exemplo.com/artigos")
response.encoding = "utf-8"
Parsear o HTML
soup = BeautifulSoup(response.text, "html.parser")
Extrair títulos dos artigos
for article in soup.select("article"):
title = article.select_one("h2").text
link = article.select_one("a")["href"]
print(f"{title} -> {link}")
Se você quer aprender mais sobre web scraping, temos um guia completo de web scraping com Python que explora técnicas mais avançadas.
✅ Boas Práticas e Performance
Para usar o Requests de forma eficiente em produção, siga estas práticas:
- Use Session: Reutilize conexões TCP com sessões para melhor performance
- Defina Timeouts: Sempre defina timeouts para evitar travamentos
- Trate Erros: Capture exceções apropriadamente
- Use Retry: Implemente retry com backoff para operações transient failures
- Reuse Connections: Configure connection pooling para muitas requisições
- Log Requests: Adicione logging para debugging em produção
📚 Recursos Adicionais
Para aprofundar seus conhecimentos sobre o Requests e HTTP em geral, aqui estão alguns recursos confiáveis:
- Documentação oficial do Requests
- MDN Web Docs - HTTP
- Python.org
- HTTPBin - Ferramenta de teste
- JSONPlaceholder - API de teste
- Real Python - Requests Tutorial
- W3C - HTTP Specification
- urllib - Biblioteca padrão Python
🚀 Conclusão
A biblioteca Requests é essencial para qualquer desenvolvedor Python que precisa trabalhar com APIs, fazer web scraping ou integrar sistemas. Com sua API intuitiva e poderosa, você pode realizar desde requisições simples até configurações avançadas de autenticação, sessão e retry.
Agora que você domina o Requests, explore nosso guia completo de Python para iniciantes para continuar sua jornada de aprendizado e dominar a linguagem mais versátil do mercado.