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.11k stars 411 forks source link

Completar revisões para spiders feitos com scripts automatizados #1284

Open trevineju opened 1 month ago

trevineju commented 1 month ago

Considerando que avançamos o conhecimento em torno dos padrões de sites que municípios usam:

Passou a ser uma possibilidade fazer scripts que criam os arquivos das spiders, uf_municipio.py, a partir dos achados de mapeamento. Foram feitas algumas experimentações com as PRs a seguir usando diferentes padrões. Todas elas precisam de revisão humana do código (visto que todo o fluxo foi automatizado) e execuções de coletas-teste.

Esta issue registra esse escopo específico de PRs abertas e também gerencia o progresso dessas tarefas.

Tasks

Contribuições de revisão são bem-vindas! (comentando na PR que pretende revisá-la)

jjpaulo2 commented 1 month ago

Fiz esse script que me ajudou a validar os spiders do Maranhão. Acho que pode ajudar mais alguém, e talvez possamos melhorar isso pra incluir numa documentação ou dentro do próprio projeto.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import subprocess

from sys import argv
from datetime import date, timedelta
from pathlib import Path

if len(argv) <= 1:
    print('Você precisa fornecer um spider como argumento!')
    exit(127)

TODAY = date.today()
YESTERDAY = date.today() - timedelta(1)
MONTH_START = date.today() - timedelta(30)
DATE_FORMAT = '%Y-%m-%d'

SPIDERS = argv[1:]

def scrape(spider: str, output_file_name: str, params: list[str]):
    log_file = f'{spider}_{output_file_name}.log'
    csv_file = f'{spider}_{output_file_name}.csv'

    command = ['scrapy', 'crawl', spider]
    command.extend(params)
    command.extend(['-s', 'LOG_FILE=' + log_file, '-o', csv_file])
    subprocess.run(command)

    if 'log_count/ERROR' in Path(log_file).read_text():
        print(f'Erro encontrado no arquivo {log_file}!')

for spider in SPIDERS:
    scrape(
        spider=spider,
        output_file_name='yesterday',
        params=[
            '-a',
            'start_date=' + YESTERDAY.strftime(DATE_FORMAT)
        ]
    )
    scrape(
        spider=spider,
        output_file_name='interval',
        params=[
            '-a',
            'start_date=' + MONTH_START.strftime(DATE_FORMAT),
            '-a',
            'end_date=' + TODAY.strftime(DATE_FORMAT),
        ]
    )
    scrape(
        spider=spider,
        output_file_name='complete',
        params=[]
    )

Pra rodar, é só passar o nome dos spiders como parâmetros.

python tests/spiders.py ma_matoes_do_norte ma_paco_do_lumiar ma_pedreiras ma_pindare_mirim ma_santa_luzia_do_parua ma_trizidela_do_vale ma_vargem_grande ma_vila_nova_dos_martirios

Caso haja algum erro na coleta, ele mostra no console.

Erro encontrado no arquivo ma_pindare_mirim_yesterday.log!
Erro encontrado no arquivo ma_vila_nova_dos_martirios_yesterday.log!
trevineju commented 1 month ago

Fiz esse script que me ajudou a validar os spiders do Maranhão. Acho que pode ajudar mais alguém, e talvez possamos melhorar isso pra incluir numa documentação ou dentro do próprio projeto.

@jjpaulo2, que tal abrirmos uma issue para conversar sobre isso?

Poderia mesmo ter um recurso desses no repositório. E, no espaço da issue, a gente discutir outras verificações a serem incluídas, pq só buscar por 'log_count/ERROR' no log não é suficiente. A documentação sobre logs traz outras considerações e, também, o que foi coletado precisa ser visto (podendo ser o .csv ou o queridodiario.db -- usei o sqlite uma vez: https://github.com/okfn-brasil/querido-diario/pull/954#issuecomment-1830289419)

As PRs que comentou que revisaria também estava pensando em usar esse script, ne? Bora dar uma segurada nelas pra gente validar isso primeiro e aí passar a usar com consistência.

jjpaulo2 commented 1 month ago

Show! O que eu tô fazendo no momento é usar o script mais pra agilizar o trabalho de rodar os spiders. E depois eu vou passando nos arquivos de saída um a um, procurando problemas.

Se a gente incrementar essas validações, talvez nem precisaria mais olhar os arquivos de saída.