-
-
Notifications
You must be signed in to change notification settings - Fork 382
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
[Issue][1008]Criado um novo spider para o novo site de São José dos Basílios-MA #1030
base: main
Are you sure you want to change the base?
[Issue][1008]Criado um novo spider para o novo site de São José dos Basílios-MA #1030
Conversation
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.
@IgorJanuario, obrigado pelo PR de correção!
Executei uma raspagem completa no raspador e está funcionando.
Peguei a revisão desse PR agora e vi que tem alguns pontos de melhoria (ex: o uso de uma classe base onde não há outros exemplos do mesmo sistema e também a cobertura do sistema siganet estar completamente contida no novo raspador).
Você ainda tem interesse/disponibilidade de fazer as alterações? Se sim, aí posso fazer uma revisão completa e indicar os pontos de mudança.
@ogecece bora. |
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.
@IgorJanuario tá aí o/
@@ -5,3 +5,4 @@ flake8 | |||
isort | |||
pre-commit | |||
pip-tools | |||
tzdata |
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.
A biblioteca não está sendo explicitamente usada e pode ser removida dos requirements.
spidermon | ||
tzdata |
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.
A biblioteca tzdata
não está sendo explicitamente usada e pode ser removida dos requirements.
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 esse raspador só tem um exemplo de município sendo utilizado com ele, não precisamos criar um raspador base. Esse código pode ser movido para a MaSaoJoseDosBasiliosSpider
em data_collection/gazette/spiders/ma/ma_sao_jose_dos_basilios.py
(sugiro a alteração do nome do arquivo pois não vejo mais necessidade em mantermos o siganet, detalhes em outro comentário).
class MaSaoJoseDosBasiliosSpider(SjdbmaGazetteSpider): | ||
TERRITORY_ID = "2111250" | ||
name = "ma_sao_jose_dos_basilios_2023" | ||
start_date = datetime.date(2018, 2, 19) |
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 start_date
aqui seria 27/11/2015 de acordo com o que temos no site agora. Verificando todas as datas de publicação nos dois sistemas, vemos que o novo sistema contém todos os diários do antigo. Assim, podemos excluir o outro raspador baseado no siganet para manter apenas esse.
(o nome poderá ficar sem o _2023
no final)
last_page = self.get_last_page(response) | ||
if page < last_page: | ||
yield scrapy.Request( | ||
url=self.get_url(page + 1), cb_kwargs={"page": page + 1} | ||
) |
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.
Aqui dá pra simplificar bastante buscando pelo link para a próxima página, sem lidar com a lógica de página atual e última página. O que acha?
last_page = self.get_last_page(response) | |
if page < last_page: | |
yield scrapy.Request( | |
url=self.get_url(page + 1), cb_kwargs={"page": page + 1} | |
) | |
next_page_url = response.css("a.page-link[rel='next']::attr(href)").get() | |
if next_page_url: | |
yield scrapy.Request(url=next_page_url) |
Dessa maneira, também poderíamos deixar de usar o .get_url()
e .start_requests()
e a URL .BASE_URL
seria usada apenas no .start_urls
.
def get_pdf_url(self, response_item): | ||
""" | ||
Gets the url for the gazette inside one of the 'div#edicoes-anteriores' table | ||
""" | ||
download_link = ( | ||
response_item.css("td:nth-child(1) a::attr(href)").get().split("#") | ||
) | ||
url_base = self.allowed_domains[0] | ||
download_base = download_link[0] | ||
return f"https://{url_base}{download_base}" |
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.
Aqui vc poderia usar o response.urljoin()
se a response
fosse um dos argumentos. O que acha?
Get the date for the gazette inside one of the 'div#edicoes-anteriores' table | ||
""" | ||
date = response_item.css("td:nth-child(3)::text").get().strip() | ||
date_cut = self.__format_date(date) |
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 código de .__format_date()
não precisava estar em um método a parte aqui. Acaba quebrando a sequência de leitura por conta de uma linha de código
date = response_item.css("td:nth-child(3)::text").get().strip() | ||
date_cut = self.__format_date(date) | ||
return dateparser.parse( | ||
date_cut, date_formats=["%d - %B - %Y"], languages=["pt"] |
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 formato de date_formats
só é válido para datas após 25/07/2023 e omitir esse argumento não está afetando o parsing de datas. Sugiro remover esse argumento
Get the edition number inside one of the 'div#edicoes-anteriores' table | ||
""" | ||
text_edition = response_item.css("td:nth-child(1) a::text").get().strip() | ||
return self.__cut_edition_number(text_edition) |
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.
Sugiro manter o código de .__cut_edition_number()
em .get_edition_number()
mesmo. São poucas linhas de código pra quebrar a leitura. E o seu código já está seguindo uma estrutura que me lembra "page object", que na minha visão já está bem organizado demais.
yield Gazette( | ||
date=date, | ||
file_urls=[file_url], | ||
edition_number=edition_number, | ||
power="executive_legislative", | ||
) |
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.
Notei que file_url
é na verdade a URL para uma página intermediária (exemplo) e não para o arquivo de diário. Seria necessário mais um método de parsing para então encontrar o link do diário (parece que o botão "Baixar PDF" entrega) e então criar o item Gazette
.
[Issue][1008]Criado um novo spider para o novo site de São José dos Basílios-MA
AO ABRIR um Pull Request de um novo raspador (spider), marque com um
X
cada um dos items do checklistabaixo. NÃO ABRA um novo Pull Request antes de completar todos os items abaixo.
Checklist - Novo spider
start_date
eend_date
definidos) ao menos uma vez e os dados retornados estavam corretos.log_count/ERROR
igual a zero). Observação: Ele deu skipped nesse cara.start_date
no seu spider com a data do Diário Oficial mais antigo disponível na página da cidade.Descrição
Foi necessário criar um novo spider. Criei baseado no doem.py
Esse spider foi criado para o site novo do São José dos Basílios-MA