Otimização/Refatoração do Crawler,
Opened this issue · 0 comments
O nosso atual crawler para o site da camara dos deputados está organizado da seguinte maneira:
O crawler em si é uma task localizado no arquivo: https://github.com/teresinahc/peba/blob/master/lib/tasks/crawler.rake
A classe CamaraCollector
é responsável por realizar a atualização dos dados a partir da requisição do arquivo XML e de outras consultas pontuais realizadas para recuperar informações não presentes neste XML.
No método abaixo é feito o fetch da lista de deputados. Esta execução é cessária para atualizar a lista de deputados pois frequentemente algum deputado sai da sua gestão para assumir algum outro cargo. E precisamos atualizar a lista com os deputados suplentes.
def recuperar_deputados
url = "http://www.camara.gov.br/SitCamaraWS/Deputados.asmx/ObterDeputados"
content = self.fetch(url).body
lista_deputados = CamaraParser.parse_deputados(content)
CamaraUpdater.update_deputados(lista_deputados)
end
Já no método recuperar_cota_parlamentar
recuperamos o arquivo que possui a cota parlamentar de todos os deputados e repassamos a responsabilidade para o parser que é a parte mais critica do código.
def recuperar_cota_parlamentar
content = self.fetch_zip("http://www.camara.gov.br/cotas/AnoAtual.zip", "AnoAtual")
content.each_line(separator = '</DESPESA>') do |line|
despesa = CamaraParser.parse_cota_parlamentar(line)
if despesa.present?
CamaraUpdater.update_cotas_parlamentares(despesa)
end
end
end
Existem vários detalhes neste parser. Como este arquivo é gerado "diariamente" (ou pelo menos deveria ser) existem várias falhas na associações entre deputados e gastos.
Talvez o que esteja dificultando um pouco da interpretação do código é que existem poucas classes com bastante responsabilidades. Uma refatoração inicial para delegar as responsabilidades e o tratamento de anomalias no momento de parsear os gastos de um fomato (.csv) para a nossa database(mysql) que esteja dificultando a interpretação do código, e uma possível melhora na perfomance e na testabilidade do código.