Como executar solicitações HTTP com Python - Parte 2 - A biblioteca de solicitações

Como executar solicitações HTTP com Python - Parte 2 - A biblioteca de solicitações

No artigo anterior, vimos como executar solicitações básicas de HTTP usando a biblioteca padrão do Python3. Quando os pedidos se tornam mais complexos, ou apenas queremos usar menos código, e não nos importamos em adicionar uma dependência ao nosso projeto, é possível (e às vezes até recomendado) usar o externo solicitações de módulo. A biblioteca, que adotou o lema "HTTP para humanos", será o foco deste artigo.

Neste tutorial, você aprenderá:

  • Como executar solicitações HTTP com o Python3 e a biblioteca 'solicitações'
  • Como gerenciar as respostas do servidor
  • Como trabalhar com sessões


Solicitações HTTP com Python - PT. II: a biblioteca de solicitações

Requisitos de software e convenções usadas

Requisitos de software e convenções de linha de comando Linux
Categoria Requisitos, convenções ou versão de software usada
Sistema Independente do OS
Programas Python3 e a biblioteca "solicitações"
Outro Conhecimento dos conceitos básicos de programação orientada a objetos e python
Convenções # - requer que os comandos Linux sejam executados com privilégios root diretamente como usuário root ou por uso de sudo comando
$ - Requer que os comandos do Linux sejam executados como um usuário não privilegiado regular

Executando solicitações com a biblioteca "solicitações"

Na primeira parte desta série, realizamos solicitações básicas de HTTP usando apenas a biblioteca padrão. Quando os pedidos se tornam mais complexos, por exemplo, quando precisamos preservar os cookies entre um pedido e outro, podemos usar o solicitações de Biblioteca externa, que simplifica nosso trabalho, realizando muitas operações sob o capô para nós. Como a biblioteca não está incluída em uma instalação padrão do Python3, devemos instalá -la em nosso sistema antes que possamos usá -lo. Um método independente de distribuição para realizar a tarefa é usar pip, O gerenciador de pacotes Python:

$ PIP3 Solicitações de instalação -usuário


Agora que instalamos a biblioteca, vamos ver alguns exemplos de como usá -la.

Executando um pedido de get

Lembre -se da solicitação que fizemos usando as APIs da NASA, para recuperar a "imagem do dia" para uma data específica? Construindo e enviando o mesmo pedido com o solicitações de A biblioteca requer apenas uma linha de código:

>>> Solicitações de importação >>> Resposta = solicitações.Get ("https: // API.NASA.gov/planetário/apod ", params = " api_key ":" Demo_key "," Date ":" 2019-04-11 ") 
cópia de

Passamos o URL e os parâmetros de consulta (ainda como um dicionário), respectivamente como o primeiro e o segundo argumento do pegar função. O que essa função retorna? Ele retorna uma instância do solicitações de.modelos.Resposta aula. Interagir com as instâncias desta classe é muito fácil. Queremos recuperar o conteúdo codificado por JSON da resposta? Fácil! Nós só precisamos ligar para o JSON Método do objeto:

>>> resposta.JSON () 'DATE': '2019-04-11', 'Explicação': 'Como é um buraco negro? Para descobrir, os telescópios de rádio de todo o mundo coordenaram as observações de '' buracos negros com os maiores horizontes de eventos conhecidos no ' ... 'Vizinhança imediata do buraco negro no centro de nossa galáxia da Via Láctea.',' hdurl ':' https: // apod.NASA.Gov/apod/imagem/1904/m87bh_eht_2629.JPG ',' Media_type ':' Image ',' Service_version ':' V1 ',' Title ':' Primeira imagem em escala de horizonte de um buraco negro ',' url ':' https: // apod.NASA.gov/apod/imagem/1904/m87bh_eht_960.jpg ' 
cópia de

Queremos obter a resposta do servidor como uma string? Tudo o que precisamos fazer é acessar o texto propriedade:

resposta.texto

Da mesma maneira que podemos acessar ao razão, status_code e cabeçalhos do pedido. Nós apenas temos que acessar as respectivas propriedades:

>>> resposta.Razão 'OK' >>> Resposta.status_code 200 >>> Resposta.Cabeçalhos 'Server': 'OpenResty', 'Date': 'qui, 18 de abril de 2019 10:46:26 GMT', 'Content-Type': 'Application/JSON', 'codificação de transferência': 'Chunked', 'Conexão': 'Keep-alive', 'Vary': 'Acep-codinging', 'X-Ratelimit-Limit': '40', 'X-Ratelimit-Remaining': '39', 'Via': '1.1 VEGUR, HTTP/1.1 API-UBRELLA (APACHETRAFFICSERVER [CMSSF]) ',' AGE ':' ':' Max-Arane = 31536000; pré-carga ',' codificação de conteúdo ':' gzip ' 
cópia de

Baixando um arquivo

Baixar um arquivo também é muito fácil. Primeiro de tudo, temos que usar o fluxo parâmetro do pegar função. Por padrão, este parâmetro está definido como Falso, E isso significa que o corpo da resposta será baixado de uma só vez. Como podemos querer baixar um arquivo grande, queremos configurá -lo como Verdadeiro: Dessa forma, apenas os cabeçalhos da resposta serão baixados imediatamente e a conexão permanecerá aberta para que possamos processá -la como queremos:



>>> Último.núcleo.org/pub/linux/kernel/v5.X/Linux-5.0.7.alcatrão.xz ">>> com solicitações.get (mais last_kernel_tarball, stream = true) como resposta: ... com open ("mais recente-kernel.alcatrão.xz "," wb ") como tarball: ... Para pedaços em resposta.iter_content (16384): ... Tarball.Escreva (Chunk) 
cópia de

O código é semelhante ao seu homólogo padrão da biblioteca: o que mudou é o uso do iter_content método do objeto de resposta. No exemplo anterior, operamos dentro de um loop de tempo, que interrompemos apenas quando o conteúdo da resposta foi consumido. Usando esse método, podemos escrever no arquivo de destino de uma maneira mais elegante, pois podemos iterar no conteúdo da resposta. O iter_content Método aceita o argumento opcional tamanho do pedaço, um Inteiro indicando o tamanho do pedaço em bytes (os dados a serem lidos na memória em cada iteração).

Enviando dados codificados pelo formulário ou JSON em um pedido

Enviando dados codificados pelo formulário (por exemplo, em uma solicitação de postagem) com a biblioteca "solicitações", requer menos código do que a mesma operação executada apenas usando a biblioteca padrão:

>>> request_data =  ... "variável1": "value1", ... "variável2": "value2" ... >>> resposta = solicitações.post ("https: // httpbin.org/post ", dados = request_data) 
cópia de

Para passar os mesmos dados, mas como JSON:

resposta = solicitações.post ("https: // httpbin.org/post ", json = request_data)

Usando o JSON Parâmetro da função, nem precisamos nos preocupar em codificar a string usando JSON.lixões: será feito para uso sob o capô.

Carregando um arquivo

O upload de um arquivo usando a biblioteca padrão pode ser uma tarefa muito tediosa, mas é muito fácil usando o solicitações de biblioteca. Digamos que queremos fazer upload de uma foto:

>>> Resposta = solicitações.publicar( ... "https: // httpbin.org/post ", arquivos = 'arquivo': aberto ('NASA_BLACK_HOHOL.png ',' rb ')) 
cópia de

Código impressionantemente curto! Nós realizamos um publicar solicitação, desta vez usando o arquivos argumento. Este argumento deve ser um dicionário em que a chave é o "nome" do campo e o valor é um objeto de arquivo, neste caso retornado pelo abrir função.

E os outros verbos http? Cada um deles é usado com a função nomeada de acordo: colocar, excluir, cabeça ou opções. Todos eles podem ser usados ​​com basicamente a mesma interface que os que vimos antes.

Trabalhando com sessões

O solicitações de Biblioteca nos permite usar Sessões: Quando os pedidos são enviados de um contexto de sessão, os cookies são preservados entre uma solicitação e outra. Esta é a maneira recomendada de executar várias solicitações para o mesmo host, pois mesmo o mesmo TCP A conexão será reutilizada. Vamos ver como criar uma sessão e enviar uma solicitação:

>>> sessão = solicitações.Sessão () >>> resposta = sessão.get ("https: // httpbin.org/cookies/conjunto?lastName = Skywalker ") 
cópia de

Criamos uma instância do solicitações de.Sessão classe, e, em vez de executar um pedido por si só, como fizemos em exemplos anteriores, usamos o método nomeado após o verbo http ((pegar neste caso) que é usado da mesma maneira. O URL da solicitação, desta vez, foi http: // httpbin.org/cookies/conjunto, um terminal que nos permite definir os parâmetros de cookie que enviamos na sequência de consultas. A ligação que fizemos definiu um cookie que agora está armazenado na sessão e será usado em todos os pedidos enviados do sessão contexto. Para listar todos os cookies associados a uma sessão, podemos acessar o biscoitos propriedade, que é uma instância do solicitações de.biscoitos.Requestscookiejar ' aula:

>>> sessão.biscoitos  >>> # Acesse as teclas de cookies ...sessão.biscoitos.keys () ['SounName'] >>> >>> # Acesse os valores dos cookies ...sessão.biscoitos.valores () ['Skywalker'] >>> >>> # O método Iterkeys retorna um iterador de nomes de cookies ...sessão.biscoitos.iterkeys ()  >>> # O método de itevalues ​​faz o mesmo, mas para valores ...sessão.biscoitos.itevalues ​​()  
cópia de

Para limpar os cookies armazenados na sessão, podemos usar o claro método:

>>> sessão.biscoitos.claro () >>> sessão.biscoitos  
cópia de

Crie um objeto de solicitação

Até agora, apenas usamos funções como pegar, publicar ou colocar que basicamente criam e enviam solicitações "em tempo real". Há casos em que queremos construir um Solicitar objeto, mas não queremos enviá -lo imediatamente. Aqui está como podemos fazer isso:

>>> solicitação = solicitações.Request ("get", "https: // httpbin.org/get ")

O primeiro argumento do Solicitar Construtor é o verbo que queremos usar e o segundo, o URL de destino. Os mesmos parâmetros que usamos quando enviamos uma solicitação diretamente podem ser usados: cabeçalhos, params, dados, JSON e arquivos. Uma vez que criamos um Solicitar Devemos "prepará -lo" antes que possamos enviá -lo:



>>> sessão = solicitações.Sessão () >>> solicitação = solicitações.Request ("get", "https: // httpbin.org/get ") >>> preparado_request = sessão.preparar_request (solicitação) >>> resposta = sessão.send (preparado_request) 
cópia de

Também poderíamos preparar um Solicitar usando o preparar Método do Solicitar se objete, em vez de ligar sessão.prepare_request, Mas, nesse caso, o pedido perderia as vantagens de fazer parte da sessão.

Levante uma exceção quando o código de status da resposta não for 200

O código de status retornado por um servidor quando uma solicitação é bem -sucedido é 200. Quando algum erro acontece, por exemplo, quando um recurso não é encontrado ou quando não estamos autorizados a acessá -lo, outros códigos são retornados (neste caso 404 e 403, respectivamente). Quando isso acontece e queremos que nosso código aumente uma exceção, devemos chamar de Raise_for_status Método do solicitações de.modelos.Resposta objeto. Vamos ver como o código se comporta de maneira diferente quando o usamos. Enviamos uma solicitação de postagem para um ponto de extremidade que aceita apenas o verbo get:

>>> Resposta = solicitações.Post ('https: // httpbin.org/get ') >>> Resposta.status_code 405 >>> Resposta.razão 'método não permitido' 
cópia de

Como esperado, como usamos o verbo http errado, o código de status da resposta foi 405, e a “razão” correspondente é MÉTODO NÃO PERMITIDO, No entanto, nenhuma exceção foi levantada. Para deixar um pedido ruim levantar um exceção Devemos chamar o Raise_for_status Método depois de enviar a solicitação:

>>> Resposta = solicitações.Post ('https: // httpbin.org/get ') >>> Resposta.Raise_for_status () Traceback (Chamada mais recente por último): Arquivo "", linha 1, no arquivo "/usr/lib/python3.7/packages/solicitações/modelos do site.py ", linha 940, em raise_for_status raise httperror (http_error_msg, resposta = self) solicitações.exceções.Httperror: 405 Erro do cliente: Método não permitido para URL: https: // httpbin.org/get 
cópia de

Desde que ligamos Raise_for_status, Desta vez, o pedido aumentou um solicitações de.exceções.Erro HTTP exceção.

Conclusões

Neste artigo, o segundo da série sobre realizar a solicitação HTTP com Python, focamos
Sobre o uso do externo solicitações de biblioteca, que vamos realizar solicitações simples e complexas
Em poucas linhas de código. Quer saber mais sobre isso? A documentação oficial está a apenas um clique de distância!

Tutoriais do Linux relacionados:

  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Como configurar um servidor OpenVPN no Ubuntu 20.04
  • Mastering Bash Script Loops
  • Como trabalhar com a API de Rest WooCommerce com Python
  • Coisas para instalar no Ubuntu 20.04
  • Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
  • Loops aninhados em scripts de basquete
  • Como construir um aplicativo Tknter usando um objeto orientado…
  • Sistema Linux Hung? Como escapar para a linha de comando e…
  • Como lançar processos externos com Python e…