Como executar solicitações HTTP com Python - Parte 2 - A biblioteca de solicitações
- 3481
- 164
- Maurice Champlin
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
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…
- « Como executar solicitações HTTP com Python - Parte 1 A Biblioteca Padrão
- Como executar solicitações HTTP com Python »