Extraindo dados de HTML com Python + lxml

Fala pessoal, tudo certo? O motivo do sumiço violento após o GDD é bem conhecido: projetos pessoais. Conforme a plataforma vai encorpando também vai tomando mais tempo. De qualquer forma tem sido muito bom e os posts sobre lições aprendidas já estão sendo preparados.

Desta vez gostaria de compartilhar mais algumas experiências que tive durante o desenvolvimento de uma de minhas idéias. Desta vez vou falar sobre o (re)trabalho de atualização do mecanismo do GameShop para aquisição de dados e preços de jogos. O sistema original rodava na plataforma .Net utilizando a biblioteca Html Agility Pack para realizar o garimpo dos dados além da biblioteca Quartz.Net para controlar o agendamento e execução das tarefas em períodos de tempo específicos.

Neste cenário, as tarefas de aquisição dos dados via web e “parse” do html dividiam os maiores tempos de execução. Algumas das lojas em que o sistema faz a busca de preços apresenta código html extremamente poluído e mal formatado, o que dificulta e aumenta o tempo de processamento do parser. Outro problema que preocupava eram as manutenções necessárias para corrigir pequenos desvios causados por alterações no html realizadas pelas lojas, e neste ponto não há fuga pois não podemos controlar o html gerado pelas lojas, apenas cuidar para que o impacto disso na extração dos dados não seja grande. Com impacto grande quero dizer, também, que a manutenção para corrigir estes desvios deve ser simples e mais rápida possível.

Pensando nisses problemas resolvi reescrever o sistema em Python utilizando a biblioteca lxml. A escolha do Python vem justamente pela simplicidade nas alterações e não necessidade de compilação do código fonte para que seja executado, agilizando o processo de manutenção. Com relação ao mecanismo de parser lxml, fiz algumas pesquisas na internet e acabei me deparando com este excelente artigo, onde o autor faz um benchmark entre os mais conhecidos parsers de html/xml para Python. O artigo demonstra a superioridade desta biblioteca inclusive sobre classes nativas do Python (o lxml é baseado na biblionteca libxml2 escrita em C) justificando totalmente sua escolha.

Para o agendamento da execução do serviço ainda estou estudando as possibilidades existentes em Python que permitam o mesmo grau de maleabilidade com os horários que o Quartz.net proporciona. Até o momento não encontrei nenhuma solução que se adeque ao meu servidor (Windows) mas assim que decidir postarei aqui novamente para expor a solução.

Até breve.

This entry was posted in Tecnologia and tagged , , , , , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *