Hackeando Gastos Governamentais com Python 3

Hackeando Gastos Governamentais com Python 3

2017, Oct 14    

[UPDATE]: 09/11/2017

Ontem, 12 de outubro, aproveitei para publicar um pequeno projeto que desenvolvi em alguns dias. Postei nos grupos do Facebook Python Brasil e A.P.D.A., além da minha timeline. Obtive um feedback bem legal e maior do que eu esperava. E neste post iremos tratar sobre esse projeto.

É de conhecimento comum que dá pra fazer várias coisas com uma linguagem de programação. Aprender tudo sobre uma é praticamente impossível, para meros mortais. Por isso, é importante encontrar um foco. Em tese, deve ser algo desafiador e que desperte o interesse de quem está escrevendo os códigos. Eu fui atrás do meu foco, se encontrei eu não sei. Mas estou gostando de raspagem de dados.

Já acompanho há um tempo o trabalho do Professor Fernando Ashikaga. Ele ministra cursos e palestras sobre raspagem de dados. Acompanhei pelo YouTube uma dessas palestras realizada pela Roadsec SP.

A partir dessa palestra eu fiquei ainda mais interessado em raspagem de dados e pensei em me desafiar. E como atualmente se fala bastante em gastos e orçamento do governo, resolvi utilizar o Portal da Transparência do Governo Federal como objeto de estudo.

As Ferramentas

Comecei meus estudos pela documentação do Beautiful Soup[1]. Tinha que ser com Python. E nisso fui passando algumas noites aprendendo coisas novas, inclusive o Jupyter Notebook[2]. Eu utilizava mais o vim e o iPython. O Pyplot[3] foi utilizado para a plotagem dos gráficos.

Uma definição rápida sobre o Beautiful Soup:

"Beautiful Soup é uma biblioteca Python para extrair dados de arquivos HTML e XML. Ele funciona com o seu analisador favorito para fornecer maneiras idiomáticas de navegar, pesquisar e modificar a árvore de análise. Geralmente economiza horas ou dias de trabalho do programador."[1]

Agora, uma definição rápida sobre o Jupyter Notebook:

"O notebook amplia a abordagem baseada em console para a computação interativa em uma direção qualitativamente nova, fornecendo uma aplicação baseada na web adequada para capturar todo o processo de computação: desenvolvimento, documentação e execução de código, além de comunicar os resultados."[2]

E sobre o Pyplot:

"Matplotlib.pyplot é uma coleção de funções de estilo de comando que fazem Matplotlib funcionar como MATLAB. Cada função pyplot faz alguma alteração em uma figura: por exemplo, cria uma figura, cria uma área de traçado em uma figura, traça algumas linhas em uma área de traçado, decora o gráfico com rótulos, etc."[3]

O Desafio

O desafio teve como objetivo auxiliar na aprendizagem da técnica de raspagem de dados. Ele foi: realizar raspagem de dados no Portal da Transparência e apresentar graficamente os gastos diretos de alguns órgãos superiores, desde o início da inserção dos dados no portal até o ano atual. Os órgãos escolhidos foram: Presidência da República; Ministério da Ciência, Tecnologia, Inovação e Comunicações; Ministério da Educação; Ministério da Previdência Social; Ministério da Saúde; Ministério do Meio Ambiente; e Ministério do Esporte. Nenhum motivo especial foi utilizado na escolha desses órgãos.

Para isso, o primeiro passo foi verificar os padrões tanto das urls quanto do html das páginas, além de identificar os dados que devem ser extraídos. O html da página é igual para todos os anos e órgãos superiores, e os dados se encontram exatamente dentro das mesmas posições e marcações html. Depois de anotar esses padrões, passamos para o algoritmo.

Portal Transparencia

Portal Transparencia Fonte

O Algoritmo

Basicamente, o algorimto inicia com a captura da url referente a cada órgão superior, captura os dois valores de “class=colunaValor” pertencente a marcação “ <td>”, sendo o de interesse o segundo que é refente ao valor destinado ao órgão. Após isso, temos um tratamento para retirar o que não for de interesse, deixando apenas o valor do segundo  “class=colunaValor”. O valor de cada ano, após passar por esse tratamento, é adicionado dentro de uma lista. Essa string deve ser convertida em float para colocar todos os valores em uma única unidade, pois, como os gráficos devem representar esses dados, nada melhor do que deixá-los da forma mais amigável possível. A unidade escolhida foi bilhão de reais com base em todos os dados.

Dessa forma, temos para cada órgão superior uma lista de valores em bilhões de reais desde o ano de 2004 até o ano de 2017. Com isso, junto com uma lista contendo os anos (2004, 2005…, 2017), os gráficos foram plotados da forma Em bilhões de R$ (eixo y) X Ano (eixo x) para cada um deles. O código também possui uma função para plotar todos os órgãos em um único gráfico ou escolher quais queremos comparar.

Resultados

É possível gerar os gráficos por órgão superior, isso totaliza 7 gráficos. Somado a isso, o código permite plotar gráficos com mais de um órgão superior, o que é ideal quando se quer comparar gráficos. Abaixo são apresentados 4 gráficos, onde: a) compara os gastos entre todos os órgãos superiores já citados; b) mostra os gastos com a educação; c) mostra os gastos com a saúde; d) mostra os gastos com a previdência privada; e e) mostra os gastos com a presidência da república.

a) Gráfico 01

b) Gráfico 02

c) Gráfico 03

d) Gráfico 04

e) Gráfico 04

A intenção deste pequeno projeto foi somente a de aprender e praticar raspagem de dados utilizando Python. Em relação as análises acerca do momento econômico e político no qual o País vive(u) fica por conta do leitor. Vale ressaltar que esses valores são os divulgados pelo próprio Governo.

O código completo pode ser encontrado no meu GitHub: https://github.com/edsonlead/data_scraping/blob/master/001/. Ainda irei aplicar algumas melhorias e quem sabe outras funções. Caso tenha alguma sugestão ou comentário, faça bom uso das issues: https://github.com/edsonlead/data_scraping/issues ou no espaço para comentários aqui neste post.

Agradeço ao Juliano Garcia, Anderson Rezende e Roberto Sousa pela ajuda na representação gráfica dos dados, ao Prof Fernando Ashikaga pela inspiração e divulgação dos seus conhecimentos. E a todos que deram um feedback nas publicações que postei. Vocês me motivaram ainda mais.

Obrigado por ler até aqui. :)

Referências

1 https://www.crummy.com/software/BeautifulSoup/bs4/doc/

2 http://jupyter-notebook.readthedocs.io/en/latest/notebook.html

3 https://matplotlib.org/users/pyplot_tutorial.html