Automatizando a coleta de dados públicos [aprendendo webscraping com Python]

Thiago Carvalho
8 min readMar 28, 2019

--

Eu sempre fui fascinado por esse mundo da organização de dados produzindo informações úteis para tomada de decisão. É algo que me trouxe para o meu atual emprego num primeiro momento como prestador de serviços e, mais tarde, por concurso, continuei trabalhando com isso por anos a fio … até hoje.

Uma das grandes dificuldades que sempre encontrei no dia a dia foi/é justamente a extração de dados das mais variadas fontes. Os processos de ETL (do inglês Extract, Transform and Load ou Extração, Transformação e Carga) sempre existiram e sempre existirão como atividade de backend, mas, nos dias atuais da ciência de dados tem se tornado um conhecimento primordial e básico para o iniciante neste mundo.

Seja usando ferramentas visuais como o SSDT (SQL Server Data Tools) e “desenhando” pacotes para o Integration Services do SQL Server no estilo arrastar e soltar do Windows — bastante comum no nosso dia a dia na CAIXA –, seja através de scripts em bash ou powershell você precisa ter ideia de como o processo funciona.

Basicamente extraímos informação de tudo: planilhas do excel, arquivos texto (os famosos flat files), bancos de dados do access… mas, e quando não temos acesso a fonte de dados e somente temos uma página web como interface para consulta? Como fica?

A uns 3 anos atrás eu me vi nessa situação diante de um grande desafio… foi então que me vi enveredando pelo mundo do web scraping ou raspagem de dados. Você ficaria assombrado em saber que muitos serviços que conhecemos fazem isso diariamente: Buscapé, todas as grandes redes de lojas (Americanas, Casas Bahia, Ponto Frio, Submarino…. Amazon) …

A técnica é utilizada por eles para fazer captura e comparação de preços de produtos nos concorrentes , a fim de se manter os preços no seu site com valores compatíveis. Ou, no caso do Buscapé, fazer comparação de preços que tanto nos ajudam!

Qual é a lógica? Como isso funciona?

O web scraping é uma técnica que consiste na obtenção de dados a partir de sites da internet, lendo o seu conteúdo e aproveitando a informação que nos é necessária.

Existem várias ferramentas pagas para se fazer isso mas, como eu não tinha orçamento para tal, tive que me inteirar sobre uma forma de fazer isso de graça.

Foi então que eu comecei a me aventurar no mundo do Python.

O Python é uma linguagem de programação extremamente versátil, de uma simplicidade incrível, utilizada hoje por qualquer grande empresa que você conhece: da Pixar ao Google, da Globo.com a Lojas Americanas.

A linguagem vale a pena ser aprendida pois suas construções extremamente simples facilitam em muito o trabalho com estruturas de dados.

A lógica por trás da raspagem de dados é muito simples: você precisa de um “robô” que acesse o site que você quer consultar e, que efetue os cliques que você teria que fazer na página para obter os dados que precisa. Esse robô precisa executar essa tarefa com precisão e rapidez, e ser capaz de fazer uma leitura da página de resultado, separando então os dados de interesse para que você os tenha de forma estruturada.

O Python possui uma série de bibliotecas e conectores que facilitam esse trabalho, permitindo que essa tarefa seja feita com certa tranquilidade.

Um exemplo inicial

A ideia inicial deste artigo era que você soubesse que isso existe. Mas, não consegui me segurar e tive que fazer um exemplo.

Na prática, vamos implementar um spider (como é chamado o robô que faz esse trabalho… spider = aranha, web = teia…. acho que você entendeu 😊) em Python. Nosso spider será capaz de consultar um site na web, executar algumas ações nessa página e obter os dados que precisamos gerando como resultado um arquivo texto que poderá ser tratado/importado.

O que vamos precisar?

Vamos usar o Python 3.7 e um editor de texto. Explico mais a frente as bibliotecas necessárias.

Para o exemplo que vamos construir acessaremos nosso site usando o Google Chrome.

Raspagem de dados com Python

“Data scraping é uma técnica computacional na qual um programa extrai dados de saída legível somente para humanos, proveniente de um serviço ou aplicativo. Os dados extraídos geralmente são minerados e estruturados em um formato padrão como CSV, XML ou JSON.”[1]

O que nós estamos nos propondo a construir é um programa capaz de realizar um serviço que muitas vezes faz parte da nossa rotina: consultar páginas e extrair dados que estão sendo exibidos para posterior consolidação/organização.

A técnica como eu disse é muito utilizada por grandes portais de redes varejistas para se obter informação do preço de produtos em concorrentes. Para nosso cotidiano é uma técnica interessante para obter dados de portais que não geram arquivos de exportação (sejam em flat files, planilhas ou outros), para posterior tratamento/uso.

Nosso alvo neste exemplo com propósitos puramente acadêmicos (😉) é o SIDRA — Sistema IBGE para Recuperação Automática.

Confesso que não é o melhor alvo pois o SIDRA é extremamente bem construídos, gerando vários tipos de saídas de dados, permitindo a exportação em formatos diversos, impressão e personalização de visualizações.

Contudo, servirá para nosso propósito de demonstrar um processo de ETL na prática.

Começando

Primeiramente certifique-se que tem a versão 3.7 do Python.

Nós utilizaremos algumas bibliotecas que não são instaladas por padrão.

Para isso, você vai precisar do utilitário pip (Python Package Index), num terminal.

Se sua instalação está correta, ao abrir um terminal do Windows (cmd.exe) e digitar ‘pip -V’, você verá algo assim:

pip rodando no shell no windows

Isso significa que estamos com o interpretador corretamente instalado, seu gerenciador de pacotes está funcionado e setado no path do seu sistema. Caso tenha problemas nesta fase, existem bons tutoriais na internet sobre a instalação e configuração do python em vários sistemas operacionais.

Com o pip nós vamos instalar três pacotes (ou bibliotecas):

· Selenium

· BeautifulSoup

· Pandas

Para tanto execute os três comandos a seguir, aguardando sempre a finalização do anterior para executar o próximo. O pip fará o trabalho de instalação dos pacotes e dependências deixando o ambiente pronto para nossa tarefa:

pip install selenium

pip install beautifulsoup4

pip install pandas

Conhecendo um pouquinho mais essas bibliotecas

O pandas talvez seja a biblioteca mais famosa do python. Ela fornece uma estrutura de dados manipulável extremamente poderosa. Para quem conhece R, vai associar a estrutura do pandas com um dataframe. Ele permite montar e manipular matrizes de forma muito flexível executando operações sobre os dados armazenados.

O BeautifulSoup é um biblioteca que permite a manipulação de estruturas XML e HTML. Facilita a navegação/análise da árvore de tags/atributos dessas estruturas (na computação esse processo é chamado de parsing).

Já o Selenium, é literalmente nosso ‘motorista’. Ele permite controlarmos os principais navegadores existentes a partir do Python, executando comandos nesses aplicativos.

Como vamos utilizar o chrome como nosso navegador neste exemplo, você vai precisar de um software chamado chromeDriver, para versão do chrome que você possui instalada.

Você irá encontra-lo no endereço: http://chromedriver.chromium.org/downloads

Neste teste eu utilizo a versão 73.0.3683.86 (Versão oficial) 64 bits do chrome, baixando o driver específico para esta versão (73) do meu navegador e sistema operacional.

Com esse conjunto, sabendo de suas funcionalidades, vamos uma breve porção de código.

Escrevendo o código

Bom, cada biblioteca que instalamos tem uma função bem específica, juntas formam uma poderosa solução de captura e estruturação de dados.

Nosso objetivo é acessar a página do SIDRA e capturar a tabela do IPCA que consta nesta página (https://sidra.ibge.gov.br/home/ipca/brasil)

SIDRA — Tabela do IPCA, nosso “alvo”

Basicamente precisamos:

1. Abrir o navegador

2. Navegar até esse endereço

3. Localizar na página a tabela

4. Capturar os dados salvando de forma ordenada num arquivo de saída.

Para entendermos a complexidade do que vamos extrair, o primeiro passo é analisar código fonte da página para verificar se (a) os dados são carregados imediatamente ao abrir o arquivo, ou (b) se existe uma chamada assíncrona (ajax) para esses dados.

Clique com o botão direito da página, e clique em “Ver código fonte da página”.

Na janela que se abre, procure pelo termo que estamos buscando, neste caso, “ipca”.

Vamos ter de analisar a página para verificar se conseguimos identificar a estrutura alvo.

Você verá algo assim em alguma parte dessa página:

Código fonte da página alvo

Veja que conseguimos localizar!

Os dados estão “seguros” em uma tabela do HTML (tag table) e, para nossa alegria, ela está convenientemente separada dentro de um elemento “div” identificado por um “id”.

Lembre-se que o nosso spider, precisa de uma ‘teia’ para se mover, o quanto mais fácil conseguirmos identificar a teia por onde nosso robô passará, melhor para nós.

Agora, é estruturar o código. Optei pelo seguinte:

· Separar a captura em uma classe e o parser em outra

· Implementei uma função simples de auxílio para ir nos informando em que passo estamos

O propósito aqui foi tentar escrever um código simples, da forma mais didática possível, mesmo assim, deixei vários comentários no código, explicando passo a passo o que eu fiz (abaixo endereço para o projeto no github).

Testando! Vendo a mágica acontecer!

Agora é só testar.

Para tanto, o chromeWebdriver deve estar — descompactado — na mesma pasta do seu projeto.

Para rodar o programa no terminal você vai fazer algo assim:

python nomeDoArquivo.py

O chrome gentilmente vai te avisar ele está sendo executado por um programa externo durante a execução do nosso robô.

Janela do Chrome sendo gentil :-)

Você vai acompanhar a saída na tela naqueles pontos em que marcamos no código alguma saída (método aguarde da classe Captura):

Resultado impresso em tela

Ao final da execução, seu dataframe do pandas é exibido na tela com os dados capturados que também são gravados no nosso arquivo CSV criado (C:\TEMP\base.csv).

Arquivo CSV de destino

Bom, eu acho que você já entendeu o conceito e as inúmeras possibilidades dessa técnica, não é verdade? 😉

Aprofunde-se nessas bibliotecas, a documentação é bem completa.

Espero ter contribuído um pouco mais com vocês!

Pyssar bem!

[1] Fonte: https://pt.wikipedia.org/wiki/Raspagem_de_dados

--

--