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.