teresinahc/peba

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.