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