covid19-br
covid19-br copied to clipboard
[Feat] MA spider
Implementando spider para o estado do Maranhão.
Fontes usadas:
- Boletins em pdf de https://www.saude.ma.gov.br/boletins-covid-19/
- CSVs em https://www.saude.ma.gov.br/boletins-covid-19/
Esse spider:
- Faz o parse do boletim oficial pegando ✅ total oficial (pdf e as vezes no csv) ✅ dados dos municípios (nos csv's) ❌ dados importados (não são disponibilizados em nenhuma das fontes)
Débito:
-
Em alguns csv's (como https://www.saude.ma.gov.br/wp-content/uploads/2022/03/Dados-Gerais-0603.csv) rola um erro ao importá-lo para a rows. Não parece ser muito treta de resolver (segundo essa thread no stackoverflow), mas como não encontrei um jeito de usar esse modo na rows deixei um
todo
no código para fazer isso depois ao invés de dar uma volta para implementar uma forma alternativa de abrir esses csv's (sendo que isso poderia já estar implementado na rows e eu que mosquei kkk) 😄 (inclusive, se isso já estiver implementado na rows e eu que viajei me avisa que já mudo aqui ⭐ ) -
Queria saber sua opinião sobre criar testes para a parte de extração do total oficial do pdf. Como era uma coisa muito pequena eu não achei necessário criar um extractor para isso (e aí testar o extractor como fizemos nos outros estados). Mas se quiser posso criar o extractor para essa parte ser mais facilmente testável.
Esse CSV de exemplo foi criado de maneira bem estranha! Descobri que uma das questões dele é o encoding e também não podemos começar a ler da primeira linha (o cabeçalho mesmo vem depois). Talvez o ideal seja não ler com a rows -- fiz o código abaixo para ler esse exemplo, mas não sei se funciona nos outros CSVs:
filename = "Downloads/Dados-Gerais-0603.csv"
with open(filename, encoding="mac_iceland") as fobj:
reader = csv.reader(fobj, delimiter=";", lineterminator="\n")
header = None # Wait until find the header
for line in reader:
# Consider only non-empty lines and first 3 columns
line = [cell.strip() for cell in line[:3]]
if not any(line):
continue
elif not header:
if line[0] == "MUNICÍPIOS":
header = line
continue
print(dict(zip(header, line)))
Acho que por enquanto não precisamos dos testes para os totais.