-
-
Notifications
You must be signed in to change notification settings - Fork 409
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Novo spider base]: NucleoGov - Anápolis, GO #1147
base: main
Are you sure you want to change the base?
Conversation
Obrigada pela PR, @xxggabriel
Precisamos de mais municípios para revisar esta PR (pelo menos 5 é o que indicamos sempre nesses casos). Aqui, o que está em jogo é: o código Se você puder colocar o código para os demais 4 aqui, coloco sua PR na fila de revisão. Se puder adicionar os testes pra última edição e pro período arbitrário para cada um deles, seria ótimo. Como você disse que não consegue a coleta completa, poderia tentar para, pelo menos, 1 ano? Não faz a coleta completa (fazemos depois quando formos revisar), mas pelo menos a arbitrária ficaria com um intervalo maior que apenas um mês. |
…Paraná-TO, Jaú-TO, Valparaíso de Goiás-GO
Espero que isso atenda aos requisitos para revisão. Qualquer dúvida ou necessidade de ajuste, estou à disposição. Testes para Jaú:Testes para Paraná:Testes para Cariri:Testes para Valparaíso de Goiás: |
show, @xxggabriel!! Obrigada! PR adicionada à fila de revisão |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
o estilo do código está excelente, @xxggabriel! A simplicidade foi ótima! Deixei só um ajuste pra formatação da URL.
Entretanto, o desempenho da coleta vai precisar de melhorias. Nos logs que você anexou aqui temos alguns problemas:
go_valparaiso_de_goias.log:
10526: 'downloader/response_status_count/429': 1897
to_cariri_do_tocantins.log:
3315: 'downloader/response_status_count/429': 741,
to_jau_do_tocantins.log:
2277: 'downloader/response_status_count/429': 555,
to_parana.log:
3308: 'downloader/response_status_count/403': 3,
3309: 'downloader/response_status_count/429': 440,
Bora focar no erro 429 primeiro que tem mais ocorrências. A response 429 indica que o raspador teve uma taxa de requisição muito elevada e por isso o site parou de responder. É preciso contornar isso. Vejo que tem dois possíveis caminhos:
- alterar a lógica de acesso à API.
Emnuclegov.py
, a lógica de requisição pra API é diária. Isso significa que raspador acaba fazendo 2 requisições nesse caso: 1 para acessar a API para certo dia e outra para obter arquivo pdf. Para coletar 15 edições de diários oficiais, ele faz cerca de 30 requisições.
Olhando o endereço https://dom.anapolis.go.gov.br/api/diarios, aparece na parte de baixo:
"first_page_url":"https://dom.anapolis.go.gov.br/api/diarios?per_page=15&page=1","from":1,"last_page":18,
Parece ser possível navegar por paginação, sabendo que começa na página 1 e termina na 18. Nesse caso, 1 requisição vai indicar 15 diários. E para coletar 15 diários, 16 requisições foram feitas (1 pra API + 15 pros arquivos). Isso já vai reduzir bem a quantidade de requisições feitas.
Talvez dê para calibrar esse per_page
para valores um pouco mais altos (25? 30?) e experimentar se isso reduz ainda mais a quantidade de erros 429
no log. E nesse caso, também vai precisar tomar cuidado com o valor escolhido, para não forçar a API deles.
- Configurações personalizadas
Adicionarcustom_settings
à classenucleogov.py
e experimentar calibrações. Se vc fizer uma busca no repositório, vai encontrar exemplos dessa setting para dar uma olhada e também tem na documentação do Scrapy. Aqui seria um exercicio de forçar o raspador a diminuir a concorrência ou adicionar algum delay até descobrir a configuração que surge mais efeito.
As sugestões 1 e 2 podem não ser excludentes também, e ambas se fazerem necessárias. Mas tentaria a 1 primeiro.
Você poderia fazer essas modificações e testar novamente? Pode seguir coletando um intervalo de um ano se seu pc continuar com limitações, sem problemas.
def start_requests(self): | ||
days = rrule(freq=DAILY, dtstart=self.start_date, until=self.end_date) | ||
for day in days: | ||
yield scrapy.Request(self.url_base.format(day.strftime("%Y-%m-%d"))) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
como a string de acesso a API /api/diarios?data={}&calendar=true&situacao=2"
é igual em todas as classes filhas, nós temos adotado o padrão de deixar essa construção da URL na classe mãe, escondendo isso da classe filha e deixando mais simples o raspador do município.
yield scrapy.Request(self.url_base.format(day.strftime("%Y-%m-%d"))) | |
url = f"{self.url_base}/api/diarios?data={day.strftime('%Y-%m-%d')}&calendar=true&situacao=2" | |
yield scrapy.Request(url) |
url_base = ( | ||
"https://dom.anapolis.go.gov.br/api/diarios?data={}&calendar=true&situacao=2" | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reflete aqui a mudança na classe base
url_base = ( | |
"https://dom.anapolis.go.gov.br/api/diarios?data={}&calendar=true&situacao=2" | |
) | |
url_base = "https://dom.anapolis.go.gov.br" |
url_base = "https://diariooficial.valparaisodegoias.go.gov.br/api/diarios?data={}&calendar=true&situacao=2" | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reflete aqui a mudança na classe base
url_base = "https://diariooficial.valparaisodegoias.go.gov.br/api/diarios?data={}&calendar=true&situacao=2" | |
url_base = "https://diariooficial.valparaisodegoias.go.gov.br" |
url_base = ( | ||
"https://dom.cariri.to.gov.br/api/diarios?data={}&calendar=true&situacao=2" | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reflete aqui a mudança na classe base
url_base = ( | |
"https://dom.cariri.to.gov.br/api/diarios?data={}&calendar=true&situacao=2" | |
) | |
url_base = "https://dom.cariri.to.gov.br" |
url_base = "https://diariooficial.parana.to.gov.br/api/diarios?data={}&calendar=true&situacao=2" | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reflete aqui a mudança na classe base
url_base = "https://diariooficial.parana.to.gov.br/api/diarios?data={}&calendar=true&situacao=2" | |
url_base = "https://diariooficial.parana.to.gov.br" |
url_base = "https://diariooficial.jau.to.gov.br/api/diarios?data={}&calendar=true&situacao=2" | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reflete aqui a mudança na classe base
url_base = "https://diariooficial.jau.to.gov.br/api/diarios?data={}&calendar=true&situacao=2" | |
url_base = "https://diariooficial.jau.to.gov.br" |
Outra coisa que dei uma olhada, mas ainda não entendi bem é qual o reflexo do campo
mas você entendeu, @xxggabriel? chegou a olhar isso? |
AO ABRIR uma Pull Request de um novo raspador (spider), marque com um
X
cada um dos items da checklist abaixo. Caso algum item não seja marcado, JUSTIFIQUE o motivo.Layout do site publicador de diários oficiais
Marque apenas um dos itens a seguir:
Código da(s) spider(s)
custom_settings
em meu raspador.Testes
.log
deste teste está anexado na PR..log
e.csv
deste teste estão anexados na PR..log
e.csv
deste teste estão anexados na PR.Verificações
.csv
gerados pela minha coleta conforme a documentação não encontrando problemas..log
gerados pela minha coleta conforme a documentação não encontrando problemas.Descrição
Este pull request adiciona o spider base para o sistema NucleoGov, utilizando o mapeador (PR #1019).
Observacao
Ao analisar o NucleoGov, notei que existe outro sistema que lista decretos de forma individual via API. Não consegui listar as demais cidades, mas sei que existem municípios de outros estados que utilizam esse sistema. Neste link é possível acessar os decretos do município de Rio Verde, Goiás.
Após a aceitação deste PR, criarei os spiders das outras cidades que utilizam o NucleoGov:
Municípios que faltam ser integrados:
Testes
Devido ao intervalo de start_date ser de 2010, meu PC não tem espaço suficiente para fazer uma coleta completa.
Arquivos de teste:
ultima
go_anapolis.csv
go_anapolis.log
ultima_edicao_go_anapolis.log
maio/2024 - hoje