Skip to content
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

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

IgorJanuario
Copy link

[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 checklist
abaixo. NÃO ABRA um novo Pull Request antes de completar todos os items abaixo.

Checklist - Novo spider

  • Você executou uma extração completa do spider localmente e os dados retornados estavam corretos.
  • Você executou uma extração por período (start_date e end_date definidos) ao menos uma vez e os dados retornados estavam corretos.
  • Você verificou que não existe nenhum erro nos logs (log_count/ERROR igual a zero). Observação: Ele deu skipped nesse cara.
  • Você definiu o atributo de classe start_date no seu spider com a data do Diário Oficial mais antigo disponível na página da cidade.
  • Você garantiu que todos os campos que poderiam ser extraídos foram extraídos de acordo com a documentação.

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

Copy link
Member

@ogecece ogecece left a 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.

@IgorJanuario
Copy link
Author

@ogecece bora.
Me explica e vamos mandar bala.

Copy link
Member

@ogecece ogecece left a 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
Copy link
Member

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
Copy link
Member

@ogecece ogecece May 1, 2024

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.

Copy link
Member

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)
Copy link
Member

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)

Comment on lines +47 to +51
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}
)
Copy link
Member

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?

Suggested change
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.

Comment on lines +66 to +75
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}"
Copy link
Member

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)
Copy link
Member

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"]
Copy link
Member

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)
Copy link
Member

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.

Comment on lines +40 to +45
yield Gazette(
date=date,
file_urls=[file_url],
edition_number=edition_number,
power="executive_legislative",
)
Copy link
Member

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Manutenção] São José dos Basílios-MA
2 participants