Interagindo com servidores HTTP com Python

Ensinamento de como interagir com páginas de internet de forma simples e fácil por meio da biblioteca requests do Python. Várias coisas são ensinadas, dentre elas como baixar arquivos de páginas, logar em sites, fazer requisições simples e criar sessões.

[ Hits: 953 ]

Por: Vitor Marques em 20/11/2018 | Blog: https://github.com/10Seeker10/


Introdução



Estamos constantemente interagindo com servidores por meio de nossos navegadores, fazendo logins em sites, assistindo à vídeos e requisitando informações constantemente. Porém a mesma coisa que um humano pode fazer por meio de um navegador, um programa de computador também consegue, afinal tudo se resume ao protocolo HTTP (Hypertext Transfer Protocol), que fornece páginas HTML ao navegador e este, por sua vez, interpreta tais páginas e deixa de forma arrumada ao cliente.

Neste artigo irei ensinar a interagir com servidores HTTP, fazer requisições, logins em site, download de conteúdo, tudo por meio do Python. Para isso usarei o módulo requests, ele não é builtin do Python, logo é necessário instalá-lo com o seguinte comando no terminal:

pip install requests

Vale salientar que para um melhor compreendimento do artigo é necessário que o leitor possua um conhecimento básico do protocolo HTTP, a linguagem de marcação HTML e claro, de Python.

Fazendo uma requisições simples

Primeiramente importaremos o módulo requests:

import requests

Usaremos agora o método requests.get() para fazer uma requisição GET ao Google, tal requisição retornará um objeto que armazenaremos em uma variável 'resp'.

resp = requests.get('http://www.google.com.br')

Se tudo correr bem, nenhuma exceção será lançada, há vários atributos que podemos usar do objeto retornado veja:
  • resp.status_code - Contém o código HTTP de resposta, ex: 200, 300, 303.
  • resp.cookies - Retorna os cookies.
  • resp.url - Retorna a url final, útil em casos de redirecionamento.
  • resp.text - Contém o HTML da página requisitada.
  • resp.json - Converte a resposta direto em JSON, útil para requisições à APIs.
  • resp.content - Retorna o conteúdo da página, por exemplo o binário de um PDF ao invés de seu HTML.

Com o HTML de resposta obtido por meio do atributo 'text', é possível fazer a análise, porém tal tópico ficará para outro artigo. Simplesmente printarei a resposta, é importante converter para string primeiramente.

print('O resultado da sua requisição é {}'.format(str(resp.text)))

Enviando cabeçalhos ao servidor

Fizemos uma requisição crua até agora, sem User-Agent, Referer e outras informações importantes de uma requisição HTTP. Tais funcionalidades podem ser facilmente implementadas dessa forma:

cabecalhos = {'User-Agent': 'Debian', 'Refereer'}
resp = requests.get('http://www.google.com.br', allow_redirects=True, headers=cabecalhos)

Para enviar informações no cabeçalho basta criar um dicionário com um par chave:valor, de forma que a chave seja o campo, como o User Agent e o valor deste campo. Uma vez feito isto, é necessário passar o cabeçalho como um parâmetro para o método com 'headers=dicionario_dos_cabecalhos'.

Alterei o parâmetro allow_redirects para True afim de permitir possíveis redirecionamentos.

Enviando payloads ao Servidor

Ao enviar payload poderemos preencher formulários HTML, ou seja, enviar nomes de usuário e senha por exemplo.

payload = {'username': 'ilovelinux', 'password': 'whatever'}
resp = requests.post('http://www.sitealeatorio.com.br', allow_redirects=True, data=payload)

Primeiramente deve-se criar um dicionário com o nome do input HTML a ser preenchido e seu respectivo valor.

Depois enviaremos ao servidor por meio do método requests.post haja vista que postaremos uma informação no site, logo usufruiremos da funcionalidade POST do HTTP. Basta acrescentar o parâmetro 'data=payload_a_ser_enviado'.

É importantíssimo salientar que as informações devem ser postadas em uma determinada url que muitas vezes não é a mesma onde o formulário HTML se encontra. Deve ser postada para onde o formulário é enviado, isto pode ser visto no atributo action='url_a_ser_postada' da tag
no formulário HTML da página.

Criando sessões nos servidores

Até agora não criamos nenhuma sessão no servidor o que pode causar um certo problema, pois cada requisição será tratada independentemente, não podendo assim por exemplo permanecer logado em um site. Para isso criaremos uma sessão com requests.session().

sessao = requests.session()
resp = sessao.get('http://www.google.com.br')

Criando uma sessão e armazenando em uma variável podemos agora por meio deste objeto fazer as requisições dos jeitos já ensinados, porém substituindo o 'requests' por 'objeto_contendo_sessao'. Desse jeito as requisições não são mais independentes.

Baixando um arquivo

Baixar um recurso de uma URL é extremamente fácil, usaremos apenas o atributo content da resposta e armazenaremos em um arquivo localmente.

resp = request.get('http://www.sitedospdfs.com.br/arquivo1.pdf')
with open('arquivo1.pdf', 'wb') as f:
	f.write(resp.content)

É importante que o arquivo local seja aberto no modo de escrita binário para evitar problemas de compatibilidade, porém de resto funcionará para vários tipos de arquivos.

Indo Além

Visto o básico da biblioteca requests e sua interação com os servidores HTTP, ainda há muito estudo para aqueles interessados em interação com a web. Para os que desejem ir além recomendo o estudo dos seguintes tópicos:
  • Biblioteca urllib para requisições HTTP, é outra biblioteca também muito interessante com algumas funcionalidades a mais que a requests.
  • Parsing e análise de HTML com a biblioteca bs4(Beautiful Soap) e expressões regulares, pretendo publicar um artigo falando a respeito.
  • Outras interações com a web, servidores ftp com ftplib, pop com poplib, imap com imaplib, smtp com smtplib, ssh com pxssh contido no pexpect(pretendo também escrever a respeito).

Espero que possa ter aprendido com esse artigo, até mais!

   

Páginas do artigo
   1. Introdução
Outros artigos deste autor

Introdução a Threads e como implementá-las em Python

Construindo um portscanner TCP com Python

Leitura recomendada

Python - Threads

Introdução a Threads e como implementá-las em Python

Sockets em Python

PEP 8 - Guia de estilo para código Python

Arduino com Bluetooth e pySerial

  
Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts