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 texto
  • json(): Conteúdo parsed como JSON
  • headers: Cabeçalhos da resposta
  • cookies: 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ções
  • requests.exceptions.ConnectionError: Erro de conexão de rede
  • requests.exceptions.Timeout: Tempo limite excedido
  • requests.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:

🚀 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.