Usando o módulo Requests em Python

Requests é um módulo Python que você pode usar para enviar todos os tipos de solicitações HTTP. É uma biblioteca fácil de usar com muitos recursos, desde a passagem de parâmetros em URLs até o envio de cabeçalhos personalizados e verificação SSL. Neste tutorial, você aprenderá como usar esta biblioteca para enviar solicitações HTTP simples em Python.

Você pode usar Requests com Python versão 2.6–2.7 e 3.3–3.6. Antes de prosseguir, você deve saber que Requests é um módulo externo, então você terá que instalá-lo primeiro antes de experimentar os exemplos deste tutorial. Você pode instalá-lo executando o seguinte comando no terminal:

Depois de instalar o módulo, você pode verificar se ele foi instalado com sucesso importando-o usando este comando:

Se a instalação for bem-sucedida, você não verá nenhuma mensagem de erro.

Fazendo uma solicitação GET

É muito fácil enviar uma solicitação HTTP usando Requests. Você começa importando o módulo e depois faz a solicitação. Aqui está um exemplo:

1
import requests
2
req = requests.get('https://tutsplus.com/')

Todas as informações sobre nossa solicitação agora estão armazenadas em um objeto Response chamado req. Por exemplo, você pode obter a codificação da página da Web usando o req.encoding propriedade. Você também pode obter o código de status da solicitação usando o req.status_code propriedade.

1
req.encoding     # returns 'utf-8'

2
req.status_code  # returns 200

Você pode acessar os cookies que o servidor enviou de volta usando req.cookies. Da mesma forma, você pode obter os cabeçalhos de resposta usando req.headers. o req.headers A propriedade retorna um dicionário de cabeçalhos de resposta que não diferencia maiúsculas de minúsculas. Isso significa que req.headers['Content-Length'], req.headers['content-length'] e req.headers['CONTENT-LENGTH'] todos retornarão o valor do 'Content-Length' cabeçalho de resposta.

Você pode verificar se a resposta é um redirecionamento HTTP bem formado que pode ter sido processado automaticamente usando o req.is_redirect propriedade. vai voltar True ou False com base na resposta. Você também pode obter o tempo decorrido entre o envio da solicitação e o retorno de uma resposta usando o req.elapsed propriedade.

A URL que você passou inicialmente para o get() A função pode ser diferente da URL final da resposta por vários motivos, incluindo redirecionamentos. Para ver o URL de resposta final, você pode usar o req.url propriedade.

1
import requests
2
req = requests.get('https://www.tutsplus.com/')
3
4
req.encoding      # returns 'utf-8'

5
req.status_code   # returns 200

6
req.elapsed       # returns datetime.timedelta(0, 1, 666890)

7
req.url           # returns 'https://tutsplus.com/'

8
9
req.history      
10
# returns [, ]

11
12
req.headers['Content-Type']
13
# returns 'text/html; charset=utf-8'

Obter todas essas informações sobre a página da Web que você está acessando é bom, mas provavelmente você deseja acessar o conteúdo real. Se o conteúdo que você está acessando for texto, você pode usar o req.text propriedade para acessá-lo. O conteúdo é então analisado como unicode. Você pode passar a codificação com a qual decodificar o texto usando o req.encoding propriedade.

No caso de respostas sem texto, você pode acessá-las em formato binário usando req.content. O módulo decodificará automaticamente gzip e deflate codificações de transferência. Isso pode ser útil quando você estiver lidando com arquivos de mídia. Da mesma forma, você pode acessar o conteúdo codificado em json da resposta, se existir, usando req.json().

Você também pode obter a resposta bruta do servidor usando req.raw. Tenha em mente que você terá que passar stream=True na solicitação para obter a resposta bruta.

Alguns arquivos que você baixa da internet usando o módulo Requests podem ter um tamanho enorme. Nesses casos, não será sensato carregar toda a resposta ou arquivo na memória de uma só vez. Você pode fazer o download de um arquivo em partes ou partes usando o iter_content(chunk_size = 1, decode_unicode=False) método.

Este método itera sobre os dados de resposta em chunk_size número de bytes de uma só vez. Quando stream=True tiver sido definido na solicitação, esse método evitará a leitura de todo o arquivo na memória de uma só vez para respostas grandes. o chunk_size parâmetro pode ser um número inteiro ou None. Quando definido como um valor inteiro, chunk_size determina o número de bytes que devem ser lidos na memória.

Quando chunk_size está configurado para None e stream está configurado para True, os dados serão lidos à medida que chegam em qualquer tamanho de blocos recebidos. Quando chunk_size está configurado para None e stream está configurado para Falsetodos os dados serão retornados como um único bloco.

Vamos baixar esta imagem de alguns cogumelos usando o módulo Requests. Aqui está a imagem real:

Exemplo de imagem de cogumelo para downloadExemplo de imagem de cogumelo para downloadExemplo de imagem de cogumelo para download

Este é o código que você precisa:

1
import requests
2
3
req = requests.get('path/to/mushrooms.jpg', stream=True)
4
req.raise_for_status()
5
6
with open('mushrooms.jpg', 'wb') as fd:
7
    for chunk in req.iter_content(chunk_size=50000):
8
        print('Received a Chunk')
9
        fd.write(chunk)

o 'path/to/mushrooms.jpg' é o URL da imagem real. Você pode colocar o URL de qualquer outra imagem aqui para baixar outra coisa. O arquivo de imagem fornecido tem 162 kb de tamanho e você definiu chunk_size até 50.000 bytes. Isso significa que a mensagem “Received a Chunk” deve ser impressa quatro vezes no terminal. O tamanho do último pedaço será apenas 32350 bytes porque a parte do arquivo que resta a ser recebida após as três primeiras iterações é de 32350 bytes.

Você também pode baixar vídeos de maneira semelhante. Em vez de especificar um fixo chunk_sizepodemos simplesmente definir seu valor como None e o vídeo será baixado em qualquer tamanho de bloco entregue. O trecho de código a seguir fará o download deste vídeo de uma rodovia do Mixkit:

1
import requests
2
3
req = requests.get('path/to/highway/video.mp4', stream=True)
4
req.raise_for_status()
5
6
with open('highway.mp4', 'wb') as fd:
7
8
    for chunk in req.iter_content(chunk_size=None):
9
        print('Received a Chunk')
10
        fd.write(chunk)

Tente executar o código e você verá que o download do vídeo é feito em um único bloco.

Há algumas coisas que você deve ter em mente se decidir usar o stream parâmetro. O download do corpo da resposta é adiado até que você realmente acesse seu valor usando o content atributo. Dessa forma, você pode evitar o download de um arquivo se algo como um dos valores do cabeçalho parecer incorreto.

Lembre-se também de que todas as conexões iniciadas ao definir o valor do fluxo para True não são fechados, a menos que você consuma todos os dados ou use o close() método. Uma maneira melhor de garantir que as conexões sejam sempre fechadas, mesmo que você leia a resposta parcialmente, é fazer suas solicitações dentro de um with declaração conforme abaixo:

1
import requests
2
3
with requests.get('path/to/highway/video.mp4', stream=True) as rq:
4
    with open('highway.mp4', 'wb') as fd:
5
        for chunk in rq.iter_content(chunk_size=None):
6
            print('Received a Chunk')
7
            fd.write(chunk)

Como o arquivo de imagem que baixamos anteriormente tinha um tamanho comparativamente pequeno, você também pode baixá-lo de uma só vez usando o seguinte código:

1
import requests
2
3
req = requests.get('path/to/mushrooms.jpg')
4
req.raise_for_status()
5
6
with open('mushrooms.jpg', 'wb') as fd:
7
    fd.write(req.content)

Ignoramos a definição do valor de stream parâmetro para que tenha sido definido como False por padrão. Isso significa que todo o conteúdo da resposta será baixado imediatamente. O conteúdo da resposta é capturado como dados binários com a ajuda do content propriedade.

Requests também permite que você passe parâmetros em uma URL. Isso pode ser útil quando você está pesquisando em uma página da Web alguns resultados, como uma imagem ou tutorial específico. Você pode fornecer essas strings de consulta como um dicionário de strings usando o params palavra-chave na solicitação GET. Aqui está um exemplo:

1
import requests
2
3
query = {'q': 'Forest', 'order': 'popular', 'min_width': '800', 'min_height': '600'}
4
req = requests.get('https://pixabay.com/en/photos/', params=query)
5
6
req.url
7
# returns 'https://pixabay.com/en/photos/?order=popular&min_height=600&q=Forest&min_width=800'

Fazendo uma solicitação POST

Fazer uma solicitação POST é tão fácil quanto fazer solicitações GET. Você acabou de usar o post() método em vez de get(). Isso pode ser útil quando você está enviando formulários automaticamente. Por exemplo, o código a seguir enviará uma solicitação de postagem para o httpbin.org domain e gere a resposta JSON como texto.

1
import requests
2
3
req = requests.post('https://httpbin.org/post', data = {'username': 'monty', 'password': 'something_complicated'})
4
req.raise_for_status()
5
6
print(req.text)
7
'''

8
{

9
  "args": {},

10
  "data": "",

11
  "files": {},

12
  "form": {

13
    "password": "something_complicated",

14
    "username": "monty"

15
  },

16
  "headers": {

17
    "Accept": "*/*",

18
    "Accept-Encoding": "gzip, deflate",

19
    "Content-Length": "45",

20
    "Content-Type": "application/x-www-form-urlencoded",

21
    "Host": "httpbin.org",

22
    "User-Agent": "python-requests/2.28.1",

23
    "X-Amzn-Trace-Id": "Root=1-63ad437e-67f5db6a161314861484f2eb"

24
  },

25
  "json": null,

26
  "origin": "YOUR.IP.ADDRESS",

27
  "url": "https://httpbin.org/post"

28
}

29
'''

Você pode enviar essas solicitações POST para qualquer URL que possa processá-las. Por exemplo, um de meus amigos criou uma página da Web onde os usuários podem inserir uma palavra e recuperar seu significado junto com a pronúncia e outras informações usando uma API. Podemos fazer uma solicitação POST para o URL com nossa palavra consultada e salvar o resultado como um .html página conforme abaixo:

1
import requests
2
3
word = 'Pulchritudinous'
4
filename = word.lower() + '.html'
5
6
req = requests.post('https://tutorialio.com/tools/dictionary.php', data = {'query': word})
7
req.raise_for_status()
8
9
with open(filename, 'wb') as fd:
10
    fd.write(req.content)

Execute o código acima e ele retornará uma página que contém informações sobre a palavra conforme a imagem abaixo.

Colocar solicitação de respostaColocar solicitação de respostaColocar solicitação de resposta

Envio de cookies e cabeçalhos

Conforme mencionado anteriormente, você pode acessar os cookies e cabeçalhos que o servidor envia de volta para você usando req.cookies e req.headers. As solicitações também permitem que você envie seus próprios cookies e cabeçalhos personalizados com uma solicitação. Isso pode ser útil quando você deseja, digamos, definir um agente de usuário personalizado para sua solicitação.

Para adicionar cabeçalhos HTTP a uma solicitação, você pode simplesmente passá-los em um dict ao headers parâmetro. Da mesma forma, você também pode enviar seus próprios cookies para um servidor usando um dict passou para o cookies parâmetro.

1
import requests
2
3
url = 'http://some-domain.com/set/cookies/headers'
4
5
headers = {'user-agent': 'your-own-user-agent/0.0.1'}
6
cookies = {'visit-month': 'February'}
7
8
req = requests.get(url, headers=headers, cookies=cookies)

Os cookies também podem ser passados ​​em um Cookie Jar. Eles fornecem uma interface mais completa para permitir que você use esses cookies em vários caminhos. Aqui está um exemplo:

1
import requests
2
3
jar = requests.cookies.RequestsCookieJar()
4
jar.set('first_cookie', 'first', domain='httpbin.org', path='/cookies')
5
jar.set('second_cookie', 'second', domain='httpbin.org', path='/extra')
6
jar.set('third_cookie', 'third', domain='httpbin.org', path='/cookies')
7
8
url = 'http://httpbin.org/cookies'
9
req = requests.get(url, cookies=jar)
10
11
req.text
12
13
# returns '{ "cookies": { "first_cookie": "first", "third_cookie": "third" }}'

Objetos de Sessão

Às vezes, é útil preservar determinados parâmetros em várias solicitações. O objeto Session faz exatamente isso. Por exemplo, ele manterá os dados do cookie em todas as solicitações feitas usando a mesma sessão. O objeto Session usa o pool de conexões de urllib3. Isso significa que a conexão TCP subjacente será reutilizada para todas as solicitações feitas ao mesmo host. Isso pode aumentar significativamente o desempenho. Você também pode usar métodos do objeto Requests com o objeto Session.

Aqui está um exemplo de várias solicitações enviadas com e sem o uso de sessões:

1
import requests
2
3
reqOne = requests.get('https://tutsplus.com/')
4
reqOne.cookies['_tuts_session']
5
#returns 'cc118d94a84f0ea37c64f14dd868a175'

6
7
reqTwo = requests.get('https://code.tutsplus.com/tutorials')
8
reqTwo.cookies['_tuts_session']
9
#returns '3775e1f1d7f3448e25881dfc35b8a69a'

10
11
ssnOne = requests.Session()
12
ssnOne.get('https://tutsplus.com/')
13
ssnOne.cookies['_tuts_session']
14
#returns '4c3dd2f41d2362108fbb191448eab3b4'

15
16
reqThree = ssnOne.get('https://code.tutsplus.com/tutorials')
17
reqThree.cookies['_tuts_session']
18
#returns '4c3dd2f41d2362108fbb191448eab3b4'

Como você pode ver, o cookie de sessão tem um valor diferente na primeira e na segunda solicitação, mas tem o mesmo valor quando usamos o objeto Session. Você obterá um valor diferente ao experimentar este código, mas também no seu caso, o cookie para as solicitações feitas usando o objeto de sessão terá o mesmo valor.

As sessões também são úteis quando você deseja enviar os mesmos dados em todas as solicitações. Por exemplo, se você decidir enviar um cookie ou um cabeçalho user-agent com todas as solicitações para um determinado domínio, poderá usar objetos Session. Aqui está um exemplo:

1
import requests
2
3
ssn = requests.Session()
4
ssn.cookies.update({'visit-month': 'February'})
5
6
reqOne = ssn.get('http://httpbin.org/cookies')
7
print(reqOne.text)
8
# prints information about "visit-month" cookie

9
10
reqTwo = ssn.get('http://httpbin.org/cookies', cookies={'visit-year': '2017'})
11
print(reqTwo.text)
12
# prints information about "visit-month" and "visit-year" cookie

13
14
reqThree = ssn.get('http://httpbin.org/cookies')
15
print(reqThree.text)
16
# prints information about "visit-month" cookie

Como você pode ver, o "visit-month" o cookie de sessão é enviado com todas as três solicitações. No entanto, o "visit-year" o cookie é enviado apenas durante a segunda solicitação. Não há menção ao "vist-year" cookie no terceiro pedido também. Isso confirma o fato de que cookies ou outros conjuntos de dados em solicitações individuais não serão enviados com outras solicitações de sessão.

Conclusão

Os conceitos discutidos neste tutorial devem ajudá-lo a fazer solicitações básicas a um servidor passando cabeçalhos, cookies ou strings de consulta específicos. Isso será muito útil quando você estiver tentando coletar informações em algumas páginas da Web. Agora, você também poderá baixar automaticamente arquivos de música e papéis de parede de diferentes sites depois de descobrir um padrão nas URLs.

Aprenda Python

Aprenda Python com nosso guia completo de tutorial de Python, esteja você apenas começando ou seja um programador experiente procurando aprender novas habilidades.

Deixe uma resposta