From 610c04297554a79ba782f8e1e0be1cb3ba9fac99 Mon Sep 17 00:00:00 2001 From: Luc Pellissier <luc.pellissier@inria.fr> Date: Mon, 17 Jun 2024 17:44:56 +0200 Subject: [PATCH] =?UTF-8?q?pref75:=20ajout=20de=20la=20pr=C3=A9fecture=20d?= =?UTF-8?q?e=20Paris?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Luc Pellissier <luc.pellissier@inria.fr> Co-authored-by: Bastien Le Querrec <blq@laquadrature.net> --- .gitlab-ci.yml | 5 +++ Attrap_pref75.py | 99 ++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 4 +- README.md | 1 + cli.py | 1 + 5 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 Attrap_pref75.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4c9f791..5ced3e0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -203,6 +203,11 @@ test_pref73: PREF: "pref73" extends: .default_pref +test_pref75: + variables: + PREF: "pref75" + extends: .default_pref + test_pref80: variables: PREF: "pref80" diff --git a/Attrap_pref75.py b/Attrap_pref75.py new file mode 100644 index 0000000..709f89d --- /dev/null +++ b/Attrap_pref75.py @@ -0,0 +1,99 @@ +import os +import datetime + +from bs4 import BeautifulSoup +from urllib.parse import unquote + +from Attrap import Attrap + + +class Attrap_pref75(Attrap): + + # Les RAA de Paris sont sur le site de la préfecture de région + # Île-de-France. On ne prend en compte que les RAA départementaux. + + # Config + __HOST = 'https://www.prefectures-regions.gouv.fr' + __RAA_PAGE = { + '2024': f'{__HOST}/ile-de-france/ile-de-france/ile-de-france/Documents-publications/Recueil-des-actes-administratifs/Raa-du-departement-de-Paris-2024', + '2023': f'{__HOST}/ile-de-france/ile-de-france/ile-de-france/Documents-publications/Recueil-des-actes-administratifs/Raa-du-departement-de-Paris-2023', + '2022': f'{__HOST}/ile-de-france/ile-de-france/ile-de-france/Documents-publications/Recueil-des-actes-administratifs/Raa-du-departement-de-Paris-2022', + '2021': f'{__HOST}/ile-de-france/ile-de-france/ile-de-france/Documents-publications/Recueil-des-actes-administratifs/Raa-du-departement-de-Paris-2021', + '2020': f'{__HOST}/ile-de-france/ile-de-france/ile-de-france/Documents-publications/Recueil-des-actes-administratifs/Raa-du-departement-de-Paris-2020', + '2019': f'{__HOST}/ile-de-france/ile-de-france/ile-de-france/Documents-publications/Recueil-des-actes-administratifs/Raa-du-departement-de-Paris-2019', + '2018': f'{__HOST}/ile-de-france/ile-de-france/ile-de-france/Documents-publications/Recueil-des-actes-administratifs/Raa-du-departement-de-Paris-2018' + } + __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' + full_name = 'Préfecture de Paris' + short_code = 'pref75' + + def __init__(self, data_dir): + super().__init__(data_dir, self.__USER_AGENT) + self.enable_tor(10) + + def get_raa(self, keywords): + year_pages_to_parse = [] + + # Les RAA de Paris sont éparpillés sur des sous-pages par mois. + # Donc on parse la page principale à la recherche des sous-pages. + 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']) + + pages_to_parse = [] + for year_page in year_pages_to_parse: + page_content = self.get_page(year_page, 'get').content + year = BeautifulSoup(page_content, 'html.parser').select('div.breadcrumb div.container p span.active')[0].get_text().split('-')[-1].strip() + month_pages = self.get_sub_pages( + page_content, + 'div.sommaire-bloc div.sommaire-content ol li a', + self.__HOST, + False + )[::-1] + for month_page in month_pages: + month_date = Attrap.guess_date(f'{month_page['name']} {year}', "(.*)").replace(day=1) + if month_date >= self.not_before.replace(day=1): + pages_to_parse.append(month_page['url']) + + elements = [] + for page in pages_to_parse[::-1]: + page_content = self.get_page(page, 'get').content + for element in self.get_raa_elements(page_content): + elements.append(element) + + self.parse_raa(elements[::-1], keywords) + 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('main div.container.main-container div.col-main article.article div.texte div a.link-download'): + 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) + name = a.find('span').get_text().strip() + # On devine la date du RAA à partir du nom de fichier + guessed = Attrap.guess_date(name, '([0-9]{2}(?:-|\\.)[0-9]{2}(?:-|\\.)[0-9]{4})') + if (guessed == datetime.datetime(9999, 1, 1, 0, 0)): + date = None + else: + date = guessed + + raa = Attrap.RAA(url, date, name) + elements.append(raa) + return elements diff --git a/Makefile b/Makefile index 56c154c..68f9a25 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -make: ppparis pref04 pref05 pref06 pref09 pref13 pref25 pref31 pref33 pref34 pref35 pref38 pref42 pref44 pref59 pref62 pref63 pref64 pref65 pref66 pref69 pref73 pref80 pref81 pref83 pref87 pref93 pref94 pref976 +make: ppparis pref04 pref05 pref06 pref09 pref13 pref25 pref31 pref33 pref34 pref35 pref38 pref42 pref44 pref59 pref62 pref63 pref64 pref65 pref66 pref69 pref73 pref75 pref80 pref81 pref83 pref87 pref93 pref94 pref976 ppparis: bin/python3 cli.py ppparis pref04: @@ -43,6 +43,8 @@ pref69: bin/python3 cli.py pref69 pref73: bin/python3 cli.py pref73 +pref75: + bin/python3 cli.py pref75 pref80: bin/python3 cli.py pref80 pref81: diff --git a/README.md b/README.md index 895623f..adbbfb7 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ Les options suivantes peuvent être précisées, par un paramètre si l'utilitai - Préfecture des Pyrénées-Orientales (identifiant : `pref66`) - Préfecture du Rhône (identifiant : `pref69`) - Préfecture de la Savoie (identifiant : `pref73`) +- Préfecture de Paris (identifiant : `pref75`) - Préfecture de la Somme (identifiant : `pref80`) - Préfecture du Tarn (identifiant : `pref81`) - Préfecture du Var (identifiant : `pref83`) diff --git a/cli.py b/cli.py index 8c1a1d8..c6f7041 100755 --- a/cli.py +++ b/cli.py @@ -61,6 +61,7 @@ available_administrations = [ 'pref66', 'pref69', 'pref73', + 'pref75', 'pref80', 'pref81', 'pref83', -- GitLab