-
-
Notifications
You must be signed in to change notification settings - Fork 410
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
base: main
Are you sure you want to change the base?
Changes from 4 commits
651c567
0730ce5
cf4e770
b727e1e
dad182c
c4ce4ce
420ebd5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
from datetime import date | ||
|
||
from gazette.spiders.base.brtransparencia import BaseBrTransparenciaSpider | ||
|
||
|
||
class BaCandeiasSpider(BaseBrTransparenciaSpider): | ||
name = "ba_candeias" | ||
TERRITORY_ID = "2906501" | ||
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" | ||
br_tranparencia_code = "CODE_ENT_CM207" | ||
power = "legislative" |
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
from datetime import date | ||
|
||
from gazette.spiders.base.brtransparencia import BaseBrTransparenciaSpider | ||
|
||
|
||
class BaConceicaoDoAlmeidaSpider(BaseBrTransparenciaSpider): | ||
name = "ba_conceicao_do_almeida_2024" | ||
TERRITORY_ID = "2908309" | ||
allowed_domains = ["www.conceicaodoalmeida.ba.gov.br"] | ||
start_urls = ["https://www.conceicaodoalmeida.ba.gov.br/diario.html"] | ||
start_date = date(2019, 5, 3) | ||
br_tranparencia_entity = "EF1662F7-9A2A-4FDB-ABAD-346211F97734" | ||
br_tranparencia_code = "CODE_ENT_001" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
from datetime import date | ||
|
||
from gazette.spiders.base.brtransparencia import BaseBrTransparenciaSpider | ||
|
||
|
||
class BaIbicoaraSpider(BaseBrTransparenciaSpider): | ||
name = "ba_ibicoara" | ||
TERRITORY_ID = "2912202" | ||
allowed_domains = ["www.camaraibicoara.ba.gov.br"] | ||
start_urls = ["https://www.camaraibicoara.ba.gov.br/diario.html"] | ||
start_date = date(2020, 2, 1) | ||
br_tranparencia_entity = "691bea32-9b9f-40f8-ab18-31e079080a1a" | ||
br_tranparencia_code = "CODE_ENT_CM204" |
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,13 @@ | ||||||
from datetime import date | ||||||
|
||||||
from gazette.spiders.base.brtransparencia import BaseBrTransparenciaSpider | ||||||
|
||||||
|
||||||
class BaItaquaraSpider(BaseBrTransparenciaSpider): | ||||||
name = "ba_itaquara_2024" | ||||||
TERRITORY_ID = "2916708" | ||||||
allowed_domains = ["www.itaquara.ba.gov.br"] | ||||||
start_urls = ["https://www.itaquara.ba.gov.br/diario.html"] | ||||||
start_date = date(2019, 1, 1) | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @talesmota pesquisando no site deste raspador , o mais antigo encontrado foi de
Suggested change
|
||||||
br_tranparencia_entity = "1557447a-9381-44ad-9c0f-016868769479" | ||||||
br_tranparencia_code = "CODE_ENT_PM003" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
from datetime import date | ||
|
||
from gazette.spiders.base.brtransparencia import BaseBrTransparenciaSpider | ||
|
||
|
||
class BaPortoSeguroSpider(BaseBrTransparenciaSpider): | ||
name = "ba_porto_seguro" | ||
TERRITORY_ID = "2925303" | ||
allowed_domains = ["cmportoseguroba.brtransparencia.com.br"] | ||
start_urls = ["https://cmportoseguroba.brtransparencia.com.br/diario.html"] | ||
start_date = date(2022, 12, 19) | ||
br_tranparencia_entity = "4557886f-5713-4999-b2c5-c54d9ee11b44" | ||
br_tranparencia_code = "COD_ENT_CM210" | ||
power = "legislative" |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,14 @@ | ||||||
from datetime import date | ||||||
|
||||||
from gazette.spiders.base.brtransparencia import BaseBrTransparenciaSpider | ||||||
|
||||||
|
||||||
class BaRioRealSpider(BaseBrTransparenciaSpider): | ||||||
name = "ba_rio_real" | ||||||
TERRITORY_ID = "2927002" | ||||||
allowed_domains = ["cmriorealba.brtransparencia.com.br"] | ||||||
start_urls = ["https://http://cmriorealba.brtransparencia.com.br/diario.html"] | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @talesmota acredito que o link aqui seja apenas http:
Suggested change
|
||||||
start_date = date(2022, 12, 29) | ||||||
br_tranparencia_entity = "45ae0af7-71a7-436e-9a8e-d41a68215062" | ||||||
br_tranparencia_code = "COD_ENT_CM208" | ||||||
power = "legislative" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
from datetime import date | ||
|
||
from gazette.spiders.base.brtransparencia import BaseBrTransparenciaSpider | ||
|
||
|
||
class BaSaudeSpider(BaseBrTransparenciaSpider): | ||
name = "ba_saude_2024" | ||
TERRITORY_ID = "2929800" | ||
allowed_domains = ["pmsaudeba.brtransparencia.com.br"] | ||
start_urls = ["https://pmsaudeba.brtransparencia.com.br/diario.html"] | ||
start_date = date(2024, 1, 31) | ||
br_tranparencia_entity = "46366dbc-7780-433d-a689-f287561a8a7a" | ||
br_tranparencia_code = "COD_ENT_PM005" | ||
power = "executive" |
Original file line number | Diff line number | Diff line change | ||
---|---|---|---|---|
@@ -0,0 +1,43 @@ | ||||
from datetime import datetime | ||||
|
||||
from scrapy import Request | ||||
from scrapy.selector import Selector | ||||
|
||||
from gazette.items import Gazette | ||||
from gazette.spiders.base import BaseGazetteSpider | ||||
|
||||
|
||||
class BaseBrTransparenciaSpider(BaseGazetteSpider): | ||||
name = "" | ||||
TERRITORY_ID = "" | ||||
allowed_domains = [""] | ||||
start_urls = [""] | ||||
br_tranparencia_entity = "" | ||||
br_tranparencia_code = "" | ||||
power = "executive" | ||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @talesmota esse atributo não está especificado na clase There was a problem hiding this comment. Choose a reason for hiding this commentThe 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:
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. There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 There was a problem hiding this comment. Choose a reason for hiding this commentThe 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
|
||||
|
||||
def start_requests(self): | ||||
api_url = f"https://api.brtransparencia.com.br/api/diariooficial/filtro/{self.br_tranparencia_entity}/{self.br_tranparencia_code}/{self.start_date}/{self.end_date}/-1/-1" | ||||
|
||||
yield Request(api_url) | ||||
|
||||
def parse(self, response): | ||||
for entry in response.json(): | ||||
edition_date = datetime.strptime( | ||||
entry["dat_publicacao_dio"], "%Y-%m-%dT%H:%M:%S" | ||||
).date() | ||||
extra_edition = True if entry["des_extra_dio"] is not None else False | ||||
edition_number = int(entry["num_diario_oficial_dio"]) | ||||
gezzetes = Selector(text=entry["des_resumo_dio"]).css("a") | ||||
urls = [] | ||||
for item in gezzetes: | ||||
link = item.css("a::attr(href)").get() | ||||
urls.append(link) | ||||
|
||||
yield Gazette( | ||||
edition_number=edition_number, | ||||
date=edition_date, | ||||
file_urls=urls, | ||||
is_extra_edition=extra_edition, | ||||
power=self.power, | ||||
) |
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.
@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
ebr_tranparencia_code
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.
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.
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.
Pelo que pesquisei, não há uma forma diferente de fazer a busca deste ID ao acessar o site
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.
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.
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.
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 ementity =
ecode =
.Em Ibicoara:
Em Itaquara:
Realmente acho que vale a pena conferir se generaliza legal pros outros municípios.
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.
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:
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