Raspagem de dados

dados

O conceito de raspagem de dados, ou data scrapping, não é novo. De acordo com a página americana da Wikipédia, desde os primórdios da informática já havia a necessidade e soluções para se obter dados a partir da tela do computador, ou seja, obter os dados que estão em telas, relatórios e outros formatos que não são convencionais.

Com o surgimento da internet, cada vez mais dados são publicados on-line. Porém a maioria destes dados não é pronta para ser consumida, sob o ponto de vista de um banco de dados, e ser transformada em informação relevante. Isso quer dizer que é preciso, de alguma maneira, obter os dados publicados nos seus mais variados formatos, limpá-los e armazená-los em um formato que possa ser facilmente manipulado.

Na área de banco de dados já existe uma sigla que resume este processo: ETL. Um processo ETL (Extract Transform Load – Extração Transformação Carga) é adotado periodicamente ou esporadicamente e sua função é a extração de dados de diversos sistemas, a transformação desses dados conforme regras de negócios e, por fim, a transferência dos dados para um local de armazenamento. Geralmente utiliza-se ferramentas ETL que possuem recursos para a manipulação de diversos formatos de dados, como arquivos texto, PDF, HTML, XML, dados relacionais, DBF, etc. durante o processo ETL. Além disso, as ferramentas específicas para se implementar o processo ETL contam com mecanismos para modificar, complementar, consolidar, acrescentar, transformar, apagar e muitas outras formas de manipular dados antes de enviá-los ao seu destino final.

Devido à peculiaridade, à variação de formato e até à forma de disponibilizar os dados na internet, as ferramentas que fornecem suporte para implementar ETL não são capazes de obter e manipular os dados on-line muito bem. Devido a isso, muitas pessoas começaram a chamar o processo de obtenção e manipulação de dados on-line de raspagem de dados e criar ferramentas para auxiliar a obtenção de dados. Já existem até livros que abordam este assunto focando em como implementar a raspagem de dados em linguagens específicas. Faz muito sentido pensar em ETL em um ambiente corporativo, pois algumas pesquisas recentes indicam que aproximadamente 80% do total de informação corporativa são armazenados em dados não estruturados.

Lembro-me de que uma das primeiras vezes em que ouvi o termo raspagem de dados foi durante a conferência Transparência Hack Day, realizada em 2009. Neste evento diversos projetos foram apresentados para obter dados visando ao ativismo digital, em especial para a área de fiscalização, ao acompanhamento político e também à obtenção de notícia e fotos. Este projetos sugerem que a obtenção de dados públicos pode facilitar e tornar transparente o acompanhamento de ações políticas, destino de recursos, causas e efeitos de atitudes, conscientização e outros fins. Contudo, é preciso separar a parte técnica envolvida na obtenção e na manipulação dos dados da parte que apresenta, interpreta e faz uso dos dados.

Focando na parte técnica, geralmente as ferramentas de raspagem de dados se baseiam na premissa de que o dado está dentro de uma página HTML disponibilizada em um site. Neste cenário a raspagem de dados se resume na obtenção e na manipulação destes dados, geralmente por meio de um script que acessa o código fonte da(s) página(s) HTML, faz uma cópia local deste conteúdo, aplica alguma regra para a obtenção do dados em si (geralmente através de uma expressão regular ou instruções SQL) e joga os dados em uma tabela de um banco de dados. Apesar de existirem outras fontes de dados OnLine, como arquivos PDF, imagens, animações flash, podcasts, planilhas on-line e outros, o princípio das ferramentas que fazem raspagem de dados segue o mesmo conceito básico.

O uso de scripts é feito devido à facilidade e à quantidade de recursos que podem ser empregados na raspagem de dados. Geralmente este script contém uma chamada para uma ferramenta ou instrução que faz uma requisição web por meio de um POST ou GET, que são comandos do protocolo HTTP. Depois de obter a página, o script geralmente salva o seu conteúdo em um arquivo no disco ou faz um parser no mesmo, ou seja, lê o código da página e obtém o dado que é relevante. Devido à variedade de formatos, layouts, designs e outros fatores visuais encontrados nas páginas da web, geralmente os scritps de raspagem de dados são customizados para uma determinada fonte.

Como exemplo, posso citar o projeto Legisdados, um projeto para agregar software de extração de dados do Legislativo Brasileiro. A iniciativa partiu dos projetos CongressoAberto e ParlamentoAberto que, como fica claro pelos nomes, têm muito em comum. Para evitar repetição de esforços e desacoplar extração de dados de aplicações escritas usando esses dados, o projeto agrega scripts de raspagem de dados relativos ao poder Legislativo. A idéia é aumentar a colaboração entre os dois projetos e incentivar o surgimento de novas aplicações.

Atualmente já existem algumas ferramentas e produtos além de projetos independentes para a raspagem de dados. Destaco o Yahoo! Query Language (YQL), uma excelente linguagem que pode ser utilizada em conjunto com a plataforma Yahoo! Pipes. Além disso, existem diversas outras ferramentas que permitem a raspagem de dados, como apresentado no link na parte final do artigo.

Uma rápida pesquisa por ferramentas de screen scraper em qualquer buscador vai retornar uma quantidade considerável de ferramentas para a raspagem de dados. Porém, por mais adequada que seja a ferramenta, sempre é preciso algum nível de customização ou, na maioria das vezes, algum esforço de programação.

Para quem acompanha as minhas colunas aqui no iMasters pode ter percebido que eu já escrevi uma coluna onde acabei precisando criar um pequeno script para a raspagem de dados. A coluna em questão chama-se Estatísticas do canal #cparty, onde tive que obter os dados do canal #cparty fornecido pelo Livestream do BlogBlogs e que poderia ser atualizado por vários meios. Na sequência apresentarei os 6 passos que utilizei para obter os dados que estavam separados em várias páginas HTML. Destaco que estes 6 passos podem ser utilizados como um pequeno guia para quem está pensando em montar um script ou utilizar uma ferramenta de raspagem de dados.

1. Entenda a fonte de dados

Antes de obter o dado on-line é preciso conhecer muito bem a fonte de dados. Isso quer dizer que é preciso navegar pela página, verificar se as informações são paginadas, colocadas em uma tabela, frame, área dinâmica ou controle, se requerem um login, se são disponibilizadas em um arquivo, possuem acesso via API, seguem algum padrão de apresentação e organização e outros detalhes relevantes. No exemplo da #cparty eu estudei a página e vi que apenas certa quantidade de dados eram apresentados na página do Livestream. Como eu queria todos os dados de certo período, eu tive que entender o parâmetro da URL utilizada na parte de arquivos. Isso quer dizer que a cada requisição do tipo GET eu precisava passar um parâmetro da página que gostaria de consultar.

Este tipo de atitude é comum. Fazer raspagem de dados com certeza vai acabar envolvendo a manipulação de parâmetros de uma URL, principalmente quando não se deseja obter todos os dados de um vez só, ou seja, são necessários filtros. Novamente, aqui não há regra: cada site da web possui um jeito de apresentar informações, porém para evitar a sobrecarga geralmente algum tipo de paginação é feita, que pode apresentar a forma de links com o número da página, controles do tipo combo-box ou outros. Em alguns casos é preciso até fornecer parâmetros de pesquisa em um controle e forçar um POST para se chegar os dados ao invés de simplesmente fazer uma requisição do tipo GET.

Há casos mais complexos onde é preciso realizar um login antes ou até elaborar alguma maneira de se ler um dado que não está armazenado em texto, como dados colocados dentro de uma figura, animações flash ou arquivos PDFs. Nestas situações é preciso primeiro entender o que é necessário para se obter o dados para só depois pensar na tecnologia necessária para se extrair o dado e transformá-lo no formato adequado.

2. Planejar como será feita a obtenção bruta dos dados

Uma vez que é já se conhecem os detalhes da fonte de dados é hora de planejar como será planejada a obtenção dos dados. Isso quer dizer é preciso relacionar ferramentas, ambiente, plataforma, link de internet e outros recursos tecnológicos necessários para se obter os dados. Aqui também não há uma regra geral, pois cada situação pode requerer uma ferramenta específica. Por exemplo, se o dado está armazenado em uma imagem pode ser preciso utilizar uma biblioteca OCR ou algo similar para se obter o dado. Outra situação envolve animações em flash, estruturas de dados em JavaScript, aplicativos em Java, silverlight ou algo assim. Obter dados que estão dentro destas tecnologias pode ser complexo, porém não impossível.

No exemplo eu decidi utilizar um script em SQL por conveniência, uma vez que tenho experiência nesta linguagem. Planejei montar um script que faria uma chamada a um executável no console com o objetivo de obter a página em um arquivo texto. Esta chamada foi colocada dentro de um loop onde criei dinamicamente o número da página na URL que seria passada como parâmetro para o aplicativo de código livre wget.exe para plataforma Windows. Este pequeno programa wget.exe recebe como parâmetro a URL da página e o arquivo texto onde será armazenado o código HTML. Após o loop eu joguei todas as páginas em um único arquivo HTML.

Depois de capturar os dados eu teria um arquivo texto grande com todo o conteúdo das páginas. Apesar de conter os dados que eu queria, o arquivo também tinha muitas tags HTML que não me interessavam e que foram removidas em um passo posterior.

3. Programar a captura dos dados

Uma vez que o planejamento estava pronto, bastou programar o script que montava o loop e fazer a chamada ao arquivo wget.exe. Neste ponto me deparei com alguns detalhes de implementação, como a necessidade de criar um arquivo .bat para poder chamar o arquivo wget.exe.

Geralmente a implementação da raspagem de dados envolve muitos detalhes específicos, como a utilização de bibliotecas no script, a criação de nomeclaturas para os arquivos, a alocação de espaço em disco e outros detalhes técnicos. Vale a pena lembrar também que neste passo de programação é preciso efetuar testes e também considerar questões de desempenho e acesso aos dados. Algumas páginas da Web podem perceber que estão recebendo muitas requisições simultâneas de um mesmo endereço IP e bloquear o acesso. Para isso, faça testes que possam ajudar a identificar problemas quando o script da raspagem for executado.

4. Verificar os dados capturados e realizar a limpeza

Após programar e executar o script que faz a raspagem de dados é preciso verificar se tudo ocorreu bem e se os dados brutos realmente foram capturados. Aqui não é preciso realizar uma verificação completa, e sim apenas checar se o processo automático realmente capturou os dados.

Na maioria das situações a raspagem de dados não trará os dados já prontos e no formato adequado, a não ser que isso seja planejado desde o começo by design. Isso quer dizer que geralmente muito do que foi capturado precisa ser limpo e transformado em informação que realmente pode ser manipulada da maneira desejada.

Aqui temos algumas opções que envolvem trabalhar diretamente no que foi capturado ou jogar tudo em um local que forneça recursos para manipulação dados. Os bancos de dados atuais trabalham muito bem com a linguagem SQL, que é feita sob medida para tornar fácil a manipulação de dados. Porém existem diversas outras ferramentas que permitem o uso de expressões regulares para limpar os dados, em especial a linguagem Perl e vários comandos do shell do Unix, que também conta com o conveniente mecanismo de redirecionamento de dados conhecido como pipes.

Na maioria das vezes é preciso eliminar dados irrelevantes que vieram junto com os dados desejados. No exemplo da #cparty todo o HTML da página que não continha o que foi escrito no Twitter deveria ser eliminado. Optei por carregar todo o arquivo com os dados capturados em uma tabela com uma única coluna contendo caracteres sem limites. A separação em linhas foi feita de acordo com os caracteres separadores de final de linhas (CR+LF). Aliás, quem trabalha com raspagem de dados em texto deve estar preparado para conhecer bem certos caracteres especiais, especialmente os caracteres de controle.

Já com os dados carregados em uma só tabela eu complementei o script com diversas instruções UPDATE e DELETE que eliminaram as linhas que eu não queria. Além disso, pude utilizar a instrução SELECT para prototipar as chamadas às funções que manipulam strings (SUBSTRING, REPLACE, etc) e montar as colunas com os dados no formato que eu precisava.

5. Carregar no banco de dados e adequar os dados ao formato modelado

Uma vez que já se tenha realizado a limpeza nos dados e outras manipulações, recomenda-se colocar os dados em um formato que seja adequado. Este passo muitas vezes requer a modelagem de uma ou mais tabelas em um banco de dados visando à integração com um sistema ou com uma ferramenta que possa fazer a visualização de dados de forma gráfica. Além disso, as ferramentas de relatórios ou de mineração de dados podem exigir um formato proprietário que pode ser facilmente gerado através de ferramentas de importação e exportação dos banco de dados.

Destaco que a modelagem é uma tarefa muito importante, principalmente quando se fala em integração com dados já existentes que estão separados em várias tabelas. Aqui é preciso tomar cuidado na ordem de inserção, pois relacionamentos de chave primária e chave estrangeira forçam a integridade relacional do banco de dados e requerem uma ordem específica de inserção, deleção e atualização dos dados.

No exemplo da #cparty foi fácil criar uma tabela a partir da instrução SELECT que já separava corretamente as colunas da tabela. Fiz isso utilizando a cláusula INTO da instrução SELECT, pois no SQL Server esta cláusula permite a criação de uma tabela a partir do que a instrução SELECT retornar. Porém tive também que adequar os dados obtidos ao formato dos tipos de dados do SQL Server, o que deu certo trabalho. Foi especialmente complicado adequar a data da mensagem devido ao formato necessário para a inserção desta data no tipo de dados DATETIME do SQL Server.

Quanto todos os dados já estavam armazenados na tabela fiz questão de criar índices e também uma chave primária artificial para que a manipulação apresentasse uma performance razoável. Como utilizei o site ManyEyes para realizar algumas visualizações, tive que exportar os dados para outro arquivo texto já com as palavras separadas por cada dia do evento.

6. Deixar a solução pronta para ser utilizada novamente

Algumas raspagens de dados precisam ser periódicas, ou seja, devem ser executadas com alguma freqüência. Nestes casos vale a pena incrementar o script e montá-lo de forma que possa ser chamado várias vezes e em vários horários automaticamente.

Isso implica em planejamento de armazenamento, expurgo de dados, horário de execução e recursos adicionais como backup, garantia de largura de banda e backup. A forma de implementar a reutilização do script varia de plataforma para plataforma, porém a maioria dos bancos de dados e o próprio sistema operacional contêm ferramentas, funcionalidades e maneiras de se criar tarefas agendadas, cujo resultado de execução pode ser acompanhado posteriormente.

No exemplo da #cparty não houve a necessidade de executar o script de raspagem de dados novamente, pois o que eu queria era obter apenas a quantidade de dados de um período fechado. Porém nem todas as soluções seguem esta idéia e podem precisar de extração de dados periódica.

Para terminar, destaco a questão do uso e da disponibilização dos dados. Ao contrário do que muitos podem pensar, nem tudo que é colocado na internet é público e pode ser utilizado como bem entender. Existem muitos dados que são publicados na internet, independente da sua origem/site, que estão protegidos por copyright ou outro modelo de licença. Infelizmente nem sempre é possível obter informações sobre a licença do dados, porém, em caso de dúvida, é preciso adotar uma postura ética e perguntar para quem está disponibilizando a informação e como ela pode ser utilizada.

 

Fonte: Desmonta&CIA

Anúncios

About Desmonta&CIA

Somos um blog que busca informar aos apaixonados por tecnologia tudo sobre o mundo de TI.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: