okfn-brasil / querido-diario

📰 Diários oficiais brasileiros acessíveis a todos | 📰 Brazilian government gazettes, accessible to everyone.
https://queridodiario.ok.org.br/
MIT License
1.07k stars 391 forks source link

Adiciona código para mapeamento de sistemas replicáveis #921

Open trevineju opened 1 year ago

trevineju commented 1 year ago

Descrição Começa a desenvolver os scripts para mapeamento de sistemas replicáveis ( https://github.com/okfn-brasil/querido-diario/issues/919 ), adicionando uma classe base para mapeamento e os mapeadores para DOSP e SIGANET.

PR ainda sendo trabalhado

trevineju commented 1 year ago

Tenho alguns ajustes pra propor, mas o que queria endereçar primeiro é onde o código vai ficar. Duas possibilidades:

  1. Ficar em /scripts, e aí iniciar um projeto scrapy lá
  2. Ficar em /data_collection como está no PR, porém organizado de outra forma. a. Hierarquia de diretórios: Ao invés de abrir um novo diretório só para o mapeamento, poderia acomodar dentro da estrutura como está hoje: a classe base mapeador.py junto às demais classes bases do QD mesmo (onde tem doem, instar, etc), e aí as classes mapeadoras poderia ficar em um diretório mapeadores em spiders mesmo. b. Output: Não tenho certeza do melhor lugar para deixar o .csv gerado, mas acho que poderia ser apenas um arquivo, que será atualizado a cada rodada de mapeamento, ao invés de gerar um arquivo por interação.

Essa sugestão vai na esteira de outra ideia, de seguir agrupando os raspadores em diretórios por Estado (já tem PE, poderia ter os demais Estados tb). Visualizo o repositório ficando assim no futuro, a partir do diretório spiders:

--- base
    |--- adminlte.py
    |--- aplus.py
    |--- doem.py
    |--- ... outras bases
    |--- mapeador.py                               (novo)
--- pe
    |--- recife_2015.py
    |--- recife_2020.py
    |--- ... outros raspadores de PE               (novo)
--- ba                                             (novo)
    |--- ... raspadores da BA                      (novo)
... vários diretórios por UF e seus raspadores     (novo)
--- mapeadores                                     (novo)
    |--- mapeadorDoem.py                           (novo)
    |--- mapeadorDosp.py                           (novo)

O que vocês acham? @Winzen @ogecece @rennerocha

Particularmente, gosto dessa segunda ideia. Sei que misturar os raspadores de mapeamento entre os raspadores de cidades poderia gerar confusão, mas se juntar com uma organização geral do diretório (com os diretórios filhos por Estado), balanceia a solução; sem precisar iniciar outro scrapy project em scripts

trevineju commented 1 year ago

Fiz algumas atualizações no código. Dá uma reorganizada nas coisas, mas no geral, o principal que mudei tem a ver com como ficaram as classes filhas de Mapeador.

Originalmente (em commit hash), estava:

class MapeadorDosp(Mapeador):
    name = "dosp"
    format_url = "https://www.imprensaoficialmunicipal.com.br/@city"
    sep = "_"
    preference_state_code = "SP"

Novo desenho das classes filhas:

class Mapeador<NOME>(Mapeador):
    name = ""
    def new_column(self)
    def urls_pattern(self, city, state_code)
    def validation(self, response)
trevineju commented 1 year ago

Nessa correção, já adicionei mais um monte de outros mapeadores como vocês podem ver.

Já até rodei ontem uma coleta parcial: https://docs.google.com/spreadsheets/d/18cIxZxdugPBkBs4R-14oy2xqGr7CHJi4zuCqG8dKM0Y/edit#gid=2115781612

Acredito que os mapeadores DOEM, DOSP, INSTAR, SIGANET, ADIARIO e AJAXPRO estejam bons (mas não cliquei um a um, experimento apenas uma amostra).

Já outros, APLUS, ADMINLTE e IMPRENSAOFICIAL não estão muito bons. Precisa investigar se faltam formatos de url ou se é o validador que não está pegando os casos direito.

Em especial, o da Imprensa Oficial parava no meio da execução, apontando que o scrapy estava com muitos arquivos abertos. Reduzi as CONCURRENT_REQUESTS de 100 para 25 e resolveu.

Mas a boa notícia é que só estes mapeadores, ainda que nem todos excelentes por enquanto, já acharam mais de 700 urls pro QD ❤️ Parte destes 700 já conheciamos (vários DOEM e DOSP), mas muito bom termos mais informações do panorama.

trevineju commented 1 year ago

Após alguns ajustes, na nova versão estamos mapeando 2072 municípios de diário agregado (SIGPUB) e outros 1462 municípios em sistemas replicáveis, num total de 3174 cidades (uma mesma cidade pode aparecer em mais de um sistema).

Para conferir a validação, abri diversas URLs, porém não todas. Validei por amostra. Por isso, pode haver casos que passam. Estes sistemas replicáveis novos parecem publicar, em grande parte, como PDF texto, porém há casos de PDF Imagem e diários fragmentados. É necessário conferir os nomes dos mapeadores, pois alguns foram dados de forma artificial.

Completo

Executado todos os mapeadores deste PR, um arquivo único de mapeamento é gerado, com URLs válidas e URL inválidas, mas existentes.

Explorar o arquivo com as URLs inválidas é muito interessante, possibilita encontrar outros padrões.

Considerações

Para comparar os mapeadores, uma aba "Panorama" foi criada no link do Drive. Lá, são registradas algumas coisas:

Destaques

Arquivos individualizados

ADiario - arquivo: [ADIARIO] dados_mapeamento_parcial.csv AdminLTE - arquivo: não há. Agape - arquivo: [AGAPE] dados_mapeamento_parcial.csv Aplus - arquivo: [APLUS] dados_mapeamento_parcial.csv Barco - arquivo: [BARCO] dados_mapeamento_parcial.csv CONTECN - arquivo: [CONTECN] dados_mapeamento_parcial.csv CR2 - arquivo: [CR2] dados_mapeamento_parcial.csv

O sistema parece possibilitar diários únicos (exemplo) ou fragmentados (exemplo). O mapeador está coletando apenas os únicos.

DALINS - arquivo: [DALINS] dados_mapeamento_parcial.csv DIOENET - arquivo: [DIOENET] dados_mapeamento_parcial.csv DKC - arquivo: [DKC] dados_mapeamento_parcial.csv DOBR - arquivo: [DOBR] dados_mapeamento_parcial.csv DOEM - arquivo: [DOEM] dados_mapeamento_parcial.csv DOME - arquivo: [DOME] dados_mapeamento_parcial.csv DOSP - arquivo: [DOSP] dados_mapeamento_parcial.csv E-Atos - arquivo: [EATOS] dados_mapeamento_parcial.csv E-portal - arquivo: [EPORTAL] dados_mapeamento_parcial.csv Imprensa Oficial - arquivo: [IMPRENSA OFICIAL] dados_mapeamento_parcial.csv Instar - arquivo: [INSTAR] dados_mapeamento_parcial.csv IPM - arquivo: [IPM] dados_mapeamento_parcial.csv IWEB - arquivo: [IWEB] dados_mapeamento_parcial.csv JDOWN - arquivo: [JDOWN] dados_mapeamento_parcial.csv MAX - arquivo: [MAX] dados_mapeamento_parcial.csv MEGAS - arquivo: [MEGAS] dados_mapeamento_parcial.csv Nucleo GOV - arquivo: [NUCGOV] dados_mapeamento_parcial.csv PHOCA - arquivo: [PHOCA] dados_mapeamento_parcial.csv Portal Fácil - arquivo: [PORTALFACIL] dados_mapeamento_parcial.csv SAI IO - arquivo: [SAIIO] dados_mapeamento_parcial.csv SIASP - arquivo: [SIASP] dados_mapeamento_parcial.csv Siganet - arquivo: [SIGANET] dados_mapeamento_parcial.csv SigPub - arquivo: [SIGPUB] dados_mapeamento_parcial.csv Tres Tecnos - arquivo: [TREST] dados_mapeamento_parcial.csv Vale - arquivo: [VALE] dados_mapeamento_parcial.csv Sistema sem Nome A - arquivo: [SISTA] dados_mapeamento_parcial.csv Sistema sem Nome B - arquivo: [SISTB] dados_mapeamento_parcial.csv Sistema sem Nome C - arquivo: [SISTC] dados_mapeamento_parcial.csv

Casos ainda não mapeados, para serem atacados no futuro:

Sistemas replicáveis:

Associações:

trevineju commented 1 year ago

Deixei um comentário geral acima, tentando compartilhar conhecimento sobre a atividade, mas endereçando o que @ogecece trouxe em específico, sugiro o mapeador do adiario para integração.

rennerocha commented 1 year ago

Esse PR está ficando bem grande pra ser revisado de uma vez só. Sugiro que quando for fechar o rascunho pra colocar pra revisão que seja escolhido apenas um mapeador representativo pra gente validar como será feita a integração no repo primeiro e depois a gente ir adicionando os outros mapeadores.

Concordo com o @ogecece . Vai ser impossível revisar esse PR inteiro. Se queremos fazer scripts utilitários para essa busca, acredito que criar um de referência para definir a estrutura e depois fazer um PR para cada um.