From aa592f6d9b52363bd6caea915d84261f03f6def1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADsa=20F=2E=20Coelho?= <87907716+Luisa-Coelho@users.noreply.github.com> Date: Sun, 22 Oct 2023 09:25:16 -0300 Subject: [PATCH] Create go_anapolis MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Luísa F. Coelho <87907716+Luisa-Coelho@users.noreply.github.com> --- .../gazette/spiders/go/go_anapolis | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 data_collection/gazette/spiders/go/go_anapolis diff --git a/data_collection/gazette/spiders/go/go_anapolis b/data_collection/gazette/spiders/go/go_anapolis new file mode 100644 index 000000000..4bb1aec20 --- /dev/null +++ b/data_collection/gazette/spiders/go/go_anapolis @@ -0,0 +1,88 @@ +import datetime +import scrapy + +from gazette.items import Gazette +from gazette.spiders.base import BaseGazetteSpider + + +# Definição da classe do raspador +class GoAnapolisSpider(BaseGazetteSpider): + # Parâmetros iniciais + name = "go_anapolis" + TERRITORY_ID = "5201108" + start_date = datetime.date(2010, 5, 31) + allowed_domains = ["https://dom.anapolis.go.gov.br/"] + start_urls = [ + "https://dom.anapolis.go.gov.br/", + "https://dom22.anapolis.go.gov.br/", + ] + + #
11
12
13
14
15
16
17
+ # + ## outros anos:
  • Edição 1

    Seg, 31 de maio 2010

  • + # O parse abaixo irá partir da start_url acima + def parse(self, response): + # Nosso seletor cria uma lista com os código HTML onde os anos estão localizados + years = response.css("div.col-md-1") + # E fazer um loop para extrair de fato o ano + for year in years: + # Para cada item da lista (year) vamos pegar (get) um seletor XPath. + # Também dizemos que queremos o resultado como um número inteiro (int) + year_to_scrape = int(year.xpath("./a/font/text()").get()) + + # Para não fazer requisições desnecessárias, se o ano já for o da página + # inicial (página inicial é o ano atual) ou então for anterior ao ano da + # data inicial da busca, não iremos fazer a requisição + if ( + year_to_scrape < self.start_date.year + or year_to_scrape == datetime.date.today().year + ): + continue + + # Com Scrapy é possível utilizar regex direto no elemento com os métodos + # `.re` e `.re_first` (na maioria das vezes é suficiente e não precisamos + # usar métodos da biblioteca `re`) + event_target = year.xpath("./a/@href").re_first(r"(ctl00.*?)',") + + # O método `.from_response` nesse caso é bem útil pois pega vários + # elementos do tipo que já estão dentro do elemento
    + # localizado na página e preenche eles automaticamente no formdata, assim + # é possível economizar muitas linhas de código + yield scrapy.FormRequest.from_response( + response, + formdata={"__EVENTTARGET": event_target}, + callback=self.parse_year, + ) + + # O `yield from` permite fazermos `yield` em cada resultado do método gerador + # `self.parse_year`, assim, aqui estamos dando `yield` em todos os itens + # `Gazette` raspados da página inicial + yield from self.parse_year(response) + + def parse_year(self, response): + editions = response.xpath( + "//div[@class='container body-content']//div[@class='row']//a[contains(@href, 'AbreSemanario')]" + ) + + for edition in editions: + document_href = edition.xpath("./@href").get() + + title = edition.xpath("./text()") + + gazette_date = datetime.datetime.strptime( + title.re_first(r"\d{2}/\d{2}/\d{4}"), "%d/%m/%Y" + ).date() + edition_number = title.re_first(r"- (\d+) -") + is_extra_edition = "extra" in title.get().lower() + + # Esse site "esconde" o link direto do PDF por trás de uma série de + # redirecionamentos, porém, como nas configurações do projeto é permitido + # que arquivos baixados sofram redirecionamento, é possível colocar o link + # "falso" já no item `Gazette` e o projeto vai conseguir baixar o documento + yield Gazette( + date=gazette_date, + edition_number=edition_number, + file_urls=[response.urljoin(document_href)], + is_extra_edition=is_extra_edition, + power="executive", + )