Neste guia abrangente, você vai aprender:
- O que é
requests
, como instalá-la e por que ela é a biblioteca cliente HTTP mais popular do Python. - Como usá-la com diferentes métodos HTTP.
- O que ela oferece para lidar com as respostas do servidor.
- Quais personalizações de solicitação ela suporta.
- Os cenários avançados cobertos pela biblioteca
requests
do Python
Vamos nos aprofundar!
Introdução à Biblioteca Requests
Veja o que é Requests, como instalá-la, quando usá-la e o que ela oferece.
Definição
Requests
é uma biblioteca HTTP elegante e simples para Python. Em detalhes, ela fornece uma API intuitiva para fazer solicitações (requests) HTTP e lidar com respostas de uma forma fácil e legível por humanos. Com mais de 50 mil estrelas no GitHub e milhões de downloads diários, Requests representa o cliente HTTP mais popular em Python.
Alguns dos principais recursos oferecidos por essa biblioteca incluem uma API vasta que abrange todos os métodos HTTP, tratamento de respostas, personalização de solicitações, autenticação, gerenciamento de certificados SSL e muito mais. Além disso, o módulo Python Requests suporta HTTP/1.1 pronto para uso.
Configuração
A maneira mais fácil e recomendada de instalar Requests é por meio de pip
. Em particular, o pacote pip
associado à biblioteca Requests é requests
. Então, você pode instalar o cliente HTTP com o seguinte comando:
pip install requests
Para usar requests
em seu script Python, importe-o com a linha abaixo:
import requests
Formidável! O pacote Requests está instalado e pronto para ser usado.
Casos de uso
Os principais casos de uso da biblioteca Python requests
incluem:
- Fazer solicitações HTTP para servidores web: recupere dados de servidores web enviando solicitações GET.
- Consumir APIs: envie solicitações aos endpoints da API e gerencie suas respostas, interagindo com vários serviços da web e acessando seus dados.
- Web scraping: busque documentos HTML associados a páginas da web, que podem então ser analisados usando bibliotecas como
BeautifulSoup
para extrair informações específicas. Saiba mais em nosso guia de web scraping em Python. - Testar aplicativos web: simule solicitações HTTP e verifique as respostas, automatizando o processo de teste e garantindo o funcionamento adequado dos serviços web.
- Baixar: recupere arquivos de servidores web, como imagens, documentos ou outros arquivos de mídia, enviando solicitações HTTP
GET
para os respectivos URLs.
Métodos
Dê uma olhada nos métodos públicos expostos pela biblioteca requests
na tabela a seguir:
Método | Descrição |
requests.request() |
Envia uma solicitação HTTP personalizada com o método especificado para o URL fornecido |
requests.get() |
Envia uma solicitação GET para o URL especificado |
requests.post() |
Envia uma solicitação POST para o URL especificado |
requests.put() |
Envia uma solicitação PUT para o URL especificado |
requests.patch() |
Envia uma solicitação PATCH para o URL especificado |
requests.delete() |
Envia uma solicitação DELETE para o URL especificado |
requests.head() |
Envia uma solicitação HEAD para o URL especificado |
Como você pode ver, estes abrangem os métodos de solicitação HTTP mais úteis. Saiba mais sobre como usá-los na documentação de API oficial.
É hora de vê-los em ação!
Métodos HTTP
Veja a biblioteca Python requests
em ação ao lidar com os métodos GET
, POST
, PUT
, DELETE
e HEAD
em HTTP.
GET
Em HTTP, o método GET
é usado para solicitar um recurso específico de um servidor. É assim que você pode fazer uma solicitação HTTP GET
com requests.get()
:
import requests
# send a GET request to the specified URL
response = requests.get('https://api.example.com/data')
Da mesma forma, você pode obter o mesmo resultado com requests.request()
conforme abaixo:
import requests
response = requests.request('GET', 'https://api.example.com/data')
Nesse caso, você precisa especificar manualmente o método HTTP a ser usado com uma variável de string adicional.
POST
O método HTTP POST
é usado para enviar dados a um servidor para processamento adicional. Veja como fazer uma solicitação POST
com requests.post()
:
import requests
# data to be sent in the POST request
product = {
'name': 'Limitor 500',
'description': 'The Limitor 500 is a high-performance electronic device designed to regulate power consumption in industrial settings. It offers advanced features such as real-time monitoring, adjustable settings, and remote access for efficient energy management.',
'price': 199.99,
'manufacturer': 'TechCorp Inc.',
'category': 'Electronics',
'availability': 'In Stock'
}
# send a POST request to the specified URL
response = requests.post('https://api.example.com/product', data=product)
Em comparação com uma solicitação GET
, desta vez você também precisa especificar os dados a serem enviados ao servidor por meio da opção
dados. requests
adicionará esses dados ao corpo da solicitação HTTP.
Para corpos JSON, passe seu objeto de dados para a opção json
em vez de data
:
response = requests.post('https://api.example.com/product', json=product)
De forma equivalente, você pode realizar a mesma solicitação com request.request()
da seguinte forma:
import requests
product = {
'name': 'Limitor 500',
'description': 'The Limitor 500 is a high-performance electronic device designed to regulate power consumption in industrial settings. It offers advanced features such as real-time monitoring, adjustable settings, and remote access for efficient energy management.',
'price': 199.99,
'manufacturer': 'TechCorp Inc.',
'category': 'Electronics',
'availability': 'In Stock'
}
response = requests.request('POST', 'https://api.example.com/product', data=product)
PUT
O método PUT
é usado para atualizar ou substituir um recurso no servidor. Enviar uma solicitação PUT
com o módulo Python requests
é fácil e segue um padrão semelhante ao das solicitações POST. O que muda é que o método a ser usado é requests.put()
. Além disso, a string do método HTTP em requests.request()
será 'PUT'
.
PATCH
O método PATCH
é usado para aplicar modificações parciais em um recurso on-line. Assim como para solicitações PUT
, enviar solicitações PATCH
na biblioteca Python requests
é semelhante às solicitações POST. O que muda é que o método a ser empregado é requests.patch()
e a string do método HTTP em requests.request()
é 'PATCH'
.
DELETE
O método DELETE
é usado para excluir um recurso identificado por um determinado URI. Veja como fazer uma solicitação HTTP DELETE
em requests
usando o método delete()
:
import requests
# send a DELETE request for the product with id = 75
response = requests.delete('https://api.example.com/products/75')
Da mesma forma, você pode realizar uma solicitação DELETE com requests.request()
:
import requests
response = requests.request('DELETE', 'https://api.example.com/products/75')
HEAD
O método HEAD
é semelhante a GET
, mas solicita apenas os cabeçalhos da resposta, sem o conteúdo real do corpo. Portanto, a resposta retornada pelo servidor para uma solicitação HEAD
será equivalente à de uma solicitação GET
, mas sem dados do corpo.
Use requests.head()
para fazer uma solicitação HTTP HEAD
em Python:
import requests
# send a HEAD request to the specified URL
response = requests.head('https://api.example.com/resource')
Da mesma forma, você pode realizar uma solicitação HEAD
com requests.request()
:
import requests
response = requests.request('HEAD', 'https://api.example.com/resource')
Analisando um objeto de resposta a partir de requests
Agora que você sabe como fazer solicitações HTTP com requests
, é hora de ver como lidar com objetos de resposta.
Objeto de resposta
Depois de fazer uma solicitação HTTP, requests
receberá a resposta do servidor e a mapeará em um objeto Response especial.
Dê uma olhada no exemplo de Python requests
abaixo:
import requests
response = requests.get('http://lumtest.com/myip.json')
print(response)
Isso resultará:
<Response [200]>
response
é um objeto Response
que expõe alguns métodos e propriedades úteis. Explore os mais importantes nas próximas seções!
Aviso: requests
nem sempre retornam uma resposta. Em caso de erros (por exemplo, um URL inválido), ele gera uma RequestException
. Proteja-se contra essa exceção com a lógica abaixo:
try:
response = requests.get('http://lumtest.com/myip.json')
# handle the response
except requests.exceptions.RequestException as e:
print('An error occurred during the request:', e)
Códigos de status
Quando se trata de HTTP, códigos de status de resposta são valores padronizados retornados pelo servidor para indicar o sucesso, a falha ou qualquer outra condição da solicitação. Esses códigos de status são muito importantes porque fornecem feedback imediato em relação à ao êxito positivo ou negativo da solicitação e, se negativo, ao que deu errado.
Os códigos são particularmente úteis no tratamento de erros, permitindo que o cliente identifique e trate diferentes tipos de erros da forma adequada. Por exemplo, um código de status 4xx
indica um erro do lado do cliente (por exemplo, uma solicitação inválida), enquanto um código de status 5xx
indica um erro do lado do servidor.
Controlar o código de status geralmente é a primeira etapa para lidar com uma resposta em Python usando a biblioteca requests
. Depois de fazer uma solicitação, você deve sempre verificar o código de status da resposta para determinar se a solicitação foi bem-sucedida ou não. Acesse o código de status por meio do atributo status_code
do objeto de resposta:
response.status_code # 200
Dependendo do código de status recebido, você deve usar instruções condicionais para lidar com diferentes cenários de forma adequada:
import requests
response = requests.get('http://lumtest.com/myip.json')
# check if the request was successful (status code 200)
if response.status_code == 200:
print('Successful request!')
# handle the response...
elif response.status_code == 404:
print('Resource not found!')
else:
print(f'Request failed with status code: {response.status_code}')
Na maioria dos cenários, você só precisa distinguir entre uma solicitação bem-sucedida e uma resposta de erro. requests
simplifica esse processo graças a uma sobrecarga personalizada __bool()__
. Especificamente, você pode usar um objeto Response
diretamente em uma expressão condicional. Será avaliado True
se o código de status estiver entre 200
e 399
, caso contrário, False
.
Em outras palavras, é possível verificar o resultado bem-sucedido de uma solicitação com esta lógica:
if response:
print('Successful request!')
# handle the response...
else:
print(f'Request failed with status code: {response.status_code}')
Cabeçalhos de resposta
Acesse os cabeçalhos de uma resposta do servidor por meio do atributo headers
:
import requests
response = requests.get('http://lumtest.com/myip.json')
response_headers = response.headers
print(response_headers)
Isso gerará:
{'Server': 'nginx', 'Date': 'Thu, 09 May 2024 12:51:08 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '279', 'Connection': 'keep-alive', 'Cache-Control': 'no-store', 'Access-Control-Allow-Origin': '*'}
Como você pode ver, response.headers
retorna um objeto semelhante a um dicionário. Isso significa que você pode acessar os valores do cabeçalho por chave. Por exemplo, suponha que você queira acessar o cabeçalho Content-Type
da resposta. Veja abaixo como você pode fazer isso:
response_headers['Content-Type'] # 'application/json; charset=utf-8'
Como a especificação HTTP define cabeçalhos como indiferente a maiúsculas e minúsculas, requests
permitem que você os acesse sem se preocupar com a maiusculização:
response_headers['content-type'] # 'application/json; charset=utf-8'
Conteúdo de resposta
solicitações
fornece atributos e métodos diferentes para acessar a carga útil de uma resposta:
response.content
: retorna o conteúdo da resposta em bytes.response.text
: retorna o conteúdo da resposta como uma string em Unicode.response.json()
: retorna o conteúdo codificado em JSON da resposta em um dicionário.
Veja-os em ação no exemplo a seguir:
import requests
response = requests.get('http://lumtest.com/myip.json')
# access the response as bytes
response_bytes = response.content
print(type(response_bytes))
print(response_bytes)
print()
# retrieve the response as text
response_text = response.text
print(type(response_text))
print(response_text)
print()
# retrieve the response as a JSON-encoded dictionary
response_json = response.json()
print(type(response_json))
print(response_json)
print()
http://lumtest.com/myip.json
é um endpoint especial que retorna informações sobre o IP do chamador. O resultado do trecho acima será algo como:
<class 'bytes'>
b'{"ip":"45.85.135.110","country":"US","asn":{"asnum":62240,"org_name":"Clouvider Limited"},"geo":{"city":"Ashburn","region":"VA","region_name":"Virginia","postal_code":"20149","latitude":39.0469,"longitude":-77.4903,"tz":"America/New_York","lum_city":"ashburn","lum_region":"va"}}'
<class 'str'>
{"ip":"45.85.135.110","country":"US","asn":{"asnum":62240,"org_name":"Clouvider Limited"},"geo":{"city":"Ashburn","region":"VA","region_name":"Virginia","postal_code":"20149","latitude":39.0469,"longitude":-77.4903,"tz":"America/New_York","lum_city":"ashburn","lum_region":"va"}}
<class 'dict'>
{'ip': '45.85.135.110', 'country': 'US', 'asn': {'asnum': 62240, 'org_name': 'Clouvider Limited'}, 'geo': {'city': 'Ashburn', 'region': 'VA', 'region_name': 'Virginia', 'postal_code': '20149', 'latitude': 39.0469, 'longitude': -77.4903, 'tz': 'America/New_York', 'lum_city': 'ashburn', 'lum_region': 'va'}}
Observe os três formatos de resposta diferentes. Como dicionário, response.json()
é particularmente útil porque simplifica o acesso aos dados:
response_json['country'] # 'US'
Para obter mais informações, confira nosso guia sobre como analisar JSON em Python.
Cookies de resposta
Enquanto cookies HTTP são definidos por meio de cabeçalhos, o objeto Response
fornece um atributo cookies
especial para lidar com eles. Isso retorna um objeto http.cookiejar com os cookies que o servidor enviou de volta.
Dê uma olhada no exemplo abaixo, demonstrando como acessar cookies de um objeto de resposta na biblioteca Python requests
:
import requests
# define the login credentials
credentials = {
'username': 'example_user',
'password': 'example_password'
}
# send a POST request to the login endpoint
response = requests.post('https://www.example.com/login', data=credentials)
# access the cookies set by the server
cookies = response.cookies
# print the cookies received from the server
for cookie in cookies:
print(cookie.name, ':', cookie.value)
O trecho de amostra acima pode produzir algo assim:
session_id : be400765483cf840dfbbd39
user_id : 7164
expires : Sat, 01 Jan 2025 14:30:00 GMT
Personalização da solicitação com a biblioteca de solicitações do Python
As solicitações HTTP geralmente envolvem parâmetros especiais de filtragem e cabeçalhos personalizados. Vamos ver como especificá-los em requests
.
Parâmetros de string de consulta
Os parâmetros de consulta, também conhecidos como parâmetros de URL, são parâmetros adicionais anexados ao final de um URL em uma solicitação HTTP. Eles fornecem informações extras ao servidor sobre a solicitação, geralmente sobre como filtrar dados e personalizar a resposta.
Considere este URL:
https://api.example.com/data?key1=value1&key2=value2
Neste exemplo, ?key1=value1&key2=value2
é a string de consulta, enquanto key1
e key2
são parâmetros de consulta.
Uma string de consulta começa com ?
e consiste em um par de valores-chave separados por um sinal de igual (=
) e concatenado por &
. Especificar de forma programática essa string de consulta no código Python nem sempre é fácil, especialmente ao lidar com parâmetros opcionais. É por isso que requests
oferece a opção params
:
import requests
# define query parameters as a dictionary
params = {
'page': 1,
'limit': 10,
'category': 'electronics'
}
# send a GET request to the following URL:
# 'https://api.example.com/products?page=1&limit=10&category=electronics'
response = requests.get('https://api.example.com/products', params=params)
Equivalentemente, você pode passar os parâmetros para requests
como uma lista de tuplas:
import requests
# define query parameters as a list of tuples
params = [
('page', '1'),
('limit', '10'),
('category', 'electronics')
]
response = requests.get('https://api.example.com/products', params=params)
Ou como uma string de
bytes:
import requests
# define query parameters as a bytes string
params = b'page=1&limit=10&category=electronics'
response = requests.get('https://api.example.com/products', params=params)
Cabeçalhos de solicitação
Para personalizar os cabeçalhos em uma solicitação HTTP em requests
, passe-os como um dicionário para a opção headers
. Por exemplo, você pode definir uma string personalizada User-Agent
em requests
com:
import requests
# define custom headers
custom_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
# other headers...
}
# send a GET request with custom headers
response = requests.get('https://api.example.com/data', headers=custom_headers)
Solicitar cookies
Enquanto os cookies HTTP são enviados ao servidor por meio de cabeçalhos, requests
fornece uma opção dedicada de cookies
para personalizá-los. Use-o como no exemplo a seguir:
# define custom cookies
custom_cookies = {
'session_id': 'be400765483cf840dfbbd39',
'user_id': '7164'
}
# send a GET request with custom cookies
response = requests.get('https://www.example.com', cookies=custom_cookies)
Note que cookies
aceita um dicionário ou um objeto http.cookiejar
.
Outras configurações
request
oferece uma API rica e há muitas técnicas avançadas disponíveis. Explore alguns dos mais relevantes!
Proxy Setup
A integração de proxy em requests
permite que você roteie suas solicitações HTTP por meio de um servidor proxy. Esse é um mecanismo poderoso para ocultar seu endereço IP, ignorar os limitadores de taxa ou acessar conteúdo com restrição geográfica.
Você pode integrar um servidor proxy com a biblioteca Python requests
usando a opção proxies
:
import requests
# define the proxy settings
proxy = {
'http': 'http://username:[email protected]:8080',
'https': 'https://username:[email protected]:8080'
}
# Make a request using the proxy
response = requests.get('https://www.example.com', proxies=proxy)
Para um tutorial completo, siga nosso guia sobre usar um proxy com Python Requests.
Autenticação básica
Autenticação HTTP, mais conhecida como “autenticação básica”, é um esquema de autenticação simples incorporado ao protocolo HTTP. Envolve o envio de um nome de usuário e senha codificados no formato Base64 no cabeçalho Authorization
.
Embora você possa implementá-lo configurando manualmente o cabeçalho Authorization
, requests
expõe uma opção auth
dedicada para ele. Isso aceita uma tupla com o nome de usuário e a senha. Use-o para lidar com a autenticação básica na biblioteca Python requests
:
import requests
# define the username and password for basic authentication
username = 'sample_username'
password = 'sample_password'
# send a GET request with basic authentication
response = requests.get('https://api.example.com/private/users', auth=(username, password))
Verificação de certificado SSL
A verificação do certificado SSL é crucial para garantir a comunicação segura entre clientes e servidores pela internet. Ao mesmo tempo, há situações em que você confia no servidor de destino e não precisa impor a verificação.
Em particular, ao rotear o tráfego HTTP por meio de servidores proxy, você pode encontrar erros relacionados aos certificados SSL. Nesse caso, talvez seja necessário desativar a verificação do certificado SSL. Em requests
, isso é possível por meio da opção verify
:
import requests
# send a GET request to a website with SSL certificate verification disabled
response = requests.get('https://api.example.com/data', verify=False)
Tempo limite
Por padrão, as solicitações aguardam automaticamente por tempo indefinido até que o servidor responda. Se o servidor estiver passando por uma sobrecarga ou houver uma lentidão na rede, esse comportamento pode se tornar um problema.
Para evitar a lentidão de seu aplicativo enquanto espera por uma resposta que talvez nunca chegue, requests
tem uma opção de timeout
. É possível estabelecer um número inteiro ou flutuante representando o número de segundos para esperar por uma resposta:
import requests
# timeout after 2 second
response1 = requests.get("https://api.example.com/data", timeout=2)
Como alternativa, timeout
aceita uma tupla com dois elementos: tempo limite de conexão e tempo limite de leitura. Especifique-os como no exemplo abaixo:
import requests
# timeout after 2.5 seconds for connections and 4 seconds for reading response
response = requests.get("https://api.example.com/data", timeout=(2.5, 4))
Se a solicitação estabelecer uma conexão dentro do tempo limite de conexão especificado e receber dados dentro do tempo limite de leitura, a resposta será retornada normalmente. Caso contrário, se a solicitação expirar, uma exceção Timeout
será gerada:
import requests
from requests.exceptions import Timeout
try:
response = requests.get("https://api.example.com/data", timeout=(2.5, 4))
except Timeout:
print("The request timed out")
Conclusão
Neste artigo, você se aprofundou na biblioteca requests
, entendendo o que ela é, quais métodos ela tem, como usá-los e muito mais. Você aprendeu que o módulo Python requests
é uma biblioteca HTTP útil e popular que abrange vários casos de uso.
O problema é que qualquer solicitação HTTP expõe seu IP público. Desse modo, fornece informações sobre quem você é e onde mora, o que não é bom para sua privacidade. Existem várias maneiras de ocultar seu endereço IP, e a maneira mais eficaz de obter maior segurança e privacidade é usar um servidor proxy.
A Bright Data controla os melhores servidores de proxy do mundo, atendendo a empresas listadas na Fortune 500 e a mais de 20.000 clientes. Sua oferta inclui uma grande variedade de tipos de proxy:
- Proxies de data centers — mais de 770.000 IPs de data centers.
- Proxies residenciais — mais de 72 milhões de IPs residenciais em mais de 195 países.
- Proxies de provedores de internet (ISP) — mais de 700.000 IPs de provedores.
- Proxies móveis — mais de 7 milhões de IPs móveis.
Não é necessário cartão de crédito