Skip to content
Extraits de code Groupes Projets

Comparer les révisions

Les modifications sont affichées comme si la révision source était fusionnée avec la révision cible. En savoir plus sur la comparaison des révisions.

Source

Sélectionner le projet cible
No results found
Sélectionner une révision Git
  • main
1 résultat

Cible

Sélectionner le projet cible
No results found
Sélectionner une révision Git
  • 14-configuration-tor-speciale-pour-attrap
  • Paris
  • main
  • pref19
  • pref23
5 résultats
Afficher les modifications

Validations dans la source 301

201 additional commits have been omitted to prevent performance issues.
122 files
+ 4006
2438
Comparer les modifications
  • Côte à côte
  • En ligne

Fichiers

+3 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
__pycache__/
bin/
lib/
lib64
data/
pyvenv.cfg
output_*.log
*.patch
CACHEDIR.TAG
+424 −9
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -62,7 +62,6 @@ pep8:
    - lib/
    - pyvenv.cfg
  script:
    - source bin/activate
    - make lint
  allow_failure: true
  rules:
@@ -75,20 +74,16 @@ pep8:
  - unprivileged
  needs: [install]
  script:
  - misc/download-from-s3.sh "${PREF}" "${S3_KEY}" "${S3_SECRET}" "${S3_HOST}" "${S3_BUCKET}" data/ || true
  - source bin/activate
  - pip install --upgrade -r requirements.txt
  - /etc/init.d/tor start
  - python ./cli.py "${PREF}"
  - make "${PREF}"
  - misc/upload-to-s3.sh "${PREF}" "${S3_KEY}" "${S3_SECRET}" "${S3_HOST}" "${S3_BUCKET}" data/ || true
  cache:
    key: $CI_COMMIT_REF_SLUG-$CI_JOB_NAME_SLUG
    fallback_keys:
    - $CI_COMMIT_REF_SLUG
    key: $CI_COMMIT_REF_SLUG
    paths:
    - bin/
    - lib/
    - pyvenv.cfg
    - data/${PREF}/raa/*.txt
    - data/${PREF}/raa/*.json
  artifacts:
    paths:
    - data/${PREF}/raa/*.txt
@@ -103,6 +98,21 @@ test_ppparis:
    PREF: "ppparis"
  extends: .default_pref

test_pref01:
  variables:
    PREF: "pref01"
  extends: .default_pref

test_pref02:
  variables:
    PREF: "pref02"
  extends: .default_pref

test_pref03:
  variables:
    PREF: "pref03"
  extends: .default_pref

test_pref04:
  variables:
    PREF: "pref04"
@@ -118,21 +128,141 @@ test_pref06:
    PREF: "pref06"
  extends: .default_pref

test_pref07:
  variables:
    PREF: "pref07"
  extends: .default_pref

test_pref08:
  variables:
    PREF: "pref08"
  extends: .default_pref

test_pref09:
  variables:
    PREF: "pref09"
  extends: .default_pref

test_pref10:
  variables:
    PREF: "pref10"
  extends: .default_pref

test_pref11:
  variables:
    PREF: "pref11"
  extends: .default_pref

test_pref12:
  variables:
    PREF: "pref12"
  extends: .default_pref

test_pref13:
  variables:
    PREF: "pref13"
  extends: .default_pref

test_pref14:
  variables:
    PREF: "pref14"
  extends: .default_pref

test_pref15:
  variables:
    PREF: "pref15"
  extends: .default_pref

test_pref16:
  variables:
    PREF: "pref16"
  extends: .default_pref

test_pref17:
  variables:
    PREF: "pref17"
  extends: .default_pref

test_pref18:
  variables:
    PREF: "pref18"
  extends: .default_pref

test_pref19:
  variables:
    PREF: "pref19"
  extends: .default_pref

test_pref2a:
  variables:
    PREF: "pref2a"
  extends: .default_pref

test_pref2b:
  variables:
    PREF: "pref2b"
  extends: .default_pref

test_pref21:
  variables:
    PREF: "pref21"
  extends: .default_pref

test_pref22:
  variables:
    PREF: "pref22"
  extends: .default_pref

test_pref23:
  variables:
    PREF: "pref23"
  extends: .default_pref

test_pref24:
  variables:
    PREF: "pref24"
  extends: .default_pref

test_pref25:
  variables:
    PREF: "pref25"
  extends: .default_pref

test_pref26:
  variables:
    PREF: "pref26"
  extends: .default_pref

test_pref27:
  variables:
    PREF: "pref27"
  extends: .default_pref

test_pref28:
  variables:
    PREF: "pref28"
  extends: .default_pref

test_pref29:
  variables:
    PREF: "pref29"
  extends: .default_pref

test_pref30:
  variables:
    PREF: "pref30"
  extends: .default_pref

test_pref31:
  variables:
    PREF: "pref31"
  extends: .default_pref

test_pref32:
  variables:
    PREF: "pref32"
  extends: .default_pref

test_pref33:
  variables:
    PREF: "pref33"
@@ -148,31 +278,146 @@ test_pref35:
    PREF: "pref35"
  extends: .default_pref

test_pref36:
  variables:
    PREF: "pref36"
  extends: .default_pref

test_pref37:
  variables:
    PREF: "pref37"
  extends: .default_pref

test_pref38:
  variables:
    PREF: "pref38"
  extends: .default_pref

test_pref39:
  variables:
    PREF: "pref39"
  extends: .default_pref

test_pref40:
  variables:
    PREF: "pref40"
  extends: .default_pref

test_pref40:
  variables:
    PREF: "pref40"
  extends: .default_pref

test_pref42:
  variables:
    PREF: "pref42"
  extends: .default_pref

test_pref43:
  variables:
    PREF: "pref43"
  extends: .default_pref

test_pref44:
  variables:
    PREF: "pref44"
  extends: .default_pref

test_pref45:
  variables:
    PREF: "pref45"
  extends: .default_pref

test_pref46:
  variables:
    PREF: "pref46"
  extends: .default_pref

test_pref47:
  variables:
    PREF: "pref47"
  extends: .default_pref

test_pref48:
  variables:
    PREF: "pref48"
  extends: .default_pref

test_pref49:
  variables:
    PREF: "pref49"
  extends: .default_pref

test_pref50:
  variables:
    PREF: "pref50"
  extends: .default_pref

test_pref51:
  variables:
    PREF: "pref51"
  extends: .default_pref

test_pref52:
  variables:
    PREF: "pref52"
  extends: .default_pref

test_pref53:
  variables:
    PREF: "pref53"
  extends: .default_pref

test_pref54:
  variables:
    PREF: "pref54"
  extends: .default_pref

test_pref55:
  variables:
    PREF: "pref55"
  extends: .default_pref

test_pref56:
  variables:
    PREF: "pref56"
  extends: .default_pref

test_pref57:
  variables:
    PREF: "pref57"
  extends: .default_pref

test_pref58:
  variables:
    PREF: "pref58"
  extends: .default_pref

test_pref59:
  variables:
    PREF: "pref59"
  extends: .default_pref

test_pref60:
  variables:
    PREF: "pref60"
  extends: .default_pref

test_pref61:
  variables:
    PREF: "pref61"
  extends: .default_pref

test_pref62:
  variables:
    PREF: "pref62"
  extends: .default_pref

test_pref63:
  variables:
    PREF: "pref63"
  extends: .default_pref

test_pref64:
  variables:
    PREF: "pref64"
@@ -188,11 +433,71 @@ test_pref66:
    PREF: "pref66"
  extends: .default_pref

test_pref67:
  variables:
    PREF: "pref67"
  extends: .default_pref

test_pref68:
  variables:
    PREF: "pref68"
  extends: .default_pref

test_pref69:
  variables:
    PREF: "pref69"
  extends: .default_pref

test_pref70:
  variables:
    PREF: "pref70"
  extends: .default_pref

test_pref71:
  variables:
    PREF: "pref71"
  extends: .default_pref

test_pref72:
  variables:
    PREF: "pref72"
  extends: .default_pref

test_pref73:
  variables:
    PREF: "pref73"
  extends: .default_pref

test_pref74:
  variables:
    PREF: "pref74"
  extends: .default_pref

test_pref75:
  variables:
    PREF: "pref75"
  extends: .default_pref

test_pref76:
  variables:
    PREF: "pref76"
  extends: .default_pref

test_pref77:
  variables:
    PREF: "pref77"
  extends: .default_pref

test_pref78:
  variables:
    PREF: "pref78"
  extends: .default_pref

test_pref79:
  variables:
    PREF: "pref79"
  extends: .default_pref

test_pref80:
  variables:
    PREF: "pref80"
@@ -203,12 +508,122 @@ test_pref81:
    PREF: "pref81"
  extends: .default_pref

test_pref82:
  variables:
    PREF: "pref82"
  extends: .default_pref

test_pref83:
  variables:
    PREF: "pref83"
  extends: .default_pref

test_pref84:
  variables:
    PREF: "pref84"
  extends: .default_pref

test_pref85:
  variables:
    PREF: "pref85"
  extends: .default_pref

test_pref86:
  variables:
    PREF: "pref86"
  extends: .default_pref

test_pref87:
  variables:
    PREF: "pref87"
  extends: .default_pref

test_pref88:
  variables:
    PREF: "pref88"
  extends: .default_pref

test_pref89:
  variables:
    PREF: "pref89"
  extends: .default_pref

test_pref90:
  variables:
    PREF: "pref90"
  extends: .default_pref

test_pref91:
  variables:
    PREF: "pref91"
  extends: .default_pref

test_pref92:
  variables:
    PREF: "pref92"
  extends: .default_pref

test_pref93:
  variables:
    PREF: "pref93"
  extends: .default_pref

test_pref94:
  variables:
    PREF: "pref94"
  extends: .default_pref

test_pref95:
  variables:
    PREF: "pref95"
  extends: .default_pref

test_pref971:
  variables:
    PREF: "pref971"
  extends: .default_pref

test_pref972:
  variables:
    PREF: "pref972"
  extends: .default_pref

test_pref973:
  variables:
    PREF: "pref973"
  extends: .default_pref

test_pref974:
  variables:
    PREF: "pref974"
  extends: .default_pref

test_pref976:
  variables:
    PREF: "pref976"
  extends: .default_pref

test_prefbretagne:
  variables:
    PREF: "prefbretagne"
  extends: .default_pref

test_prefidf:
  variables:
    PREF: "prefidf"
  extends: .default_pref

test_prefpaca:
  variables:
    PREF: "prefpaca"
  extends: .default_pref

test_hcnc:
  variables:
    PREF: "hcnc"
  extends: .default_pref

test_hcpf:
  variables:
    PREF: "hcpf"
  extends: .default_pref
+306 −251

Fichier modifié.

La taille limite d'aperçu a été dépassée, l'affichage des modifications a donc été réduit.

Attrap_hcnc.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_hcnc(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.nouvelle-caledonie.gouv.fr'
    raa_page = f'{hostname}/Publications/Arretes'
    full_name = 'Haut-Commissariat de la République en Nouvelle-Calédonie'
    short_code = 'hcnc'
    timezone = 'Pacific/Noumea'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '([0-9]{4})'

Attrap_hcpf.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_hcpf(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.polynesie-francaise.pref.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Haut-Commissariat de la République en Polynésie-française'
    short_code = 'hcpf'
    timezone = 'Pacific/Tahiti'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '([0-9]{4})'
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -9,21 +9,21 @@ from Attrap import Attrap
class Attrap_ppparis(Attrap):

    # Config
    __HOST = 'https://www.prefecturedepolice.interieur.gouv.fr'
    __RAA_PAGE = f'{__HOST}/actualites-et-presse/arretes/accueil-arretes'
    hostname = 'https://www.prefecturedepolice.interieur.gouv.fr'
    raa_page = f'{hostname}/actualites-et-presse/arretes/accueil-arretes'
    __WAIT_ELEMENT = 'block-decree-list-block'
    __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
    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 police de Paris'
    short_code = 'ppparis'
    timezone = 'Europe/Paris'

    def __init__(self, data_dir):
        super().__init__(data_dir, self.__USER_AGENT)
        super().__init__(data_dir, self.user_agent)

    def get_raa(self, keywords):
        page_content = self.get_session(self.__RAA_PAGE, self.__WAIT_ELEMENT, 6)
    def get_raa(self):
        page_content = self.get_session(self.raa_page, self.__WAIT_ELEMENT, 6)
        raa_elements = self.get_raa_elements(page_content)
        self.parse_raa(raa_elements, keywords)
        self.mailer()
        self.parse_raa(raa_elements)

    def get_raa_elements(self, page_content):
        elements = []
@@ -43,6 +43,6 @@ class Attrap_ppparis(Attrap):
                name = a.find('span').get_text()
                date = datetime.datetime.strptime(a.find('div', class_="field--type-datetime").get_text().strip(), '%d/%m/%Y')

                raa = Attrap.RAA(url, date, name)
                raa = Attrap.RAA(url, date, name, timezone=self.timezone)
                elements.append(raa)
        return elements

Attrap_pref01.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref01(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.ain.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs-RAA'
    full_name = 'Préfecture de l\'Ain'
    short_code = 'pref01'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '(?:Recueil|Recueils) (?:des actes administratifs)(?:[ -])*([0-9]{4})'

Attrap_pref02.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref02(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.aisne.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-Actes-Administratifs'
    full_name = 'Préfecture de l\'Aisne'
    short_code = 'pref02'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = 'RAA [Aa]nnée ([0-9]{4})'

Attrap_pref03.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref03(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.allier.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs-arretes'
    full_name = 'Préfecture de l\'Allier'
    short_code = 'pref03'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '([0-9]{4})'
+8 −54
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
import os
import datetime
from Attrap_prefdpt import Attrap_prefdpt

from bs4 import BeautifulSoup
from urllib.parse import unquote

from Attrap import Attrap
class Attrap_pref04(Attrap_prefdpt):


class Attrap_pref04(Attrap):

    # Config
    __HOST = 'https://www.alpes-de-haute-provence.gouv.fr'
    __RAA_PAGE = f'{__HOST}/Publications/Publications-administratives-et-legales/Recueil-des-Actes-Administratifs'
    __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0'
    # Configuration de la préfecture
    hostname = 'https://www.alpes-de-haute-provence.gouv.fr'
    raa_page = f'{hostname}/Publications/Publications-administratives-et-legales/Recueil-des-Actes-Administratifs'
    full_name = 'Préfecture des Alpes-de-Haute-Provence'
    short_code = 'pref04'
    timezone = 'Europe/Paris'

    def __init__(self, data_dir):
        super().__init__(data_dir, self.__USER_AGENT)
        self.enable_tor(10)

    def get_raa(self, keywords):
        elements = []
        page_content = self.get_page(self.__RAA_PAGE, 'get').content
        for sub_page in self.get_sub_pages(
            page_content,
            'div.fr-card__body div.fr-card__content h2.fr-card__title a',
            self.__HOST,
            False
        ):
            if Attrap.guess_date(sub_page['name'], '([0-9]{4}).*').year >= self.not_before.year:
                sub_page_content = self.get_page(sub_page['url'], 'get').content
                for element in self.get_raa_elements(sub_page_content):
                    elements.append(element)

        self.parse_raa(elements, 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('a.fr-link.fr-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').previous_sibling.replace('Télécharger ', '').strip()
                date = datetime.datetime.strptime(a.find('span').get_text().split(' - ')[-1].strip(), '%d/%m/%Y')

                raa = Attrap.RAA(url, date, name)
                elements.append(raa)
        return elements
    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '([0-9]{4})'
+9 −93
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
import os
import datetime
from Attrap_prefdpt import Attrap_prefdpt

from bs4 import BeautifulSoup
from urllib.parse import unquote

from Attrap import Attrap
class Attrap_pref05(Attrap_prefdpt):


class Attrap_pref05(Attrap):

    # Config
    __HOST = 'https://www.hautes-alpes.gouv.fr'
    __RAA_PAGE = f'{__HOST}/Publications/Recueil-des-actes-administratifs'
    __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0'
    # Configuration de la préfecture
    hostname = 'https://www.hautes-alpes.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Préfecture des Hautes-Alpes'
    short_code = 'pref05'
    timezone = 'Europe/Paris'

    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 = []

        # On détermine quelles pages d'année parser
        page_content = self.get_page(self.__RAA_PAGE, 'get').content
        year_pages = self.get_sub_pages(
            page_content,
            '.fr-card.fr-card--sm.fr-card--grey.fr-enlarge-link div.fr-card__body div.fr-card__content h2.fr-card__title a',
            self.__HOST,
            False
        )
        for year_page in year_pages:
            if int(year_page['name'].replace('Année ', '').strip()) >= self.not_before.year:
                year_pages_to_parse.append(year_page['url'])

        month_pages_to_parse = []
        # Pour chaque année, on cherche les sous-pages de mois
        for year_page in year_pages_to_parse:
            page_content = self.get_page(year_page, 'get').content
            month_pages = self.get_sub_pages(
                page_content,
                '.fr-card.fr-card--sm.fr-card--grey.fr-enlarge-link div.fr-card__body div.fr-card__content h2.fr-card__title a',
                self.__HOST,
                False
            )[::-1]
            for month_page in month_pages:
                # On filtre les mois ne correspondant pas à la période analysée
                guessed_date = Attrap.guess_date(month_page['name'], '.*([a-zéû]* [0-9]{4})')
                if guessed_date.replace(day=1) >= self.not_before.replace(day=1):
                    month_pages_to_parse.append(month_page['url'])

        pages_to_parse = []
        # Pour chaque page de mois, on cherche les pages de RAA
        for month_page in month_pages_to_parse:
            pages = self.get_sub_pages_with_pager(
                month_page,
                'div.fr-card.fr-card--horizontal.fr-card--sm.fr-enlarge-link.fr-mb-3w div.fr-card__body div.fr-card__content h2.fr-card__title a.fr-card__link',
                'nav.fr-pagination ul.fr-pagination__list li a.fr-pagination__link.fr-pagination__link--next.fr-pagination__link--lg-label',
                'div.fr-card.fr-card--horizontal.fr-card--sm.fr-enlarge-link.fr-mb-3w div.fr-card__body div.fr-card__content div.fr-card__end p.fr-card__detail',
                self.__HOST
            )[::-1]
            for page in pages:
                guessed_date = datetime.datetime.strptime(page['details'].replace('Publié le ', '').strip(), '%d/%m/%Y')
                if guessed_date.replace(day=1) >= self.not_before.replace(day=1):
                    pages_to_parse.append(page['url'])

        elements = []
        # On parse les pages contenant des RAA
        for page in pages_to_parse:
            page_content = self.get_page(page, 'get').content
            for element in self.get_raa_elements(page_content):
                elements.append(element)

        # On parse les RAA
        self.parse_raa(elements, keywords)
        self.mailer()

    def get_raa_elements(self, page_content):
        elements = []
        # On charge le parser
        soup = BeautifulSoup(page_content, 'html.parser')

        # On récupère chaque balise a
        for a in soup.select('div.fr-grid-row div.fr-downloads-group.fr-downloads-group--bordered ul li a'):
            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').previous_sibling.replace('Télécharger ', '').strip()
                date = datetime.datetime.strptime(a.find('span').get_text().split(' - ')[-1].strip(), '%d/%m/%Y')

                raa = Attrap.RAA(url, date, name)
                elements.append(raa)
        return elements
    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = 'Année *([0-9]{4})'
    Attrap_prefdpt.grey_card['regex']['month'] = '([A-Za-zéû]* *[0-9]{4})'
+8 −99
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
import os
import datetime
from Attrap_prefdpt import Attrap_prefdpt

from bs4 import BeautifulSoup
from urllib.parse import unquote

from Attrap import Attrap
class Attrap_pref06(Attrap_prefdpt):


class Attrap_pref06(Attrap):

    # Config
    __HOST = 'https://www.alpes-maritimes.gouv.fr'
    __RAA_PAGE = {
        '2024': [
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2024/Recueils-mensuels',
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2024/Recueils-speciaux',
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2024/Recueils-specifiques'
        ],
        '2023': [
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2023/Recueils-mensuels',
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2023/Recueils-speciaux',
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2023/Recueils-specifiques'
        ],
        '2022': [
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2022/Recueils-mensuels',
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2022/Recueils-speciaux',
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2022/Recueils-specifiques'
        ],
        '2021': [
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2021/Recueils-mensuels',
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2021/Recueils-speciaux',
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2021/Recueils-specifiques'
        ],
        '2020': [
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2020/Recueils-mensuels',
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2020/Recueils-speciaux',
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2020/Recueils-specifiques'
        ],
        '2019': [
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2019/Recueils-mensuels',
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2019/Recueils-speciaux',
            f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA/Annee-2019/Recueils-specifiques'
        ]
    }
    __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0'
    # Configuration de la préfecture
    hostname = 'https://www.alpes-maritimes.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs-RAA'
    full_name = 'Préfecture des Alpes-Maritimes'
    short_code = 'pref06'
    timezone = 'Europe/Paris'

    def __init__(self, data_dir):
        super().__init__(data_dir, self.__USER_AGENT)
        self.enable_tor(20)

    def get_raa(self, keywords):
        pages_to_parse = []
        if self.not_before.year <= 2024:
            for page in self.__RAA_PAGE['2024']:
                pages_to_parse.append(page)
        if self.not_before.year <= 2023:
            for page in self.__RAA_PAGE['2023']:
                pages_to_parse.append(page)
        if self.not_before.year <= 2022:
            for page in self.__RAA_PAGE['2022']:
                pages_to_parse.append(page)
        if self.not_before.year <= 2021:
            for page in self.__RAA_PAGE['2021']:
                pages_to_parse.append(page)
        if self.not_before.year <= 2020:
            for page in self.__RAA_PAGE['2020']:
                pages_to_parse.append(page)
        if self.not_before.year <= 2019:
            for page in self.__RAA_PAGE['2019']:
                pages_to_parse.append(page)

        elements = self.get_raa_with_pager(
            pages_to_parse,
            ".fr-pagination__link.fr-pagination__link--next",
            self.__HOST
        )
        self.parse_raa(elements, keywords)
        self.mailer()

    def get_raa_elements(self, page_content):
        elements = []
        # On charge le parser
        soup = BeautifulSoup(page_content, 'html.parser')

        # Pour chaque élément fr-card__content, on cherche sa balise a, et si
        # c'est un PDF on le parse
        cards = soup.find_all('div', class_='fr-card__content')
        for card in cards:
            a = card.find('a')
            if a['href'].endswith('.pdf'):
                if a['href'].startswith('/'):
                    url = f"{self.__HOST}{a['href']}"
                else:
                    url = a['href']

                url = unquote(url)
                name = a.get_text().strip()
                date = datetime.datetime.strptime(card.find('p', class_='fr-card__detail').get_text().replace('Publié le ', '').strip(), '%d/%m/%Y')

                raa = Attrap.RAA(url, date, name)
                elements.append(raa)
        return elements
    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = 'Année *([0-9]{4})'

Attrap_pref07.py

0 → 100644
+16 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref07(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.ardeche.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Préfecture de l\'Ardèche'
    short_code = 'pref07'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = 'RAA ([0-9]{4})'
    Attrap_prefdpt.white_card['regex']['month'] = '([a-zéû]* [0-9]{4})'
    Attrap_prefdpt.white_card['add_year_to_months'] = True

Attrap_pref08.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref08(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.ardennes.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Préfecture des Ardennes'
    short_code = 'pref08'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.white_card['regex']['year'] = r'([0-9]{4})'
+6 −67
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
import os
import datetime
from Attrap_prefdpt import Attrap_prefdpt

from bs4 import BeautifulSoup
from urllib.parse import unquote

from Attrap import Attrap
class Attrap_pref09(Attrap_prefdpt):


class Attrap_pref09(Attrap):

    # Config
    __HOST = 'https://www.ariege.gouv.fr'
    __RAA_PAGE = f'{__HOST}/Publications/Recueil-des-actes-administratifs/Recueils-des-Actes-Administratifs-de-l-Ariege-a-partir-du-28-avril-2015'
    __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0'
    # Configuration de la préfecture
    hostname = 'https://www.ariege.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs/Recueils-des-Actes-Administratifs-de-l-Ariege-a-partir-du-28-avril-2015'
    full_name = 'Préfecture de l\'Ariège'
    short_code = 'pref09'

    def __init__(self, data_dir):
        super().__init__(data_dir, self.__USER_AGENT)
        self.enable_tor(10)

    def get_raa(self, keywords):
        pages_to_parse = []

        # Les RAA de l'Ariège sont éparpillés sur des sous-pages par mois.
        # Donc on parse la page principale à la recherche des sous-pages.
        sub_pages = self.get_sub_pages_with_pager(
            self.__RAA_PAGE,
            'div.fr-card__body div.fr-card__content h2.fr-card__title a.fr-card__link',
            'ul.fr-pagination__list li a.fr-pagination__link.fr-pagination__link--next',
            'div.fr-card__body div.fr-card__content div.fr-card__end p.fr-card__detail',
            self.__HOST
        )[::-1]

        # On filtre par date les sous-pages pour limiter les requêtes
        for sub_page in sub_pages:
            guessed_date = datetime.datetime.strptime(sub_page['details'].replace('Publié le ', '').strip(), '%d/%m/%Y')
            guessed_date.replace(day=1)
            if guessed_date >= self.not_before:
                pages_to_parse.append(sub_page['url'])

        # On parse les pages contenant des RAA
        elements = []
        for page in pages_to_parse:
            page_content = self.get_page(page, 'get').content
            for element in self.get_raa_elements(page_content):
                elements.append(element)

        self.parse_raa(elements, keywords)
        self.mailer()

    def get_raa_elements(self, page_content):
        elements = []
        # On charge le parser
        soup = BeautifulSoup(page_content, 'html.parser')

        # On récupère chaque balise a
        for a in soup.select('div.fr-downloads-group.fr-downloads-group--bordered ul li a'):
            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').previous_sibling.replace('Télécharger ', '').strip()
                date = datetime.datetime.strptime(a.find('span').get_text().split(' - ')[-1].strip(), '%d/%m/%Y')

                raa = Attrap.RAA(url, date, name)
                elements.append(raa)
        return elements
    timezone = 'Europe/Paris'

Attrap_pref10.py

0 → 100644
+27 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref10(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.aube.gouv.fr'
    raa_page = [
        f'{hostname}/Publications/RAA-Recueil-des-Actes-Administratifs',
        f'{hostname}/Publications/RAA-Recueil-des-Actes-Administratifs/RAA-Archives'
    ]

    full_name = 'Préfecture de l\'Aube'
    short_code = 'pref10'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = 'RAA *([0-9]{4})'

    # On ajoute un widget custom représentant les liens sur la page d'accueil
    Attrap_prefdpt.widgets.append(
        Attrap_prefdpt.DptWidget(
            'homepage_links',
            regex={'year': 'Année *([0-9]{4})'},
            css_path={'title': 'div.fr-text--lead p a.fr-link'}
        )
    )

Attrap_pref11.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref11(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.aude.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-Actes-Administratifs-RAA'
    full_name = 'Préfecture de l\'Aude'
    short_code = 'pref11'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = 'Année *([0-9]{4})'

Attrap_pref12.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref12(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.aveyron.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Préfecture de l\'Aveyron'
    short_code = 'pref12'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = r'Recueils ([0-9]{4})'
+11 −52
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
import os
import datetime
from Attrap_prefdpt import Attrap_prefdpt

from bs4 import BeautifulSoup
from urllib.parse import unquote

from Attrap import Attrap
class Attrap_pref13(Attrap_prefdpt):


class Attrap_pref13(Attrap):

    # Config
    __HOST = 'https://www.bouches-du-rhone.gouv.fr'
    __RAA_PAGE = [
        f'{__HOST}/Publications/RAA-et-Archives/RAA-2024',
        f'{__HOST}/Publications/RAA-et-Archives/RAA-2023',
        f'{__HOST}/Publications/RAA-et-Archives/Archives-RAA-des-Bouches-du-Rhone/RAA-2022',
        f'{__HOST}/Publications/RAA-et-Archives/Archives-RAA-des-Bouches-du-Rhone/RAA-2021',
        f'{__HOST}/Publications/RAA-et-Archives/Archives-RAA-des-Bouches-du-Rhone/RAA-2020',
        f'{__HOST}/Publications/RAA-et-Archives/Archives-RAA-des-Bouches-du-Rhone/RAA-2019'
    # Configuration de la préfecture
    hostname = 'https://www.bouches-du-rhone.gouv.fr'
    raa_page = [
        f'{hostname}/Publications/RAA-et-Archives',
        f'{hostname}/Publications/RAA-et-Archives/Archives-RAA-des-Bouches-du-Rhone'
    ]
    __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 des Bouches-du-Rhône'
    short_code = 'pref13'
    timezone = 'Europe/Paris'

    def __init__(self, data_dir):
        super().__init__(data_dir, self.__USER_AGENT)
        self.enable_tor(10)

    def get_raa(self, keywords):
        elements = []
        for raa_page in self.__RAA_PAGE:
            page_content = self.get_page(raa_page, 'get').content
            for element in self.get_raa_elements(page_content):
                elements.append(element)

        self.parse_raa(elements, 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('a.fr-link.fr-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').previous_sibling.replace('Télécharger ', '').strip()
                date = datetime.datetime.strptime(a.find('span').get_text().split(' - ')[-1].strip(), '%d/%m/%Y')

                raa = Attrap.RAA(url, date, name)
                elements.append(raa)
        return elements
    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = 'RAA[- ]*([0-9]{4})'
    Attrap_prefdpt.grey_card['follow_link_on_unrecognised_date'] = False

Attrap_pref14.py

0 → 100644
+15 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref14(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.calvados.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs/Recueil-des-actes-administratifs-departemental'
    full_name = 'Préfecture du Calvados'
    short_code = 'pref14'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '([0-9]{4})'
    Attrap_prefdpt.grey_card['exclude'] = ['Archives']

Attrap_pref15.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref15(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.cantal.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-Actes-Administratifs'
    full_name = 'Préfecture du Cantal'
    short_code = 'pref15'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '([0-9]{4})'

Attrap_pref16.py

0 → 100644
+23 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref16(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.charente.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs2'
    full_name = 'Préfecture de la Charente'
    short_code = 'pref16'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = r'Année ([0-9]{4})'

    # On ajoute un widget pour les pages d'années < 2025
    Attrap_prefdpt.widgets.append(
        Attrap_prefdpt.DptWidget(
            'raa_links_before_2025',
            regex={'year-month-day': r'([0-9]{1,2}(?:er){0,1} [a-zéû]* [0-9]{4})'},
            css_path={'title': '.fr-container div.fr-grid-row.fr-grid-row--gutters div.fr-col-12.fr-col-md-8 div.fr-text--lead p a.fr-link'}
        )
    )

Attrap_pref17.py

0 → 100644
+32 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref17(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.charente-maritime.gouv.fr'
    raa_page = f'{hostname}/Publications/RAA-Recueil-des-Actes-Administratifs'
    full_name = 'Préfecture de la Charente-Maritime'
    short_code = 'pref17'
    timezone = 'Europe/Paris'

    # On ajoute des widgets de menu déroulant pour les années et les RAA
    Attrap_prefdpt.select_widgets.append(
        Attrap_prefdpt.DptSelectWidget(
            'select_year',
            regex='Année ([0-9]{4})',
            css_path='select.fr-select#Liste-des-actes-à-consulter-\\(selectionner-puis-valider\\)-\\:-liste-docs',
            type='year',
            follow_link_on_unrecognised_date=False
        )
    )

    Attrap_prefdpt.select_widgets.append(
        Attrap_prefdpt.DptSelectWidget(
            'select_raa',
            regex=r'Recueil-([0-9]{2}-[0-9]{2}-[0-9]{2})-.*',
            date_format=['%y-%m-%d', '%Y-%m-%d'],
            css_path='select.fr-select:not(#Liste-des-actes-à-consulter-\\(selectionner-puis-valider\\)-\\:-liste-docs)',
            type='year-month-day'
        )
    )

Attrap_pref18.py

0 → 100644
+19 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref18(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.cher.gouv.fr'
    raa_page = [
        f'{hostname}/Publications/Recueil-des-actes-administratifs-RAA-Arretes-et-circulaires/Recueil-des-actes-administratifs',
        f'{hostname}/Actions-de-l-Etat/Risques-PPR-DDRM-DICRIM-PCS-IAL-ICPE-PAPI-PGRI/ICPE-Installations-classees-pour-la-protection-de-l-environnement/Arretes-prefectoraux'
    ]
    full_name = 'Préfecture du Cher'
    short_code = 'pref18'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = r'^([0-9]{4})$'
    Attrap_prefdpt.grey_card['regex']['month'] = r'([a-zéû]{1,} [0-9]{4})'
    Attrap_prefdpt.grey_card['add_year_to_months'] = True

Attrap_pref19.py

0 → 100644
+24 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref19(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.correze.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Préfecture de la Corrèze'
    short_code = 'pref19'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '(?:RAA).*([0-9]{4})'
    Attrap_prefdpt.element_css_path = 'div.fr-text--lead ul li a.fr-link.fr-link--download'

    # Un widget représentant des liens vers des pages de RAA (<= février 2024)
    Attrap_prefdpt.widgets.append(
        Attrap_prefdpt.DptWidget(
            'raa_links_2024',
            regex={'year-month-day': r'([0-9]{1,2}(?:er){0,1} [a-zéû]* [0-9]{4})'},
            css_path={'title': '.fr-text--lead a.fr-link'}
        )
    )

Attrap_pref21.py

0 → 100644
+15 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref21(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.cote-dor.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueils-des-Actes-Administratifs'
    full_name = 'Préfecture de la Côte-d\'Or'
    short_code = 'pref21'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['exclude'] = ['FAQ']
    Attrap_prefdpt.white_card['regex']['year'] = r'Recueils des actes administratifs - ([0-9]{4})'

Attrap_pref22.py

0 → 100644
+15 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref22(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.cotes-darmor.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Préfecture des Côtes-d\'Armor '
    short_code = 'pref22'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['month'] = '(.*[0-9]{4})'
    Attrap_prefdpt.white_card['add_year_to_months'] = True

Attrap_pref23.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref23(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.creuse.gouv.fr'
    raa_page = f'{hostname}/Publications/Les-Recueils-des-actes-administratifs'
    full_name = 'Préfecture de la Creuse'
    short_code = 'pref23'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '(?:Année)(?:[ -])*([0-9]{4})'

Attrap_pref24.py

0 → 100644
+16 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref24(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.dordogne.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Préfecture de la Dordogne'
    short_code = 'pref24'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = r'Année ([0-9]{4})'
    Attrap_prefdpt.grey_card['regex']['month'] = r'([a-zéû]{1,} [0-9]{4})'
    Attrap_prefdpt.grey_card['add_year_to_months'] = True

Attrap_pref25.py

0 → 100644
+15 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref25(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.doubs.gouv.fr'
    raa_page = f'{hostname}/Publications/Publications-Legales/Recueil-des-Actes-Administratifs-RAA'
    full_name = 'Préfecture du Doubs'
    short_code = 'pref25'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '([0-9]{4})'
    Attrap_prefdpt.grey_card['follow_link_on_unrecognised_date'] = False

Attrap_pref26.py

0 → 100644
+15 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref26(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.drome.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs-RAA'
    full_name = 'Préfecture de la Drôme'
    short_code = 'pref26'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = r'RAA ([0-9]{4}) -'
    Attrap_prefdpt.white_card['regex']['month'] = r'([a-zéû]{1,} [0-9]{4})'

Attrap_pref27.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref27(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.eure.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs-RAA'
    full_name = 'Préfecture de l\'Eure'
    short_code = 'pref27'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = r'RAA ([0-9]{4})'

Attrap_pref28.py

0 → 100644
+19 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref28(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.eure-et-loir.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Préfecture d\'Eure-et-Loir'
    short_code = 'pref28'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    month_regex = r'([a-zéû]{1,} [0-9]{4})'
    Attrap_prefdpt.grey_card['regex']['year'] = r'Recueil des actes administratifs ([0-9]{4})'
    Attrap_prefdpt.grey_card['regex']['month'] = month_regex
    Attrap_prefdpt.grey_card['add_year_to_months'] = True
    Attrap_prefdpt.white_card['regex']['month'] = month_regex
    Attrap_prefdpt.white_card['add_year_to_months'] = True

Attrap_pref29.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref29(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.finistere.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Préfecture du Finistère'
    short_code = 'pref29'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '(?:Recueils publiés en ).*([0-9]{4})'

Attrap_pref2a.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref2a(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.corse-du-sud.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs/Recueil-des-actes-administratifs-de-la-prefecture-de-la-Corse-du-Sud'
    full_name = 'Préfecture de la Corse-du-Sud'
    short_code = 'pref2a'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.white_card['regex']['year'] = '([0-9]{4})'

Attrap_pref2b.py

0 → 100644
+15 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref2b(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.haute-corse.gouv.fr'
    raa_page = f'{hostname}/Publications/Publications-administratives-et-legales/Recueils-des-actes-administratifs'
    full_name = 'Préfecture de Haute-Corse'
    short_code = 'pref2b'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = 'Recueils des actes administratifs ([0-9]{4})'
    Attrap_prefdpt.white_card['regex']['month'] = '([A-Za-zéû]* [0-9]{4})'

Attrap_pref30.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref30(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.gard.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-Actes-Administratifs'
    full_name = 'Préfecture du Gard'
    short_code = 'pref30'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '([0-9]{4})'
+8 −65
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
import os
import datetime
from Attrap_prefdpt import Attrap_prefdpt

from bs4 import BeautifulSoup
from urllib.parse import unquote

from Attrap import Attrap
class Attrap_pref31(Attrap_prefdpt):


class Attrap_pref31(Attrap):

    # Config
    __HOST = 'https://www.haute-garonne.gouv.fr'
    __RAA_PAGE = f'{__HOST}/Publications/Recueil-des-Actes-Administratifs/Recueil-des-Actes-Administratifs-Haute-Garonne'
    __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
    # Configuration de la préfecture
    hostname = 'https://www.haute-garonne.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-Actes-Administratifs/Recueil-des-Actes-Administratifs-Haute-Garonne'
    full_name = 'Préfecture de la Haute-Garonne'
    short_code = 'pref31'
    timezone = 'Europe/Paris'

    def __init__(self, data_dir):
        super().__init__(data_dir, self.__USER_AGENT)

    def get_raa(self, keywords):
        # On cherche les pages de chaque mois
        page_content = self.get_page(self.__RAA_PAGE, 'get').content
        month_pages = self.get_sub_pages(
            page_content,
            '.fr-card.fr-card--sm.fr-card--grey.fr-enlarge-link div.fr-card__body div.fr-card__content h2.fr-card__title a',
            self.__HOST,
            False
        )[::-1]

        pages_to_parse = []

        # On filtre les pages de mois pour limiter le nombre de requêtes
        for month_page in month_pages:
            guessed_date = Attrap.guess_date(month_page['name'], '([a-zéû]* [0-9]{4})')
            if guessed_date >= self.not_before.replace(day=1):
                pages_to_parse.append(month_page['url'])

        elements = []
        # On parse les pages des mois qu'on veut analyser
        for element in self.get_raa_with_pager(
            pages_to_parse,
            ".fr-pagination__link.fr-pagination__link--next",
            self.__HOST
        ):
            elements.append(element)

        self.parse_raa(elements, keywords)
        self.mailer()

    def get_raa_elements(self, page_content):
        elements = []
        # On charge le parser
        soup = BeautifulSoup(page_content, 'html.parser')

        # On récupère chaque balise a
        for a in soup.select('div.fr-card__body div.fr-card__content h2.fr-card__title a.fr-card__link.menu-item-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)
                name = a.get_text().strip().capitalize()
                date = datetime.datetime.strptime(a['title'].split(' - ')[-1].strip(), '%d/%m/%Y')

                raa = Attrap.RAA(url, date, name)
                elements.append(raa)
        return elements
    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['month'] = '([A-Za-zéû]* [0-9]{4})'

Attrap_pref32.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref32(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.gers.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-Actes-Administratifs-RAA'
    full_name = 'Préfecture du Gers'
    short_code = 'pref32'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.white_card['regex']['year'] = r'Recueils{0,1} {1,}des {1,}actes {1,}administratifs {1,}édités {1,}en {1,}([0-9]{4})'
+10 −102
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
import os
import re
import datetime
import logging
from Attrap_prefdpt import Attrap_prefdpt

from bs4 import BeautifulSoup
from urllib.parse import unquote

from Attrap import Attrap
class Attrap_pref33(Attrap_prefdpt):

logger = logging.getLogger(__name__)


class Attrap_pref33(Attrap):

    # Config
    __HOST = 'https://www.gironde.gouv.fr'
    __RAA_PAGE = f'{__HOST}/Publications/Recueil-des-Actes-Administratifs'
    __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0'
    # Configuration de la préfecture
    hostname = 'https://www.gironde.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-Actes-Administratifs'
    full_name = 'Préfecture de la Gironde'
    short_code = 'pref33'
    timezone = 'Europe/Paris'

    def __init__(self, data_dir):
        super().__init__(data_dir, self.__USER_AGENT)
        self.enable_tor(10)

    def get_raa(self, keywords):
        pages_to_parse = []

        # Parfois un RAA est mal catégorisé et se retrouve sur la page racine, donc on la parse
        pages_to_parse.append(self.__RAA_PAGE)

        # On détermine quelles pages d'année parser
        year_pages_to_parse = []
        page_content = self.get_page(self.__RAA_PAGE, 'get').content
        year_pages = self.get_sub_pages(
            page_content,
            '.fr-card.fr-card--sm.fr-card--grey.fr-enlarge-link div.fr-card__body div.fr-card__content h2.fr-card__title a',
            self.__HOST,
            False
        )
        for year_page in year_pages:
            year = 9999
            try:
                year = int(re.search('.*([0-9]{4})', year_page['name'].strip(), re.IGNORECASE).group(1))
                if year is None:
                    year = 9999
            except Exception as exc:
                logger.warning(f"Impossible de deviner l\'année de la page {year_page['name']}")
                year = 9999

            if year >= self.not_before.year:
                year_pages_to_parse.append(year_page['url'])

        # Pour chaque année, on cherche les sous-pages de mois
        month_pages_to_parse = []
        for year_page in year_pages_to_parse:
            page_content = self.get_page(year_page, 'get').content
            month_pages = self.get_sub_pages(
                page_content,
                '.fr-card.fr-card--sm.fr-card--grey.fr-enlarge-link div.fr-card__body div.fr-card__content h2.fr-card__title a',
                self.__HOST,
                False
            )[::-1]

            for month_page in month_pages:
                guessed_date = Attrap.guess_date(month_page['name'], '([a-zéû]* [0-9]{4})')
                if guessed_date >= self.not_before.replace(day=1):
                    pages_to_parse.append(month_page['url'])

        # On parse les pages sélectionnées
        elements = self.get_raa_with_pager(
            pages_to_parse,
            "ul.fr-pagination__list li a.fr-pagination__link.fr-pagination__link--next.fr-pagination__link--lg-label",
            self.__HOST
        )[::-1]

        self.parse_raa(elements, keywords)
        self.mailer()

    def get_raa_elements(self, page_content):
        elements = []

        # On récupère chaque carte avec un RAA
        for card in BeautifulSoup(page_content, 'html.parser').select('div.fr-card.fr-card--horizontal div.fr-card__body div.fr-card__content'):
            # On récupère le lien
            links = card.select('h2.fr-card__title a.fr-card__link.menu-item-link')
            # On récupère la date
            dates_raw = card.select('div.fr-card__end p.fr-card__detail')

            # Si on a toutes les infos, on continue
            if links and links[0] and dates_raw and dates_raw[0]:
                a = links[0]
                date_raw = dates_raw[0]

                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.get_text().strip()
                    date = datetime.datetime.strptime(date_raw.get_text().replace('Publié le', '').strip(), '%d/%m/%Y')

                    raa = Attrap.RAA(url, date, name)
                    elements.append(raa)
        return elements
    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = 'Recueils{0,1} des [Aa]ctes [Aa]dministratifs de l\'année ([0-9]{4})'
    Attrap_prefdpt.grey_card['regex']['month'] = '([A-Za-zéû]* [0-9]{4})'
    Attrap_prefdpt.grey_card['follow_link_on_unrecognised_date'] = False
+10 −67
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
import os
import datetime
from Attrap_prefdpt import Attrap_prefdpt

from bs4 import BeautifulSoup
from urllib.parse import unquote

from Attrap import Attrap
class Attrap_pref34(Attrap_prefdpt):


class Attrap_pref34(Attrap):

    # Config
    __HOST = 'https://www.herault.gouv.fr'
    __RAA_PAGE = {
        '2024': f'{__HOST}/Publications/Recueils-des-actes-administratifs/Recueil-des-actes-administratifs-2024',
        '2023': f'{__HOST}/Publications/Recueils-des-actes-administratifs/Recueil-des-actes-administratifs-2023',
        '2022': f'{__HOST}/Publications/Recueils-des-actes-administratifs/Recueil-des-actes-administratifs-2022',
        '2021': f'{__HOST}/Publications/Recueils-des-actes-administratifs/Recueil-des-actes-administratifs-2021',
        '2020': f'{__HOST}/Publications/Recueils-des-actes-administratifs/Recueil-des-actes-administratifs-2020',
        '2019': f'{__HOST}/Publications/Recueils-des-actes-administratifs/Archives/Recueil-des-actes-administratifs-2019'
    }
    __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
    # Configuration de la préfecture
    hostname = 'https://www.herault.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueils-des-actes-administratifs'
    full_name = 'Préfecture de l\'Hérault'
    short_code = 'pref34'
    timezone = 'Europe/Paris'

    def __init__(self, data_dir):
        super().__init__(data_dir, self.__USER_AGENT)
        self.enable_tor(10)

    def get_raa(self, keywords):
        pages_to_parse = []
        if self.not_before.year <= 2024:
            pages_to_parse.append(self.__RAA_PAGE['2024'])
        if self.not_before.year <= 2023:
            pages_to_parse.append(self.__RAA_PAGE['2023'])
        if self.not_before.year <= 2022:
            pages_to_parse.append(self.__RAA_PAGE['2022'])
        if self.not_before.year <= 2021:
            pages_to_parse.append(self.__RAA_PAGE['2021'])
        if self.not_before.year <= 2020:
            pages_to_parse.append(self.__RAA_PAGE['2020'])
        if self.not_before.year <= 2019:
            pages_to_parse.append(self.__RAA_PAGE['2019'])

        elements = []
        for raa_page in pages_to_parse:
            page_content = self.get_page(raa_page, 'get').content
            for element in self.get_raa_elements(page_content):
                elements.append(element)

        self.parse_raa(elements, keywords)
        self.mailer()

    def get_raa_elements(self, page_content):
        elements = []
        # On charge le parser
        soup = BeautifulSoup(page_content, 'html.parser')

        # On récupère chaque balise a
        for a in soup.select('a.fr-link.fr-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').previous_sibling.replace('Télécharger ', '').strip()
                date = datetime.datetime.strptime(a.find('span').get_text().split(' - ')[-1].strip(), '%d/%m/%Y')

                raa = Attrap.RAA(url, date, name)
                elements.append(raa)
        return elements
    # Configuration des widgets à analyser
    year_regex = '(?:(?:Recueil des actes administratifs)|(?:Année))[ -]([0-9]{4})'
    Attrap_prefdpt.white_card['regex']['year'] = year_regex
    Attrap_prefdpt.grey_card['regex']['year'] = year_regex
+20 −55
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
import os
import datetime
from Attrap_prefdpt import Attrap_prefdpt

from bs4 import BeautifulSoup
from urllib.parse import unquote

from Attrap import Attrap
class Attrap_pref35(Attrap_prefdpt):


class Attrap_pref35(Attrap):

    # Config
    __HOST = 'https://www.ille-et-vilaine.gouv.fr'
    __RAA_PAGE = [
        f'{__HOST}/Publications/Recueil-des-actes-administratifs/Recueil-des-actes-administratifs-2024',
        f'{__HOST}/Publications/Recueil-des-actes-administratifs/Archives-des-recueils-des-actes-administratifs/Recueil-des-actes-administratifs-2023',
        f'{__HOST}/Publications/Recueil-des-actes-administratifs/Archives-des-recueils-des-actes-administratifs/Recueil-des-actes-administratifs-2022',
        f'{__HOST}/Publications/Recueil-des-actes-administratifs/Archives-des-recueils-des-actes-administratifs/Recueil-des-actes-administratifs-2021',
        f'{__HOST}/Publications/Recueil-des-actes-administratifs/Archives-des-recueils-des-actes-administratifs/Recueil-des-actes-administratifs-2020',
        f'{__HOST}/Publications/Recueil-des-actes-administratifs/Archives-des-recueils-des-actes-administratifs/Recueil-des-actes-administratifs-2019'
    ]
    __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
    # Configuration de la préfecture
    hostname = 'https://www.ille-et-vilaine.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Préfecture d\'Ille-et-Vilaine'
    short_code = 'pref35'

    def __init__(self, data_dir):
        super().__init__(data_dir, self.__USER_AGENT)
        self.enable_tor(10)

    def get_raa(self, keywords):
        elements = []
        for raa_page in self.__RAA_PAGE:
            page_content = self.get_page(raa_page, 'get').content
            for element in self.get_raa_elements(page_content):
                elements.append(element)

        self.parse_raa(elements, 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.find_all('a', href=True, class_='fr-link--download'):
            if 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').previous_sibling.replace('Télécharger ', '').strip()
                date = datetime.datetime.strptime(a.find('span').get_text().split(' - ')[-1].strip(), '%d/%m/%Y')

                raa = Attrap.RAA(url, date, name)
                elements.append(raa)
        return elements
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    year_regex = 'Recueil des actes administratifs ([0-9]{4})'
    Attrap_prefdpt.white_card['regex']['year'] = year_regex

    # On ajoute un widget de menu déroulant
    Attrap_prefdpt.select_widgets.append(
        Attrap_prefdpt.DptSelectWidget(
            'menu_deroulant',
            regex=year_regex,
            css_path='div.fr-select-group select#Archives-des-RAA-liste-docs.fr-select',
            type='year'
        )
    )

Attrap_pref36.py

0 → 100644
+15 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref36(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.indre.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Préfecture de l\'Indre'
    short_code = 'pref36'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = r'^([0-9]{4})$'
    Attrap_prefdpt.grey_card['exclude'] = ['Archives']

Attrap_pref37.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref37(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.indre-et-loire.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-actes-administratifs'
    full_name = 'Préfecture d\'Indre-et-Loire'
    short_code = 'pref37'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = r'Année : ([0-9]{4})'
+22 −96
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
import os
import datetime
import logging
from Attrap_prefdpt import Attrap_prefdpt

from bs4 import BeautifulSoup
from urllib.parse import unquote

from Attrap import Attrap
class Attrap_pref38(Attrap_prefdpt):

logger = logging.getLogger(__name__)


class Attrap_pref38(Attrap):

    # Config
    __HOST = 'https://www.isere.gouv.fr'
    __RAA_PAGE = {
        '2024': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs/Recueils-des-Actes-Administratifs-de-la-prefecture-de-l-Isere-2024',
        '2023': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs/Recueils-des-Actes-Administratifs-de-la-prefecture-de-l-Isere-2023',
        '2022': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs/Archives/Recueils-des-Actes-Administratifs-de-la-prefecture-de-l-Isere-2022',
        '2021': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs/Archives/Archives-des-recueils-des-actes-administratifs-de-la-prefecture-de-l-Isere-2021/Recueils-des-Actes-Administratifs-de-la-prefecture-de-l-Isere-2021',
        '2020': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs/Archives/Archives-des-recueils-des-actes-administratifs-de-la-prefecture-de-l-Isere-2020/Recueils-des-Actes-Administratifs-de-la-Prefecture-de-l-Isere-2020',
        '2019': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs/Archives/Archives-des-Recueils-des-Actes-Administratifs-de-la-prefecture-de-l-Isere-2019/Archives-des-Recueils-des-Actes-Administratifs-de-la-prefecture-de-l-Isere-2019'
    }
    __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0'
    # Configuration de la préfecture
    hostname = 'https://www.isere.gouv.fr'
    raa_page = f'{hostname}/Publications/RAA-Recueil-des-actes-administratifs'
    full_name = 'Préfecture de l\'Isère'
    short_code = 'pref38'

    def __init__(self, data_dir):
        super().__init__(data_dir, self.__USER_AGENT)
        self.enable_tor(20)

    def get_raa(self, keywords):
        pages_to_parse = []
        if self.not_before.year <= 2024:
            pages_to_parse.append(self.__RAA_PAGE['2024'])
        if self.not_before.year <= 2023:
            pages_to_parse.append(self.__RAA_PAGE['2023'])
        if self.not_before.year <= 2022:
            pages_to_parse.append(self.__RAA_PAGE['2022'])
        if self.not_before.year <= 2021:
            pages_to_parse.append(self.__RAA_PAGE['2021'])
        if self.not_before.year <= 2020:
            pages_to_parse.append(self.__RAA_PAGE['2020'])
        if self.not_before.year <= 2019:
            pages_to_parse.append(self.__RAA_PAGE['2019'])

        elements = []
        for raa_page in pages_to_parse:
            page_content = self.get_page(raa_page, 'get').content
            for element in self.get_raa_elements(page_content, raa_page):
                elements.append(element)

        self.parse_raa(elements, keywords)
        self.mailer()

    def get_raa_elements(self, page_content, raa_page):
        elements = []
        # On charge le parser
        soup = BeautifulSoup(page_content, 'html.parser')

        # On récupère le select qui contient la liste des RAA
        select_list = soup.select('select#-liste-docs')[0]
        # On analyse chaque résultat
        for option in select_list.find_all('option'):
            if not option['value'] == "":
                # On estime la date à partir du nom de fichier
                guessed_date = Attrap.guess_date(option['title'], '.* n°[ 0-9]* du ([0-9]*(?:er)? [a-zéû]* [0-9]*)')

                # Si la date estimée correspond à la plage d'analyse, on
                # demande au serveur les détails du RAA
                if guessed_date >= self.not_before:
                    page_content = self.get_page(
                        raa_page,
                        'post',
                        {
                            '-liste-docs': option['value']
                        }
                    ).content

                    # On parse la page de détails pour obtenir les propriétés
                    # du RAA
                    soup = BeautifulSoup(page_content, 'html.parser')
                    a = soup.select('div.liste_deroulante a.fr-link.fr-link--download')[0]

                    # Si la page contient une balise a qui renvoie vers un pdf,
                    # c'est qu'on a obtenu les détails du RAA demandé, donc
                    # on le parse
                    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').previous_sibling.replace('Télécharger ', '').strip()
                        date = datetime.datetime.strptime(a.find('span').get_text().split(' - ')[-1].strip(), '%d/%m/%Y')

                        raa = Attrap.RAA(url, date, name)
                        elements.append(raa)
        return elements
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    year_regex = '(?:(?:[Rr]ecueils{0,1} des [Aa]ctes [Aa]dministratifs de la [Pp]réfecture de l\'Isère[ -]*)|(?:Année ))([0-9]{4})'
    Attrap_prefdpt.grey_card['regex']['year'] = year_regex
    Attrap_prefdpt.white_card['regex']['year'] = year_regex
    Attrap_prefdpt.white_card['exclude'] = ['Vous recherchez "Le Journal officiel de la République française" ?']

    # On ajoute un widget de menu déroulant
    Attrap_prefdpt.select_widgets.append(
        Attrap_prefdpt.DptSelectWidget(
            'menu_deroulant',
            regex=r'([0-9]{1,2}(?:er){0,1} [a-zéû]* [0-9]{4})',
            css_path='select#-liste-docs',
            type='year-month-day'
        )
    )

Attrap_pref39.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref39(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = "https://www.jura.gouv.fr"
    raa_page = f'{hostname}/Publications/Publications-legales/Recueil-des-Actes-Administratifs'
    full_name = "Préfecture du Jura"
    short_code = "pref39"
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = 'Année ([0-9]{4})'

Attrap_pref40.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref40(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.landes.gouv.fr/'
    raa_page = f'{hostname}/Publications/Publications-legales/Le-Recueil-des-Actes-Administratifs-RAA'
    full_name = 'Préfecture des Landes'
    short_code = 'pref40'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '([0-9]{4})'

Attrap_pref41.py

0 → 100644
+15 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref41(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.loir-et-cher.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Préfecture de Loir-et-Cher'
    short_code = 'pref41'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = r'Année ([0-9]{4})'
    Attrap_prefdpt.grey_card['regex']['month'] = r'([a-zéû]{1,} [0-9]{4})'
+9 −73
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
import os
import datetime
import re
from Attrap_prefdpt import Attrap_prefdpt

from bs4 import BeautifulSoup
from urllib.parse import unquote

from Attrap import Attrap
class Attrap_pref42(Attrap_prefdpt):


class Attrap_pref42(Attrap):

    # Config
    __HOST = 'https://www.loire.gouv.fr'
    __RAA_PAGE = f'{__HOST}/Publications/Publications-legales/Recueil-des-Actes-Administratifs'
    __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0'
    full_name = 'Préfecture de de la Loire'
    # Configuration de la préfecture
    hostname = 'https://www.loire.gouv.fr'
    raa_page = f'{hostname}/Publications/Publications-legales/Recueil-des-Actes-Administratifs'
    full_name = 'Préfecture de la Loire'
    short_code = 'pref42'
    timezone = 'Europe/Paris'

    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 = []

        # On détermine quelles pages d'année parser
        year_pages = self.get_sub_pages_with_pager(
            self.__RAA_PAGE,
            'div.fr-card.fr-card--horizontal.fr-card--sm.fr-enlarge-link.fr-mb-3w div.fr-card__body div.fr-card__content h2.fr-card__title a.fr-card__link',
            'ul.fr-pagination__list li a.fr-pagination__link.fr-pagination__link--next.fr-pagination__link--lg-label',
            'div.fr-card.fr-card--horizontal.fr-card--sm.fr-enlarge-link.fr-mb-3w div.fr-card__body div.fr-card__content div.fr-card__end p.fr-card__detail',
            self.__HOST
        )
        for year_page in year_pages:
            year = 9999
            try:
                year = int(re.search('([0-9]{4})', year_page['name'], re.IGNORECASE).group(1))
                if year is None:
                    year = 9999
            except Exception as exc:
                logger.warning(f"Impossible de deviner l\'année de la page {year_page['name']}")
                year = 9999

            if year >= self.not_before.year:
                year_pages_to_parse.append(year_page['url'])

        elements = []
        # Pour chaque année, on parse les RAA
        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)[::-1]:
                elements.append(element)

        # On parse les RAA
        self.parse_raa(elements, keywords)
        self.mailer()

    def get_raa_elements(self, page_content):
        elements = []
        # On charge le parser
        soup = BeautifulSoup(page_content, 'html.parser')

        # On récupère chaque balise a
        for a in soup.select('div.fr-downloads-group.fr-downloads-group--bordered ul li a'):
            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').previous_sibling.replace('Télécharger ', '').strip()
                date = datetime.datetime.strptime(a.find('span').get_text().split(' - ')[-1].strip(), '%d/%m/%Y')

                raa = Attrap.RAA(url, date, name)
                elements.append(raa)
        return elements
    # Configuration des widgets à analyser
    Attrap_prefdpt.white_card['regex']['year'] = '([0-9]{4})'

Attrap_pref43.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref43(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.haute-loire.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueils-des-actes-administratifs'
    full_name = 'Préfecture de Haute-Loire'
    short_code = 'pref43'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.white_card['regex']['year'] = r'Recueils{0,1} des actes administratifs(?: -){0,1} ([0-9]{4})'
+10 −102
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
import os
import datetime
import logging
from Attrap_prefdpt import Attrap_prefdpt

from bs4 import BeautifulSoup
from urllib.parse import unquote

from Attrap import Attrap
class Attrap_pref44(Attrap_prefdpt):

logger = logging.getLogger(__name__)


class Attrap_pref44(Attrap):

    # Config
    __HOST = 'https://www.loire-atlantique.gouv.fr'
    __RAA_PAGE = f'{__HOST}/Publications/Recueil-des-actes-administratifs-RAA-en-Loire-Atlantique'
    __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0'
    # Configuration de la préfecture
    hostname = 'https://www.loire-atlantique.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs-RAA-en-Loire-Atlantique'
    full_name = 'Préfecture de la Loire-Atlantique'
    short_code = 'pref44'
    timezone = 'Europe/Paris'

    def __init__(self, data_dir):
        super().__init__(data_dir, self.__USER_AGENT)
        self.enable_tor(10)

    def get_raa(self, keywords):
        pages_to_parse = []

        # Parfois un RAA est mal catégorisé et se retrouve sur la page racine, donc on la parse
        pages_to_parse.append(self.__RAA_PAGE)

        # On détermine quelles pages d'année parser
        year_pages_to_parse = []
        page_content = self.get_page(self.__RAA_PAGE, 'get').content
        year_pages = self.get_sub_pages(
            page_content,
            '.fr-card.fr-card--sm.fr-card--grey.fr-enlarge-link div.fr-card__body div.fr-card__content h2.fr-card__title a',
            self.__HOST,
            False
        )
        for year_page in year_pages:
            year = 9999
            try:
                year = int(year_page['name'].strip())
                if year is None:
                    year = 9999
            except Exception as exc:
                logger.warning(f"Impossible de deviner l\'année de la page {year_page['name']}")
                year = 9999

            if year >= self.not_before.year:
                year_pages_to_parse.append(year_page['url'])

                # Parfois un RAA est mal catégorisé et se retrouve sur la page de l'année, donc on la parse
                pages_to_parse.append(year_page['url'])

        # Pour chaque année, on cherche les sous-pages de mois
        month_pages_to_parse = []
        for year_page in year_pages_to_parse:
            page_content = self.get_page(year_page, 'get').content
            month_pages = self.get_sub_pages(
                page_content,
                '.fr-card.fr-card--sm.fr-card--grey.fr-enlarge-link div.fr-card__body div.fr-card__content h2.fr-card__title a',
                self.__HOST,
                False
            )[::-1]

            for month_page in month_pages:
                pages_to_parse.append(month_page['url'])

        # On parse les pages sélectionnées
        elements = self.get_raa_with_pager(
            pages_to_parse,
            "ul.fr-pagination__list li a.fr-pagination__link.fr-pagination__link--next.fr-pagination__link--lg-label",
            self.__HOST
        )[::-1]

        self.parse_raa(elements, keywords)
        self.mailer()

    def get_raa_elements(self, page_content):
        elements = []

        # On récupère chaque carte avec un RAA
        for card in BeautifulSoup(page_content, 'html.parser').select('div.fr-card.fr-card--horizontal div.fr-card__body div.fr-card__content'):
            # On récupère le lien
            links = card.select('h2.fr-card__title a.fr-card__link.menu-item-link')
            # On récupère la date
            dates_raw = card.select('div.fr-card__end p.fr-card__detail')

            # Si on a toutes les infos, on continue
            if links and links[0] and dates_raw and dates_raw[0]:
                a = links[0]
                date_raw = dates_raw[0]

                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.get_text().strip()
                    date = datetime.datetime.strptime(date_raw.get_text().replace('Publié le', '').strip(), '%d/%m/%Y')

                    raa = Attrap.RAA(url, date, name)
                    elements.append(raa)
        return elements
    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '([0-9]{4})'
    Attrap_prefdpt.grey_card['regex']['month'] = '([A-Za-zéû]* [0-9]{4})'
    Attrap_prefdpt.grey_card['add_year_to_months'] = True

Attrap_pref45.py

0 → 100644
+19 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref45(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.loiret.gouv.fr'
    raa_page = [
        f'{hostname}/Publications/Recueil-des-actes-administratifs/Recueil-des-actes-administratifs-departementaux',
        f'{hostname}/Publications/Recueil-des-actes-administratifs/Recueil-des-actes-administratifs-departementaux/Delegations-de-signature-et-de-pouvoir',
    ]
    full_name = 'Préfecture du Loiret'
    short_code = 'pref45'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = r'$([0-9]{4})^'
    Attrap_prefdpt.grey_card['regex']['month'] = r'([a-zéû]* [0-9]{4})'
    Attrap_prefdpt.grey_card['follow_link_on_unrecognised_date'] = False

Attrap_pref46.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref46(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.lot.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-Actes-Administratifs'
    full_name = 'Préfecture du Lot'
    short_code = 'pref46'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = r'RAA {1,}([0-9]{4})'

Attrap_pref47.py

0 → 100644
+20 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref47(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.lot-et-garonne.gouv.fr'
    raa_page = [
        f'{hostname}/Publications/Publications-legales/RAA',
        f'{hostname}/Publications/Publications-legales/Arretes-prefectoraux'
    ]
    full_name = 'Préfecture de Lot-et-Garonne'
    short_code = 'pref47'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    month_regex = r'([a-zéû]{1,} [0-9]{4})'
    Attrap_prefdpt.grey_card['regex']['year'] = r'Recueil des actes administratifs (?:année ){0,1}([0-9]{4})'
    Attrap_prefdpt.grey_card['regex']['month'] = month_regex
    Attrap_prefdpt.grey_card['add_year_to_months'] = True

Attrap_pref48.py

0 → 100644
+16 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref48(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.lozere.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-Actes-Administratifs-R.A.A'
    full_name = 'Préfecture de la Lozère'
    short_code = 'pref48'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '([0-9]{4})'
    Attrap_prefdpt.grey_card['regex']['month'] = '([a-zéû]* [0-9]{4})'
    Attrap_prefdpt.grey_card['add_year_to_months'] = True

Attrap_pref49.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref49(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.maine-et-loire.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-Actes-Administratifs'
    full_name = 'Préfecture de Maine-et-Loire'
    short_code = 'pref49'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '.*([0-9]{4})'

Attrap_pref50.py

0 → 100644
+16 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref50(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.manche.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Préfecture de la Manche'
    short_code = 'pref50'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '([0-9]{4})'

    Attrap_prefdpt.element_css_path = '.fr-container .fr-grid-row.fr-grid-row--gutters div.fr-col-12.fr-col-md-8 a.fr-link'

Attrap_pref51.py

0 → 100644
+39 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref51(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.marne.gouv.fr'
    raa_page = [
        f'{hostname}/Publications/Publications-administratives-et-legales/RAA-Recueils-des-actes-administratifs/RAA-Recueils-des-actes-administratifs-de-la-prefecture-de-la-Marne',
        f'{hostname}/Publications/Arretes-prefectoraux'
    ]
    full_name = 'Préfecture de la Marne'
    short_code = 'pref51'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.white_card['regex']['year'] = r'(?:(?:Arrêtés préfectoraux)|(?:RAA ){0,1}(?:Année)) ([0-9]{4})'
    Attrap_prefdpt.grey_card['regex']['year'] = r'^([0-9]{4})$'

    year_month_day_regex = r'([0-9]{1,2}(?:er){0,1} [a-zéû]* [0-9]{4})'

    # On ajoute un widget de menu déroulant
    Attrap_prefdpt.select_widgets.append(
        Attrap_prefdpt.DptSelectWidget(
            'menu_deroulant_2025',
            regex=year_month_day_regex,
            css_path='select.fr-select',
            type='year-month-day'
        )
    )

    # On ajoute un widget pour les pages d'années < 2025
    Attrap_prefdpt.widgets.append(
        Attrap_prefdpt.DptWidget(
            'raa_links_before_2025',
            regex={'year-month-day': year_month_day_regex},
            css_path={'title': '.fr-container div.fr-grid-row.fr-grid-row--gutters .fr-table table a.embed-inline-left'}
        )
    )

Attrap_pref52.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref52(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.haute-marne.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-Actes-Administratifs-RAA'
    full_name = 'Préfecture de la Haute-Marne'
    short_code = 'pref52'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.white_card['regex']['year'] = 'Année ([0-9]{4})'

Attrap_pref53.py

0 → 100644
+15 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref53(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.mayenne.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-Actes-Administratifs'
    full_name = 'Préfecture de la Mayenne'
    short_code = 'pref53'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = 'Année ([0-9]{4})'
    Attrap_prefdpt.grey_card['regex']['month'] = '([a-zéû]* [0-9]{4})'

Attrap_pref54.py

0 → 100644
+24 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref54(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.meurthe-et-moselle.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Préfecture de Meurthe-et-Moselle'
    short_code = 'pref54'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.white_card['regex']['year'] = '([0-9]{4})'

    # On ajoute un widget de menu déroulant
    Attrap_prefdpt.select_widgets.append(
        Attrap_prefdpt.DptSelectWidget(
            'menu_deroulant',
            regex='.* du ([0-9]*(?:er|ER)? [A-Za-zéÉûÛ]* [0-9]*)',
            css_path='select#Liste-liste-docs',
            type='year-month-day'
        )
    )

Attrap_pref55.py

0 → 100644
+21 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref55(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.meuse.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-Actes-Administratifs-RAA'
    full_name = 'Préfecture de la Meuse'
    short_code = 'pref55'
    timezone = 'Europe/Paris'

    # On configure le widget de menu déroulant
    Attrap_prefdpt.select_widgets.append(
        Attrap_prefdpt.DptSelectWidget(
            'menu_deroulant',
            regex='RAA année ([0-9]{4})',
            css_path='select#Liste-des-recueils-liste-docs',
            type='year'
        )
    )

Attrap_pref56.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref56(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.morbihan.gouv.fr'
    raa_page = f'{hostname}/RAA'
    full_name = 'Préfecture du Morbihan'
    short_code = 'pref56'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = 'Année ([0-9]{4})'

Attrap_pref57.py

0 → 100644
+60 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
import datetime

from bs4 import BeautifulSoup
from urllib.parse import quote

from Attrap import Attrap


class Attrap_pref57(Attrap):

    # Config
    hostname = 'https://mc.moselle.gouv.fr'
    raa_session_initialise = f'{hostname}/raa.html'
    raa_page = f'{hostname}/index.php?op=raa&do=raa_rec'
    full_name = 'Préfecture de la Moselle'
    short_code = 'pref57'
    timezone = 'Europe/Paris'

    def __init__(self, data_dir):
        super().__init__(data_dir)
        self.set_sleep_time(0)

    def get_raa(self):
        # Il est nécessaire d'initialiser la session , sinon le site ne renvoie que des numéros de téléphone de médecins agréés...
        self.get_page(self.raa_session_initialise, 'get').content

        elements = self.get_raa_with_pager(
            self.raa_page,
            'a[title=Suivant]',
            self.hostname,
            filter_from_last_element_date=True
        )

        self.parse_raa(elements)

    def get_raa_elements(self, page_content):
        elements = []
        # On charge le parser
        soup = BeautifulSoup(page_content, 'html.parser')

        elements = []

        # On parse les lignes du tableau
        for tr in soup.select('table td tr'):
            # On cherche les lignes dont la 4e colonne renvoie vers un lien de téléchargement
            td = tr.select('td')
            if len(td) > 4:
                a = td[3].select('a')
                if len(a) > 0:
                    if a[0].get('href').startswith('https://mc.moselle.gouv.fr/index.php?dims_op=doc_file_download'):
                        name = td[0].get_text().strip()
                        date = datetime.datetime.strptime(td[2].get_text().strip(), '%d/%m/%Y')
                        url = a[0].get('href')

                        if name == "":
                            name = "Recueil du " + td[2].get_text().strip()

                        raa = Attrap.RAA(url, date, name, timezone=self.timezone, ocrmypdf_output_type='pdfa')
                        elements.append(raa)
        return elements

Attrap_pref58.py

0 → 100644
+17 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref58(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.nievre.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Préfecture de la Nièvre'
    short_code = 'pref58'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = r'RAA année ([0-9]{4})'

    Attrap_prefdpt.white_card['exclude'] = ['Recueil des actes de la Bourgogne']
    Attrap_prefdpt.grey_card['exclude'] = ['RAA avant 2015']
+10 −79
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
import os
import datetime
import dateparser
import logging
from Attrap_prefdpt import Attrap_prefdpt

from bs4 import BeautifulSoup
from urllib.parse import unquote

from Attrap import Attrap
class Attrap_pref59(Attrap_prefdpt):

logger = logging.getLogger(__name__)


class Attrap_pref59(Attrap):

    # Config
    __HOST = 'https://www.nord.gouv.fr'
    __RAA_PAGE = {
        '2024': f'{__HOST}/Publications/Recueils-des-actes-administratifs/RAA-du-departement-du-Nord/2024',
        '2023': f'{__HOST}/Publications/Recueils-des-actes-administratifs/RAA-du-departement-du-Nord/2023',
        '2022': f'{__HOST}/Publications/Recueils-des-actes-administratifs/RAA-du-departement-du-Nord/2022',
        '2021': f'{__HOST}/Publications/Recueils-des-actes-administratifs/RAA-du-departement-du-Nord/2021',
        '2020': f'{__HOST}/Publications/Recueils-des-actes-administratifs/RAA-du-departement-du-Nord/2020',
        '2019': f'{__HOST}/Publications/Recueils-des-actes-administratifs/RAA-du-departement-du-Nord/2019'
    }
    __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0'
    # Configuration de la préfecture
    hostname = 'https://www.nord.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueils-des-actes-administratifs/RAA-du-departement-du-Nord'
    full_name = 'Préfecture du Nord'
    short_code = 'pref59'
    timezone = 'Europe/Paris'

    def __init__(self, data_dir):
        super().__init__(data_dir, self.__USER_AGENT)
        self.enable_tor(20)

    def get_raa(self, keywords):
        pages_to_parse = []
        if self.not_before.year <= 2024:
            pages_to_parse.append(self.__RAA_PAGE['2024'])
        if self.not_before.year <= 2023:
            pages_to_parse.append(self.__RAA_PAGE['2023'])
        if self.not_before.year <= 2022:
            pages_to_parse.append(self.__RAA_PAGE['2022'])
        if self.not_before.year <= 2021:
            pages_to_parse.append(self.__RAA_PAGE['2021'])
        if self.not_before.year <= 2020:
            pages_to_parse.append(self.__RAA_PAGE['2020'])
        if self.not_before.year <= 2019:
            pages_to_parse.append(self.__RAA_PAGE['2019'])

        elements = []
        for raa_page in pages_to_parse:
            page_content = self.get_page(raa_page, 'get').content
            sub_pages = self.get_sub_pages(
                page_content,
                'div.fr-card__body div.fr-card__content h2.fr-card__title a',
                self.__HOST,
                True
            )
            for sub_page in sub_pages[::-1]:
                sub_page_content = self.get_page(sub_page['url'], 'get').content
                for element in self.get_raa_elements(sub_page_content):
                    elements.append(element)

        self.parse_raa(elements, keywords)
        self.mailer()

    def get_raa_elements(self, page_content):
        elements = []
        # On charge le parser
        soup = BeautifulSoup(page_content, 'html.parser')

        # On récupère chaque balise a
        for a in soup.select('a.fr-link.fr-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').previous_sibling.replace('Télécharger ', '').strip()
                date = datetime.datetime.strptime(a.find('span').get_text().split(' - ')[-1].strip(), '%d/%m/%Y')

                raa = Attrap.RAA(url, date, name)
                elements.append(raa)
        return elements
    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '([0-9]{4})'
    Attrap_prefdpt.grey_card['regex']['month'] = '([A-Za-zéû]* [0-9]{4})'
    Attrap_prefdpt.grey_card['add_year_to_months'] = True

Attrap_pref60.py

0 → 100644
+15 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref60(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.oise.gouv.fr'
    raa_page = f'{hostname}/Publications/Publications-legales/Recueils-des-actes-administratifs-RAA'
    full_name = 'Préfecture de l\'Oise'
    short_code = 'pref60'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = 'RAA ([0-9]{4})'
    Attrap_prefdpt.grey_card['exclude'] = ['Trouver un acte administratif avec l\'outil ReAct']

Attrap_pref61.py

0 → 100644
+18 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref61(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.orne.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-Actes-Administratifs-RAA/Recueil-des-Actes-Administratifs-RAA'
    full_name = 'Préfecture de l\'Orne'
    short_code = 'pref61'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = 'Le Recueil des actes administratifs ([0-9]{4})'
    Attrap_prefdpt.grey_card['regex']['month'] = '([A-Za-zéû]* [0-9]{4})'
    Attrap_prefdpt.grey_card['add_year_to_months'] = True
    Attrap_prefdpt.white_card['regex']['month'] = '([A-Za-zéû]* [0-9]{4})'
    Attrap_prefdpt.white_card['add_year_to_months'] = True
+7 −91
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
import os
import datetime
from Attrap_prefdpt import Attrap_prefdpt

from bs4 import BeautifulSoup
from urllib.parse import unquote

from Attrap import Attrap


class Attrap_pref62(Attrap):
class Attrap_pref62(Attrap_prefdpt):

    # Config
    __HOST = 'https://www.pas-de-calais.gouv.fr'
    __RAA_PAGE = {
        '2024': [
            f'{__HOST}/Publications/Recueil-des-actes-administratifs/2024-Recueils-des-actes-administratifs'
        ],
        '2023': [
            f'{__HOST}/Publications/Recueil-des-actes-administratifs/2023-Recueils-des-actes-administratifs',
            f'{__HOST}/Publications/Recueil-des-actes-administratifs/2023-Recueils-speciaux-des-actes-administratifs'
        ],
        '2022': [
            f'{__HOST}/Publications/Recueil-des-actes-administratifs/2022-Recueils-des-Actes-Administratifs',
            f'{__HOST}/Publications/Recueil-des-actes-administratifs/2022-Recueils-Speciaux-des-Actes-Administratifs'
        ],
        '2021': [
            f'{__HOST}/Publications/Recueil-des-actes-administratifs/2021-Recueils-des-actes-administratifs',
            f'{__HOST}/Publications/Recueil-des-actes-administratifs/2021-Recueils-speciaux-des-actes-administratifs'
        ],
        '2020': [
            f'{__HOST}/Publications/Recueil-des-actes-administratifs/2020-Recueils-des-actes-administratifs',
            f'{__HOST}/Publications/Recueil-des-actes-administratifs/2020-Recueils-speciaux-des-actes-administratifs'
        ],
        '2019': [
            f'{__HOST}/Publications/Recueil-des-actes-administratifs/2019-Recueil-des-actes-administratifs',
            f'{__HOST}/Publications/Recueil-des-actes-administratifs/2019-Recueils-speciaux-des-actes-administratifs'
        ]
    }
    __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0'
    hostname = 'https://www.pas-de-calais.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Préfecture du Pas-de-Calais'
    short_code = 'pref62'
    timezone = 'Europe/Paris'

    def __init__(self, data_dir):
        super().__init__(data_dir, self.__USER_AGENT)
        self.enable_tor(20)

    def get_raa(self, keywords):
        pages_to_parse = []
        if self.not_before.year <= 2024:
            for page in self.__RAA_PAGE['2024']:
                pages_to_parse.append(page)
        if self.not_before.year <= 2023:
            for page in self.__RAA_PAGE['2023']:
                pages_to_parse.append(page)
        if self.not_before.year <= 2022:
            for page in self.__RAA_PAGE['2022']:
                pages_to_parse.append(page)
        if self.not_before.year <= 2021:
            for page in self.__RAA_PAGE['2021']:
                pages_to_parse.append(page)
        if self.not_before.year <= 2020:
            for page in self.__RAA_PAGE['2020']:
                pages_to_parse.append(page)
        if self.not_before.year <= 2019:
            for page in self.__RAA_PAGE['2019']:
                pages_to_parse.append(page)

        elements = []
        for raa_page in pages_to_parse:
            page_content = self.get_page(raa_page, 'get').content
            for element in self.get_raa_elements(page_content):
                elements.append(element)

        self.parse_raa(elements, keywords)
        self.mailer()

    def get_raa_elements(self, page_content):
        elements = []
        # On charge le parser
        soup = BeautifulSoup(page_content, 'html.parser')

        # On récupère le div qui contient la liste des RAA
        cards = soup.select('div.fr-downloads-group.fr-downloads-group--bordered')[0]
        # On analyse chaque balise a dans ce div
        for a in cards.find_all('a', href=True):
            if 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').previous_sibling.replace('Télécharger ', '').strip()
                date = datetime.datetime.strptime(a.find('span').get_text().split(' - ')[-1].strip(), '%d/%m/%Y')

                raa = Attrap.RAA(url, date, name)
                elements.append(raa)
        return elements[::-1]
    # Configuration des widgets à analyser
    Attrap_prefdpt.white_card['regex']['year'] = '([0-9]{4})'

Attrap_pref63.py

0 → 100644
+14 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
from Attrap_prefdpt import Attrap_prefdpt


class Attrap_pref63(Attrap_prefdpt):

    # Configuration de la préfecture
    hostname = 'https://www.puy-de-dome.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueils-des-actes-administratifs/Recueils-des-actes-administratifs-Puy-de-Dome'
    full_name = 'Préfecture du Puy-de-Dôme'
    short_code = 'pref63'
    timezone = 'Europe/Paris'

    # Configuration des widgets à analyser
    Attrap_prefdpt.grey_card['regex']['year'] = '([0-9]{4})'
+10 −95
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
import os
import datetime
from Attrap_prefdpt import Attrap_prefdpt

from bs4 import BeautifulSoup
from urllib.parse import unquote

from Attrap import Attrap
class Attrap_pref64(Attrap_prefdpt):


class Attrap_pref64(Attrap):

    # Config
    __HOST = 'https://www.pyrenees-atlantiques.gouv.fr'
    __RAA_PAGE = {
        '2024': f'{__HOST}/Publications/Recueil-des-actes-administratifs/Annee-2024',
        '2023': f'{__HOST}/Publications/Recueil-des-actes-administratifs/Annee-2023',
        '2022': f'{__HOST}/Publications/Recueil-des-actes-administratifs/Annee-2022',
        '2021': f'{__HOST}/Publications/Recueil-des-actes-administratifs/Annee-2021',
        '2020': f'{__HOST}/Publications/Recueil-des-actes-administratifs/Annee-2020',
        '2019': f'{__HOST}/Publications/Recueil-des-actes-administratifs/Annee-2019'
    }
    __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0'
    # Configuration de la préfecture
    hostname = 'https://www.pyrenees-atlantiques.gouv.fr'
    raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs'
    full_name = 'Préfecture des Pyrénées-Atlantiques'
    short_code = 'pref64'
    timezone = 'Europe/Paris'

    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 = []
        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 = []
        # Pour chaque année, on cherche les sous-pages de mois
        for year_page in year_pages_to_parse:
            page_content = self.get_page(year_page, 'get').content
            month_pages = self.get_sub_pages(
                page_content,
                '.fr-card.fr-card--sm.fr-card--grey.fr-enlarge-link div.fr-card__body div.fr-card__content h2.fr-card__title a',
                self.__HOST,
                False
            )[::-1]

            # Pour chaque page de mois, on récupère les liens vers des pages de RAA
            for month_page in month_pages:
                raa_links = self.get_sub_pages_with_pager(
                    month_page['url'],
                    'div.content-view-line div.class-file h2 a',
                    'ul.fr-pagination__list li a.fr-pagination__link.fr-pagination__link--next',
                    None,
                    self.__HOST
                )[::-1]

                # Pour chaque lien vers un RAA, on filtre ceux ne correspondant pas à la période analysée
                for raa_link in raa_links:
                    guessed_date = Attrap.guess_date(raa_link['name'], 'n°[ 0-9-]* du ([0-9]*(?:er)? [a-zéû]* [0-9]*)')
                    if guessed_date >= self.not_before:
                        pages_to_parse.append(raa_link['url'])

        # On parse les pages contenant des RAA
        elements = []
        for page in pages_to_parse:
            page_content = self.get_page(page, 'get').content
            for raa in self.get_raa_elements(page_content):
                elements.append(raa)

        self.parse_raa(elements, keywords)
        self.mailer()

    def get_raa_elements(