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

[Novo spider base]: BR Transparência #1155

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

Conversation

talesmota
Copy link

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:

  • O layout não se parece com nenhum caso da lista de layouts padrão
  • É um layout padrão e esta PR adiciona a spider base do padrão ao projeto junto com alguns municípios que fazem parte do padrão.
  • É um layout padrão e todos os municípios adicionados usam a classe de spider base adequada para o padrão.

Código da(s) spider(s)

  • O(s) raspador(es) adicionado(s) tem os atributos de classe exigidos.
  • O(s) raspador(es) adicionado(s) cria(m) objetos do tipo Gazette coletando todos os metadados necessários.
  • O atributo de classe start_date foi preenchido com a data da edição de diário oficial mais antiga disponível no site.
  • Explicitar o atributo de classe end_date não se fez necessário.
  • Não utilizo custom_settings em meu raspador.

Testes

  • Uma coleta-teste da última edição foi feita. O arquivo de .log deste teste está anexado na PR.
  • Uma coleta-teste por intervalo arbitrário foi feita. Os arquivos de .loge .csv deste teste estão anexados na PR.
  • Uma coleta-teste completa foi feita. Os arquivos de .log e .csv deste teste estão anexados na PR.

Verificações

  • Eu experimentei abrir alguns arquivos de diários oficiais coletados pelo meu raspador e verifiquei eles conforme a documentação não encontrando problemas.
  • Eu verifiquei os arquivos .csv gerados pela minha coleta conforme a documentação não encontrando problemas.
  • Eu verifiquei os arquivos de .log gerados pela minha coleta conforme a documentação não encontrando problemas.

Descrição

Foi criado um Spider baseado no modelo replicável.

Issue relacionada

Testes

ba_saude_today.csv
ba_rio_real_2023-01-01_2023-03-01.csv

ba_saude_today.log
ba_rio_real_all.log
ba_rio_real_2023-01-01_2023-03-01.log

@talesmota talesmota marked this pull request as draft June 10, 2024 18:40
@talesmota talesmota changed the title 1146 [Novo spider base]: BR Transparência Jun 10, 2024
@talesmota talesmota marked this pull request as ready for review June 10, 2024 18:42
@trevineju trevineju linked an issue Jun 10, 2024 that may be closed by this pull request
1 task
start_urls = [""]
br_tranparencia_entity = ""
br_tranparencia_code = ""
power = "executive"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@talesmota esse atributo não está especificado na clase BaseGazetteSpider , assim pensnado em flexibilidade não é recomendado a adição de atributos em classe-base

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oi, @victorfernandesraton! Fico contente com as suas considerações. O que você sugere?

Eu segui por esse caminho tendo em mente o Princípio Aberto-Fechado do SOLID. Com base nesse princípio e nas experiências que já tive em outros projetos, no momento da implementação, me pareceu apropriado especializar uma classe para tratar desse layout específico. Além disso, ao explorar o código, percebi que outros arquivos também fazem essa especialização de atributos, como:

  • data_collection/gazette/spiders/base/atende_layoutdois.py
  • data_collection/gazette/spiders/base/sai.py
  • data_collection/gazette/spiders/base/doem.py
  • data_collection/gazette/spiders/base/dionet.py

A ideia de listar os parâmetros explicitamente na superclasse foi justamente para deixar claro quais dados devem ser definidos nas classes filhas. Mas estou totalmente aberto a aprender o padrão de código de vocês para contribuir de forma cada vez mais alinhada.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pelo que vi realmente não temos outra alternativa, vou aprovar ao menos essa etapa

allowed_domains = ["www.camaraibicoara.ba.gov.br"]
start_urls = ["https://www.camaraibicoara.ba.gov.br/diario.html"]
start_date = date(2022, 12, 29)
br_tranparencia_entity = "63147391-dcb2-4d6c-9c5a-c4483a9d8306"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@talesmota normalmente nessas classes de RPA evitamos adicionar parâmetros que não sejam parâmetros-base quando podem ser evitados, penso que deveriamos ser capazes de fazer algum tipo de contulta ou mapeamento prévo em outro lugar para obter esses parâmetros de br_tranparencia_entity e br_tranparencia_code

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Esses dois parâmetros, br_tranparencia_entity e br_tranparencia_code, são bem específicos para esse tipo de layout, já que são definidos dentro do JavaScript da página. Por isso, optei por deixá-los para serem definidos nas classes filhas.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pelo que pesquisei, não há uma forma diferente de fazer a busca deste ID ao acessar o site

Copy link
Member

@ogecece ogecece Oct 4, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Se eu puder dar um pitaco aqui, se for só uma requisição do arquivo javascript antes de começar a raspagem pra valer, acho que vale fazer uns regex e obter os dois parâmetros (se funcionar bem pra todos os municípios do raspador).

Se não, vale documentar como obter os parâmetros em forma de docstring no raspador base.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Testando aqui pra Ibicoara e pra Itaquara, realmente seria só uma requisição a mais no início. E dá pra ver que tem diferenças, mas são poucas, então pode ser bem generalizável.

Ambos os arquivos requisitados são https://<domínio>/js/content.js mas o regex levaria em conta que podem ou não existir espaços em branco em entity = e code = .

Em Ibicoara:

//variaveis
var entity="691bea32-9b9f-40f8-ab18-31e079080a1a";
var code="CODE_ENT_CM204";
var url="https://api.brtransparencia.com.br/api";
var url2="https://api.brtransparencia.com.br";

...

Em Itaquara:

...

//variaveis
var entity = "1557447a-9381-44ad-9c0f-016868769479";
var code = "CODE_ENT_PM003";
var url = "https://api.brtransparencia.com.br/api";
var url2 = "https://api.brtransparencia.com.br";

...

Realmente acho que vale a pena conferir se generaliza legal pros outros municípios.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Boa @ogecece . Agradeço o feedback. Foi muito bem colocado.

Eu analizei aqui o cenário e fiz alguns testes aqui com essa regex, var {field}(\ )=(\ )"|'["|'];

E em ambos os casos ela foi capaz de extrair os códigos:

  • var entity = "1557447a-9381-44ad-9c0f-016868769479";
  • var entity="1557447a-9381-44ad-9c0f-016868769479";
  • var entity = '1557447a-9381-44ad-9c0f-016868769479';
  • var entity = '1557447a-9381-44ad-9c0f-016868769479';

Acho que chegamos em um nível de generalização bacana.

Adicionando o log dos novos testes:

ba_candeias_2023-01-01_2023-03-02.csv
ba_candeias_2023-01-01_2023-03-02.txt
5bac9ba5c8aec2e83d74684ca53ac373d85d715b.pdf

start_urls = [""]
br_tranparencia_entity = ""
br_tranparencia_code = ""
power = "executive"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pelo que vi realmente não temos outra alternativa, vou aprovar ao menos essa etapa

allowed_domains = ["www.camaraibicoara.ba.gov.br"]
start_urls = ["https://www.camaraibicoara.ba.gov.br/diario.html"]
start_date = date(2022, 12, 29)
br_tranparencia_entity = "63147391-dcb2-4d6c-9c5a-c4483a9d8306"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pelo que pesquisei, não há uma forma diferente de fazer a busca deste ID ao acessar o site

@victorfernandesraton
Copy link
Contributor

@talesmota aprovado, não encontrei mais nada a se comentar

@talesmota talesmota requested a review from ogecece October 6, 2024 20:04
@ogecece
Copy link
Member

ogecece commented Oct 9, 2024

@talesmota vi que requisitou minha revisão, mas por enquanto vou me limitar aos pitacos, tá? O raton vai continuar a revisão aí e se precisar volto aqui

Copy link
Contributor

@victorfernandesraton victorfernandesraton left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@talesmota encontrei algumas coisas aqui que precisam ser alteradas, tendo em vista essas mudançás seria interessante que seja enviado os logs e csv's das execuções afetadas para evidenciar estes raspadores, acredito que por causa da questão da busca dos parâmetros o ideal seria o envio de todos os logs

Comment on lines +9 to +10
allowed_domains = ["www.camaraibicoara.ba.gov.br", "api.brtransparencia.com.br"]
start_urls = ["https://www.camaraibicoara.ba.gov.br/diario.html"]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@talesmota o arquivo está com o nome de ba_candeias, mas ao abrir a url caimos no site da Câmara Municipal de Ibicoara-Bahia, como tanbém podemos usar apenas o dôminio da api transparência

Suggested change
allowed_domains = ["www.camaraibicoara.ba.gov.br", "api.brtransparencia.com.br"]
start_urls = ["https://www.camaraibicoara.ba.gov.br/diario.html"]
allowed_domains = ["brtransparencia.com.br"]
start_urls = ["http://cmcandeiasba.brtransparencia.com.br/diario.html"]

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@talesmota neste caso aqui , o raspador atual não está funcionando corrretamente e redireciona para este novo site (http://conceicaodoalmeida.ba.gov.br), dessa forma você pode sobreescrever o arquivo em vez de criar um novo, como remover o ano do nome do raspador

TERRITORY_ID = ""
allowed_domains = []
start_urls = [""]
power = "executive"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@talesmota este valor padrão aqui , acredito que seja melhor remover o atributo da classe mãe para que os desenvolvedores dos próximos raspadores sejam induzidos a verificar e informar em cada caso.

Suggested change
power = "executive"

Comment on lines +31 to +38
except AttributeError as exc:
raise AttributeError("Was not possible to extract the entity code") from exc
try:
response_code = self._extract_code_from_response_text(
response_text, field="code"
)
except AttributeError as exc:
raise AttributeError("Was not possible to extract the code") from exc
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@talesmota nesses casos de exceção , é preferivél que deixe o raspador quebrar direto apenas, ou se preferir adicionar no log de erro e manter a exceção original

Suggested change
except AttributeError as exc:
raise AttributeError("Was not possible to extract the entity code") from exc
try:
response_code = self._extract_code_from_response_text(
response_text, field="code"
)
except AttributeError as exc:
raise AttributeError("Was not possible to extract the code") from exc
except AttributeError:
self.logger.error("Was not possible to extract the entity code")
raise
try:
response_code = self._extract_code_from_response_text(
response_text, field="code"
)
except AttributeError:
self.logger.error("Was not possible to extract the code")
raise

TERRITORY_ID = "2916708"
allowed_domains = ["www.itaquara.ba.gov.br", "api.brtransparencia.com.br"]
start_urls = ["https://www.itaquara.ba.gov.br/diario.html"]
start_date = date(2019, 1, 1)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@talesmota pesquisando no site deste raspador , o mais antigo encontrado foi de 26/07/2019

Suggested change
start_date = date(2019, 1, 1)
start_date = date(2019, 7, 26)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@talesmota neste caso aqui , o raspador atual não está funcionando corrretamente e redireciona para este novo site (https://www.itaquara.ba.gov.br/), dessa forma você pode sobreescrever o arquivo em vez de criar um novo, como remover o ano do nome do raspador

"cmriorealba.brtransparencia.com.br",
"api.brtransparencia.com.br",
]
start_urls = ["https://http://cmriorealba.brtransparencia.com.br/diario.html"]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@talesmota acredito que o link aqui seja apenas http:

Suggested change
start_urls = ["https://http://cmriorealba.brtransparencia.com.br/diario.html"]
start_urls = ["http://cmriorealba.brtransparencia.com.br/diario.html"]

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.

[Novo spider base]: BR Transparência
3 participants