diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4c9f7913ea585b92b5d734587db827f8f152cd4a..68d4f360ce62aa30e10b43028dd01ed24768839f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -223,6 +223,11 @@ test_pref87: PREF: "pref87" extends: .default_pref +test_pref92: + variables: + PREF: "pref92" + extends: .default_pref + test_pref93: variables: PREF: "pref93" diff --git a/Attrap_pref92.py b/Attrap_pref92.py new file mode 100644 index 0000000000000000000000000000000000000000..2da3a7f1df1bee55203ff12793aaf9ebbe6b57d5 --- /dev/null +++ b/Attrap_pref92.py @@ -0,0 +1,90 @@ +import datetime +import logging +import re +import urllib.parse + +from bs4 import BeautifulSoup + +from Attrap import Attrap + +logger = logging.getLogger(__name__) + + +class Attrap_pref92(Attrap): + + # Config + __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' + __HOST = 'https://www.hauts-de-seine.gouv.fr' + __FIRST_YEAR = 2016 + __RAA_YEAR_PAGE_TEMPLATE = ( + '/Publications/Annonces-avis/' + 'Le-Recueil-des-actes-administratifs/RAA-{year}/' + ) + __RAA_PAGER_SELECTOR = 'a.fr-pagination__link.fr-pagination__link--next' + __RAA_PDF_SELECTOR = '#main .fr-card__content a.fr-card__link.menu-item-link' + __RAA_PUB_DATE_RE = re.compile(r'(?P<d>\d{2})\/(?P<m>\d{2})\/(?P<y>\d{4})') + full_name = 'Préfecture des Hauts-de-Seine' + short_code = 'pref92' + + def __init__(self, data_dir): + super().__init__(data_dir, self.__USER_AGENT) + self.enable_tor(10) + + def get_raa(self, keywords): + # On récupère les pages des années. Pas besoin de fetch la page + # initiale, l'URL est prévisible pour chaque année. + year_pages = [ + self.__HOST + self.__RAA_YEAR_PAGE_TEMPLATE.format(year=year) + for year in self._get_year_range(min_year=self.not_before.year) + ] + # On récupère tous les RAA en suivant la navigation. + elements = self.get_raa_with_pager( + year_pages, + self.__RAA_PAGER_SELECTOR, + self.__HOST + ) + + self.parse_raa(elements, keywords) + self.mailer() + + def get_raa_elements(self, page_content): + soup = BeautifulSoup(page_content, 'html.parser') + + elements = [] + for a in soup.select(self.__RAA_PDF_SELECTOR): + # On ignore les RAA dont on a pu voir que la date de publication + # est avant notre limite. + link_title = a['title'] + pub_date = self._get_pub_date_from_link_title(link_title) + if not pub_date: + logger.warning(f'Date non trouvée dans l\'attribut title : {link_title}') + continue + if pub_date < self.not_before: + continue + + if (url := a.get('href')) and url.endswith('.pdf'): + if url.startswith('/'): + url = self.__HOST + urllib.parse.quote(url) + name = a.get_text().strip() + raa = Attrap.RAA(url, pub_date, name) + elements.append(raa) + + return elements + + def _get_pub_date_from_link_title(self, title): + """C'est sympa il y a la date de publication du RAA dans le title du lien.""" + if match := self.__RAA_PUB_DATE_RE.search(title): + parts = match.groupdict() + return datetime.datetime( + int(parts['y']), int(parts['m']), int(parts['d']) + ) + return None + + def _get_year_range(self, min_year=0): + """Renvoie une liste d'années avec des RAA.""" + return list( + range( + max(self.__FIRST_YEAR, min_year), + datetime.datetime.now().year + 1 + ) + ) diff --git a/Makefile b/Makefile index 56c154ca1959fdc502929df09f1a7a3055929d41..e6325a78b4234299fe87ba3680eb2c6f172efd0b 100644 --- a/Makefile +++ b/Makefile @@ -51,6 +51,8 @@ pref83: bin/python3 cli.py pref83 pref87: bin/python3 cli.py pref87 +pref92: + bin/python3 cli.py pref92 pref93: bin/python3 cli.py pref93 pref94: diff --git a/README.md b/README.md index 895623f6fe16683deb2571f83c4b0dec9e50985c..0ff8696e464d00917016181c61804f1f519d0c83 100644 --- a/README.md +++ b/README.md @@ -87,6 +87,7 @@ Les options suivantes peuvent être précisées, par un paramètre si l'utilitai - Préfecture du Tarn (identifiant : `pref81`) - Préfecture du Var (identifiant : `pref83`) - Préfecture de la Haute-Vienne (identifiant : `pref87`) +- Préfecture des Hauts-de-Seine (identifiant : `pref92`) - Préfecture de Seine-Saint-Denis (identifiant : `pref93`) - Préfecture du Val-de-Marne (identifiant : `pref94`) - Préfecture de Mayotte (identifiant : `pref976`) diff --git a/cli.py b/cli.py index 8c1a1d8d021e46bbce3a82ee9114137e7ff1a168..38982c12d3d4802369709ecd4dd812e4c8e969b2 100755 --- a/cli.py +++ b/cli.py @@ -65,6 +65,7 @@ available_administrations = [ 'pref81', 'pref83', 'pref87', + 'pref92', 'pref93', 'pref94', 'pref976'