From 78b2707471d2e0ea23e62a95468fcc064a6d7588 Mon Sep 17 00:00:00 2001 From: Bastien Le Querrec <blq@laquadrature.net> Date: Fri, 5 Apr 2024 20:49:04 +0200 Subject: [PATCH] =?UTF-8?q?pref80:=20ajout=20de=20la=20pr=C3=A9fecture=20d?= =?UTF-8?q?e=20la=20Somme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 5 +++ Makefile | 4 +- RAAspotter_pref80.py | 103 +++++++++++++++++++++++++++++++++++++++++++ README.md | 1 + cli.py | 1 + 5 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 RAAspotter_pref80.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0fefb22..1e1d9de 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -172,6 +172,11 @@ test_pref69: PREF: "pref69" extends: .default_pref +test_pref80: + variables: + PREF: "pref80" + extends: .default_pref + test_pref81: variables: PREF: "pref81" diff --git a/Makefile b/Makefile index 34d0800..742936a 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -make: ppparis pref04 pref06 pref09 pref13 pref31 pref34 pref35 pref38 pref59 pref62 pref65 pref66 pref69 pref81 pref83 pref87 pref976 +make: ppparis pref04 pref06 pref09 pref13 pref31 pref34 pref35 pref38 pref59 pref62 pref65 pref66 pref69 pref80 pref81 pref83 pref87 pref976 ppparis: python cli.py --pref ppparis pref04: @@ -29,6 +29,8 @@ pref66: python cli.py --pref pref66 pref69: python cli.py --pref pref69 +pref80: + python cli.py --pref pref80 pref81: python cli.py --pref pref81 pref83: diff --git a/RAAspotter_pref80.py b/RAAspotter_pref80.py new file mode 100644 index 0000000..8118d0c --- /dev/null +++ b/RAAspotter_pref80.py @@ -0,0 +1,103 @@ +import os +import datetime +import logging + +from bs4 import BeautifulSoup +from urllib.parse import unquote + +from RAAspotter import RAAspotter + +logger = logging.getLogger(__name__) + + +class RAAspotter_pref80(RAAspotter): + + # Config + __HOST = 'https://www.somme.gouv.fr' + __RAA_PAGE = { + '2024': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-departement-de-la-Somme/Annee-2024', + '2023': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-departement-de-la-Somme/Annee-2023', + '2022': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-departement-de-la-Somme/Annee-2022', + '2021': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-departement-de-la-Somme/Annee-2021', + '2020': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-departement-de-la-Somme/Annee-2020', + '2019': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-departement-de-la-Somme/Annee-2019' + } + __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36' + full_name = 'Préfecture de la Somme' + short_code = 'pref80' + + def __init__(self, data_dir): + super().__init__(data_dir, self.__USER_AGENT) + self.enable_tor(10) + + def get_raa(self, keywords): + self.print_output('RAAspotter_pref80') + self.print_output(f'Termes recherchés: {keywords}') + self.print_output('') + + year_pages_to_parse = [] + if self.not_before.year <= 2024: + year_pages_to_parse.append(self.__RAA_PAGE['2024']) + if self.not_before.year <= 2023: + year_pages_to_parse.append(self.__RAA_PAGE['2023']) + if self.not_before.year <= 2022: + year_pages_to_parse.append(self.__RAA_PAGE['2022']) + if self.not_before.year <= 2021: + year_pages_to_parse.append(self.__RAA_PAGE['2021']) + if self.not_before.year <= 2020: + year_pages_to_parse.append(self.__RAA_PAGE['2020']) + if self.not_before.year <= 2019: + year_pages_to_parse.append(self.__RAA_PAGE['2019']) + + # Pour chaque page Année, on récupère la liste des RAA + elements = [] + for year_page in year_pages_to_parse: + page_content = self.get_page(year_page, 'get').content + for element in self.get_raa_elements(page_content): + elements.append(element) + + self.parse_raa(elements, keywords.split(',')) + self.mailer() + + def get_raa_elements(self, page_content): + elements = [] + # On charge le parser + soup = BeautifulSoup(page_content, 'html.parser') + + # Pour chaque balise a, on regarde si c'est un PDF, et si oui on le + # parse + for a in soup.select('div.fr-text--lead.fr-my-3w p a.fr-link'): + if a.get('href') and a['href'].endswith('.pdf'): + if a['href'].startswith('/'): + url = f"{self.__HOST}{a['href']}" + else: + url = a['href'] + + url = unquote(url) + # On enlève les espaces insécables, les double-espaces, et le texte « Télécharger » de certains liens + name = a.get_text().replace('Télécharger ', '').strip().replace(u"\u00A0", ' ').replace(' ', ' ') + if name and not name == '': + filename = url.split('/')[-1] + # Certains RAA de la Somme ont une ligne avec les détails du fichier. Si cette ligne + # est disponible, on la parse, sinon on devine la date à partir du nom + date = None + if a.find('span'): + date = datetime.datetime.strptime(a.find('span').get_text().split(' - ')[-1].strip(), '%d/%m/%Y') + else: + regex = '.* n°.*(?:du)? ([0-9]*(?:er)? [a-zéû]* (?:[0-9]{4}|[0-9]{2}))' + date = RAAspotter.guess_date(name, regex) + # Parfois, il manque l'année dans le nom du RAA, alors on essaie avec l'année de la page + if date.year == 9999: + page_year = soup.select('nav.fr-breadcrumb div.fr-collapse ol.fr-breadcrumb__list li a.fr-breadcrumb__link.breadcrumb-item-link')[-1].get_text().replace('Année ', '').strip() + date = RAAspotter.guess_date(f'{name} {page_year}', regex) + + # Parfois, c'est que le fichier n'est pas un RAA mais un arrêté seul + if date.year == 9999: + date = RAAspotter.guess_date(name, '([0-9]*(?:er)? [a-zéû]* [0-9]{4})') + + if date.year == 9999: + logger.warning(f'On ignore {name} (URL : {url})') + else: + raa = RAAspotter.RAA(url, date, name, filename) + elements.append(raa) + return elements[::-1] diff --git a/README.md b/README.md index 779dec4..e8a8272 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ Il est possible de ne lancer l'analyse que pour une seule administration, avec l - Préfecture des Hautes-Pyrénées (identifiant : `pref65`) - Préfecture des Pyrénées-Orientales (identifiant : `pref66`) - Préfecture du Rhône (identifiant : `pref69`) +- Préfecture de la Somme (identifiant : `pref80`) - Préfecture du Tarn (identifiant : `pref81`) - Préfecture du Var (identifiant : `pref83`) - Préfecture de la Haute-Vienne (identifiant : `pref87`) diff --git a/cli.py b/cli.py index 802c134..43d079a 100755 --- a/cli.py +++ b/cli.py @@ -53,6 +53,7 @@ available_prefs = [ 'pref65', 'pref66', 'pref69', + 'pref80', 'pref81', 'pref83', 'pref87', -- GitLab