From 7bbd02a1bc296e0b5024ffefa6df827cdd6fe8ff Mon Sep 17 00:00:00 2001 From: Bastien Le Querrec <blq@laquadrature.net> Date: Fri, 5 Apr 2024 03:04:18 +0200 Subject: [PATCH] lint: ignore la taille des lignes --- Makefile | 2 +- RAAspotter.py | 99 +++++++++++-------------------------------- RAAspotter_ppparis.py | 14 ++---- RAAspotter_pref04.py | 25 +++-------- RAAspotter_pref06.py | 66 +++++++++-------------------- RAAspotter_pref09.py | 35 ++++----------- RAAspotter_pref13.py | 28 ++++-------- RAAspotter_pref34.py | 31 ++++---------- RAAspotter_pref35.py | 36 ++++------------ RAAspotter_pref38.py | 47 +++++--------------- RAAspotter_pref59.py | 38 +++++------------ RAAspotter_pref62.py | 55 +++++++----------------- RAAspotter_pref65.py | 34 +++++---------- RAAspotter_pref69.py | 41 ++++++------------ RAAspotter_pref81.py | 64 ++++++++-------------------- RAAspotter_pref83.py | 37 +++++----------- RAAspotter_pref976.py | 49 ++++++--------------- cli.py | 32 +++++--------- 18 files changed, 202 insertions(+), 531 deletions(-) diff --git a/Makefile b/Makefile index 987a8a5..643d7e2 100644 --- a/Makefile +++ b/Makefile @@ -30,4 +30,4 @@ pref83: pref976: python cli.py --pref pref976 lint: - pycodestyle --first --show-source *.py + pycodestyle --first --show-source --ignore=E501 *.py diff --git a/RAAspotter.py b/RAAspotter.py index c4b7555..8101bc8 100644 --- a/RAAspotter.py +++ b/RAAspotter.py @@ -54,9 +54,7 @@ class RAAspotter: def get_sha256(self): if (self.sha256 == ""): - self.sha256 = hashlib.sha256( - self.filename.encode('utf-8') - ).hexdigest() + self.sha256 = hashlib.sha256(self.filename.encode('utf-8')).hexdigest() return self.sha256 def __init__(self, data_dir, user_agent=''): @@ -65,9 +63,7 @@ class RAAspotter: self.session = requests.Session() self.data_dir = data_dir self.found = False - self.output_file_path = os.path.dirname( - os.path.abspath(__file__) - )+f'/output_{self.short_code}.log' + self.output_file_path = os.path.dirname(os.path.abspath(__file__)) + f'/output_{self.short_code}.log' self.sleep_time = 0 self.tor_enabled = False self.tor_max_requests = 0 @@ -84,8 +80,7 @@ class RAAspotter: f.write('') f.close() - def configure_mastodon(self, access_token, instance, mastodon_prefix, - mastodon_suffix): + def configure_mastodon(self, access_token, instance, mastodon_prefix, mastodon_suffix): if access_token and access_token != "" and instance and instance != "": self.mastodon = Mastodon( access_token=access_token, @@ -142,8 +137,7 @@ class RAAspotter: sub_page_content = self.get_page(url, 'get').content if not self.has_pdf(sub_page_content): logger.info( - f'{url} ne contient pas de PDF, on ' - 'récupère ses sous-pages' + f'{url} ne contient pas de PDF, on récupère ses sous-pages' ) for sub_sub_page in self.get_sub_pages( sub_page_content, @@ -166,8 +160,7 @@ class RAAspotter: sub_pages.append(sub_page) return sub_pages - def get_sub_pages_with_pager(self, page, sub_page_element, pager_element, - details_element, host): + def get_sub_pages_with_pager(self, page, sub_page_element, pager_element, details_element, host): pages = [] page_content = self.get_page(page, 'get').content @@ -252,9 +245,7 @@ class RAAspotter: webdriver_options.add_argument("--disable-gpu") webdriver_options.add_argument("--disable-dev-shm-usage") webdriver_options.add_argument("--use_subprocess") - webdriver_options.add_argument( - "--disable-blink-features=AutomationControlled" - ) + webdriver_options.add_argument("--disable-blink-features=AutomationControlled") if not self.user_agent == "": webdriver_options.add_argument(f"--user-agent={self.user_agent}") @@ -298,7 +289,7 @@ class RAAspotter: data = data.replace('\033[0m', '') data = data.replace('\033[1m', '') f = open(self.output_file_path, 'a') - f.write(data+"\n") + f.write(data + "\n") f.close() def get_page(self, url, method, data={}): @@ -314,9 +305,7 @@ class RAAspotter: page = self.session.post(url, data=data) if page.status_code == 429: - logger.info( - 'Erreur 429 Too Many Requests reçue, temporisation...' - ) + logger.info('Erreur 429 Too Many Requests reçue, temporisation...') self.tor_get_new_id() time.sleep(55) return self.get_page(url, method, data) @@ -341,9 +330,7 @@ class RAAspotter: def download_file(self, raa): try: os.makedirs( - os.path.dirname( - f'{self.data_dir}{raa.get_sha256()}.pdf' - ), + os.path.dirname(f'{self.data_dir}{raa.get_sha256()}.pdf'), exist_ok=True ) file = self.get_page(raa.url, 'get') @@ -352,31 +339,20 @@ class RAAspotter: f.close() except (requests.exceptions.ConnectionError, requests.exceptions.ChunkedEncodingError): - logger.warning( - 'ATTENTION: la connexion a été interrompue pendant le ' - f'téléchargement de {raa.url}, nouvelle tentative...' - ) + logger.warning(f'ATTENTION: la connexion a été interrompue pendant le téléchargement de {raa.url}, nouvelle tentative...') self.download_file(raa) except Exception as exc: - logger.warning( - f'ATTENTION: Impossible de télécharger le fichier {raa.url}: ' - f'{exc}' - ) + logger.warning(f'ATTENTION: Impossible de télécharger le fichier {raa.url}: {exc}') def parse_pdf(self, raa, keywords): if not os.path.isfile(f'{self.data_dir}{raa.get_sha256()}.pdf'): - logger.warning( - f'ATTENTION: le fichier {raa.get_sha256()}.pdf n\'existe pas' - ) + logger.warning(f'ATTENTION: le fichier {raa.get_sha256()}.pdf n\'existe pas') else: text = "" try: text = extract_text(f'{self.data_dir}{raa.get_sha256()}.pdf') except Exception as exc: - logger.warning( - 'ATTENTION: Impossible d\'extraire le texte du fichier ' - f'{raa.get_sha256()}.pdf : {exc}' - ) + logger.warning(f'ATTENTION: Impossible d\'extraire le texte du fichier {raa.get_sha256()}.pdf : {exc}') found = False found_keywords = [] @@ -384,15 +360,11 @@ class RAAspotter: if re.search(keyword, text, re.IGNORECASE | re.MULTILINE): if not found: url = quote(raa.url, safe='/:') - self.print_output( - f'\033[92m{raa.name}\033[0m ({raa.date_str})' - ) + self.print_output(f'\033[92m{raa.name}\033[0m ({raa.date_str})') self.print_output(f'URL : {url}') found = True self.found = True - self.print_output( - f' Le terme \033[1m{keyword}\033[0m a été trouvé.' - ) + self.print_output(f' Le terme \033[1m{keyword}\033[0m a été trouvé.') found_keywords.append(keyword) # Écrit le texte du PDF dans un fichier texte pour une analyse @@ -428,34 +400,22 @@ class RAAspotter: output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) except subprocess.CalledProcessError as exc: if exc.returncode == 2 and retry_on_failure: - logger.warning( - 'ATTENTION : Le fichier n\'est pas un PDF correct, ' - 'nouvelle tentative de le télécharger' - ) + logger.warning('ATTENTION : Le fichier n\'est pas un PDF correct, nouvelle tentative de le télécharger') if self.tor_enabled: self.tor_get_new_id() self.download_file(raa) self.ocr(raa, False) elif (not exc.returncode == 6) and (not exc.returncode == 10): - logger.warning( - 'ATTENTION : Impossible d\'OCRiser le document', - exc.returncode, - exc.output - ) + logger.warning('ATTENTION : Impossible d\'OCRiser le document', exc.returncode, exc.output) def parse_raa(self, elements, keywords): for raa in elements: # Si le fichier n'a pas déjà été parsé et qu'il est postérieur à la # date maximale d'analyse, on le télécharge et on le parse if raa.date >= self.not_before and \ - not os.path.isfile( - f'{self.data_dir}{raa.get_sha256()}.txt' - ): + not os.path.isfile(f'{self.data_dir}{raa.get_sha256()}.txt'): url = quote(raa.url, safe='/:') - logger.info( - f'Nouveau fichier : {raa.name} ({raa.date_str}). URL : ' - f'{url}' - ) + logger.info(f'Nouveau fichier : {raa.name} ({raa.date_str}). URL : {url}') self.download_file(raa) self.ocr(raa, True) self.parse_pdf(raa, keywords) @@ -479,8 +439,7 @@ class RAAspotter: self.email_to = email_to self.email_object = email_object - if smtp_host and smtp_username and smtp_password and email_from and \ - email_to and email_object: + if smtp_host and smtp_username and smtp_password and email_from and email_to and email_object: self.smtp_configured = True def mailer(self): @@ -491,9 +450,7 @@ class RAAspotter: message['Subject'] = self.email_object message['From'] = self.email_from - message['Message-ID'] = email.utils.make_msgid( - domain=self.email_from.split('@')[-1] - ) + message['Message-ID'] = email.utils.make_msgid(domain=self.email_from.split('@')[-1]) message['Date'] = email.utils.formatdate() context = ssl.create_default_context() @@ -502,11 +459,7 @@ class RAAspotter: for address in self.email_to.split(','): del message['To'] message['To'] = address - smtp = smtplib.SMTP_SSL( - self.smtp_host, - port, - context=context - ) + smtp = smtplib.SMTP_SSL(self.smtp_host, port, context=context) if self.smtp_username: smtp.login(self.smtp_username, self.smtp_password) smtp.send_message(message) @@ -531,9 +484,7 @@ class RAAspotter: smtp.send_message(message) smtp.quit() except Exception as exc: - logger.warning( - f'Impossible d\'envoyer le courrier électronique : {exc}' - ) + logger.warning(f'Impossible d\'envoyer le courrier électronique : {exc}') # Fonction qui essaie de deviner la date d'un RAA à partir de son nom. # Utile pour limiter les requêtes lors de l'obtention des RAA à scanner. @@ -546,7 +497,5 @@ class RAAspotter: else: return guessed_date except Exception as exc: - logger.warning( - f'Impossible de deviner la date du terme {string} : {exc}' - ) + logger.warning(f'Impossible de deviner la date du terme {string} : {exc}') return datetime.datetime(9999, 1, 1) diff --git a/RAAspotter_ppparis.py b/RAAspotter_ppparis.py index d605eb3..326a1b8 100644 --- a/RAAspotter_ppparis.py +++ b/RAAspotter_ppparis.py @@ -12,8 +12,7 @@ class RAAspotter_ppparis(RAAspotter): __HOST = 'https://www.prefecturedepolice.interieur.gouv.fr' __RAA_PAGE = f'{__HOST}/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' @@ -40,20 +39,13 @@ class RAAspotter_ppparis(RAAspotter): for a in soup.find_all('a', href=True): if a['href'].endswith('.pdf'): if a['href'].startswith('/'): - url = 'https://www.prefecturedepolice.interieur.gouv.fr' \ - + a['href'] + url = 'https://www.prefecturedepolice.interieur.gouv.fr' + a['href'] else: url = a['href'] url = unquote(url) name = a.find('span').get_text() - date = datetime.datetime.strptime( - a.find( - 'div', - class_="field--type-datetime" - ).get_text().strip(), - '%d/%m/%Y' - ) + date = datetime.datetime.strptime(a.find('div', class_="field--type-datetime").get_text().strip(), '%d/%m/%Y') filename = url.split('/')[-1] raa = RAAspotter.RAA(url, date, name, filename) diff --git a/RAAspotter_pref04.py b/RAAspotter_pref04.py index f4953fe..f79fa5e 100644 --- a/RAAspotter_pref04.py +++ b/RAAspotter_pref04.py @@ -11,10 +11,8 @@ class RAAspotter_pref04(RAAspotter): # 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' + __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' full_name = 'Préfecture des Alpes-de-Haute-Provence' short_code = 'pref04' @@ -35,14 +33,8 @@ class RAAspotter_pref04(RAAspotter): self.__HOST, False ): - if RAAspotter.guess_date( - sub_page['name'], - '([0-9]{4}).*' - ).year >= self.not_before.year: - sub_page_content = self.get_page( - sub_page['url'], - 'get' - ).content + if RAAspotter.guess_date(sub_page['name'], '([0-9]{4}).*').year >= self.not_before.year: + sub_page_content = self.get_page(sub_page['url'], 'get').content raa_elements = self.get_raa_elements(sub_page_content) self.parse_raa(raa_elements, keywords.split(',')) @@ -63,13 +55,8 @@ class RAAspotter_pref04(RAAspotter): 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') + 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') filename = url.split('/')[-1] raa = RAAspotter.RAA(url, date, name, filename) diff --git a/RAAspotter_pref06.py b/RAAspotter_pref06.py index 8f8e272..75f2d4e 100644 --- a/RAAspotter_pref06.py +++ b/RAAspotter_pref06.py @@ -13,56 +13,37 @@ class RAAspotter_pref06(RAAspotter): __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' + 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' + 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' + 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' + 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' + 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' + 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' + __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' full_name = 'Préfecture des Alpes-Maritimes' short_code = 'pref06' @@ -121,14 +102,7 @@ class RAAspotter_pref06(RAAspotter): 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') + date = datetime.datetime.strptime(card.find('p', class_='fr-card__detail').get_text().replace('Publié le ', '').strip(), '%d/%m/%Y') filename = url.split('/')[-1] raa = RAAspotter.RAA(url, date, name, filename) diff --git a/RAAspotter_pref09.py b/RAAspotter_pref09.py index d70406f..51c9331 100644 --- a/RAAspotter_pref09.py +++ b/RAAspotter_pref09.py @@ -11,11 +11,8 @@ class RAAspotter_pref09(RAAspotter): # 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' + __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' full_name = 'Préfecture de l\'Ariège' short_code = 'pref09' @@ -34,21 +31,15 @@ class RAAspotter_pref09(RAAspotter): # 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', + '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 = 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']) @@ -66,9 +57,7 @@ class RAAspotter_pref09(RAAspotter): 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' - ): + 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']}" @@ -76,14 +65,8 @@ class RAAspotter_pref09(RAAspotter): 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' - ) + 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') filename = url.split('/')[-1] raa = RAAspotter.RAA(url, date, name, filename) diff --git a/RAAspotter_pref13.py b/RAAspotter_pref13.py index 48fab5c..e66d4a6 100644 --- a/RAAspotter_pref13.py +++ b/RAAspotter_pref13.py @@ -14,17 +14,12 @@ class RAAspotter_pref13(RAAspotter): __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' + 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' ] - __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 des Bouches-du-Rhône' short_code = 'pref13' @@ -49,8 +44,7 @@ class RAAspotter_pref13(RAAspotter): # 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 + # 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('/'): @@ -59,14 +53,8 @@ class RAAspotter_pref13(RAAspotter): 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' - ) + 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') filename = url.split('/')[-1] raa = RAAspotter.RAA(url, date, name, filename) diff --git a/RAAspotter_pref34.py b/RAAspotter_pref34.py index f52c531..06c1e1d 100644 --- a/RAAspotter_pref34.py +++ b/RAAspotter_pref34.py @@ -12,21 +12,14 @@ class RAAspotter_pref34(RAAspotter): # 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' + '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' + __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 l\'Hérault' short_code = 'pref34' @@ -74,14 +67,8 @@ class RAAspotter_pref34(RAAspotter): 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' - ) + 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') filename = url.split('/')[-1] raa = RAAspotter.RAA(url, date, name, filename) diff --git a/RAAspotter_pref35.py b/RAAspotter_pref35.py index 8e16411..b9542b6 100644 --- a/RAAspotter_pref35.py +++ b/RAAspotter_pref35.py @@ -12,26 +12,14 @@ class RAAspotter_pref35(RAAspotter): # 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' + 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' + __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 d\'Ille-et-Vilaine' short_code = 'pref35' @@ -66,14 +54,8 @@ class RAAspotter_pref35(RAAspotter): 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' - ) + 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') filename = url.split('/')[-1] raa = RAAspotter.RAA(url, date, name, filename) diff --git a/RAAspotter_pref38.py b/RAAspotter_pref38.py index 42a521a..58727dd 100644 --- a/RAAspotter_pref38.py +++ b/RAAspotter_pref38.py @@ -15,28 +15,14 @@ class RAAspotter_pref38(RAAspotter): # 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' + '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' + __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' full_name = 'Préfecture de l\'Isère' short_code = 'pref38' @@ -80,10 +66,7 @@ class RAAspotter_pref38(RAAspotter): for option in select_list.find_all('option'): if not option['value'] == "": # On estime la date à partir du nom de fichier - guessed_date = RAAspotter.guess_date( - option['title'], - '.* n°[ 0-9]* du ([0-9]*(?:er)? [a-zéû]* [0-9]*)' - ) + guessed_date = RAAspotter.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 @@ -99,9 +82,7 @@ class RAAspotter_pref38(RAAspotter): # 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] + 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 @@ -113,14 +94,8 @@ class RAAspotter_pref38(RAAspotter): 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' - ) + 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') filename = url.split('/')[-1] raa = RAAspotter.RAA(url, date, name, filename) diff --git a/RAAspotter_pref59.py b/RAAspotter_pref59.py index 7911488..ebbe460 100644 --- a/RAAspotter_pref59.py +++ b/RAAspotter_pref59.py @@ -16,21 +16,14 @@ class RAAspotter_pref59(RAAspotter): # 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' + '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' + __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' full_name = 'Préfecture du Nord' short_code = 'pref59' @@ -61,15 +54,12 @@ class RAAspotter_pref59(RAAspotter): 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", + '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 + sub_page_content = self.get_page(sub_page['url'], 'get').content sub_raa_elements = self.get_raa_elements(sub_page_content) self.parse_raa(sub_raa_elements, keywords.split(',')) self.mailer() @@ -88,14 +78,8 @@ class RAAspotter_pref59(RAAspotter): 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' - ) + 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') filename = url.split('/')[-1] raa = RAAspotter.RAA(url, date, name, filename) diff --git a/RAAspotter_pref62.py b/RAAspotter_pref62.py index c792ff9..75b909c 100644 --- a/RAAspotter_pref62.py +++ b/RAAspotter_pref62.py @@ -13,42 +13,30 @@ class RAAspotter_pref62(RAAspotter): __HOST = 'https://www.pas-de-calais.gouv.fr' __RAA_PAGE = { '2024': [ - f'{__HOST}/Publications/Recueil-des-actes-administratifs' - '/2024-Recueils-des-actes-administratifs' + 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' + 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' + 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' + 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' + 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' + 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' + __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' full_name = 'Préfecture du Pas-de-Calais' short_code = 'pref62' @@ -82,10 +70,7 @@ class RAAspotter_pref62(RAAspotter): pages_to_parse.append(page) for raa_page in pages_to_parse: - page_content = self.get_page( - raa_page, - 'get' - ).content + page_content = self.get_page(raa_page, 'get').content raa_elements = self.get_raa_elements(page_content) self.parse_raa(raa_elements, keywords.split(',')) self.mailer() @@ -96,9 +81,7 @@ class RAAspotter_pref62(RAAspotter): 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] + 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'): @@ -108,14 +91,8 @@ class RAAspotter_pref62(RAAspotter): 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' - ) + 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') filename = url.split('/')[-1] raa = RAAspotter.RAA(url, date, name, filename) diff --git a/RAAspotter_pref65.py b/RAAspotter_pref65.py index 2e5aaa7..880c8a9 100644 --- a/RAAspotter_pref65.py +++ b/RAAspotter_pref65.py @@ -12,21 +12,14 @@ class RAAspotter_pref65(RAAspotter): # Config __HOST = 'https://www.hautes-pyrenees.gouv.fr' __RAA_PAGE = { - '2024': f'{__HOST}/Publications/Recueil-d-actes-administratifs' - '/RAA-2024', - '2023': f'{__HOST}/Publications/Recueil-d-actes-administratifs' - '/RAA-2023', - '2022': f'{__HOST}/Publications/Recueil-d-actes-administratifs' - '/RAA-2022', - '2021': f'{__HOST}/Publications/Recueil-d-actes-administratifs' - '/RAA-2021', - '2020': f'{__HOST}/Publications/Recueil-d-actes-administratifs' - '/RAA-2020', - '2019': f'{__HOST}/Publications/Recueil-d-actes-administratifs' - '/RAA-2019' + '2024': f'{__HOST}/Publications/Recueil-d-actes-administratifs/RAA-2024', + '2023': f'{__HOST}/Publications/Recueil-d-actes-administratifs/RAA-2023', + '2022': f'{__HOST}/Publications/Recueil-d-actes-administratifs/RAA-2022', + '2021': f'{__HOST}/Publications/Recueil-d-actes-administratifs/RAA-2021', + '2020': f'{__HOST}/Publications/Recueil-d-actes-administratifs/RAA-2020', + '2019': f'{__HOST}/Publications/Recueil-d-actes-administratifs/RAA-2019' } - __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) ' \ - 'Gecko/20100101 Firefox/115.0' + __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' full_name = 'Préfecture des Hautes-Pyrénées' short_code = 'pref65' @@ -65,8 +58,7 @@ class RAAspotter_pref65(RAAspotter): # 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 + # 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('/'): @@ -75,14 +67,8 @@ class RAAspotter_pref65(RAAspotter): 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' - ) + 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') filename = url.split('/')[-1] raa = RAAspotter.RAA(url, date, name, filename) diff --git a/RAAspotter_pref69.py b/RAAspotter_pref69.py index f8c5b11..3c7c9bf 100644 --- a/RAAspotter_pref69.py +++ b/RAAspotter_pref69.py @@ -12,21 +12,14 @@ class RAAspotter_pref69(RAAspotter): # Config __HOST = 'https://www.rhone.gouv.fr' __RAA_PAGE = { - '2024': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-' - 'Rhone-RAA/Recueils-de-2024', - '2023': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-' - 'Rhone-RAA/Recueils-de-2023', - '2022': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-' - 'Rhone-RAA/Recueils-de-2022', - '2021': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-' - 'Rhone-RAA/Recueils-de-2021', - '2020': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-' - 'Rhone-RAA/Recueils-de-2020', - '2019': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-' - 'Rhone-RAA/Recueils-de-2019' + '2024': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-Rhone-RAA/Recueils-de-2024', + '2023': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-Rhone-RAA/Recueils-de-2023', + '2022': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-Rhone-RAA/Recueils-de-2022', + '2021': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-Rhone-RAA/Recueils-de-2021', + '2020': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-Rhone-RAA/Recueils-de-2020', + '2019': f'{__HOST}/Publications/Recueil-des-actes-administratifs-du-Rhone-RAA/Recueils-de-2019' } - __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) ' \ - 'Gecko/20100101 Firefox/115.0' + __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' full_name = 'Préfecture du Rhône' short_code = 'pref69' @@ -58,9 +51,8 @@ class RAAspotter_pref69(RAAspotter): for raa_page in pages_to_parse: sub_pages = self.get_sub_pages_with_pager( 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--next", + '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--next', None, self.__HOST)[::-1] for sub_page in sub_pages: @@ -68,10 +60,7 @@ class RAAspotter_pref69(RAAspotter): elements = [] for sub_page_to_parse in sub_pages_to_parse: - page_content = self.get_page( - sub_page_to_parse, - 'get' - ).content + page_content = self.get_page(sub_page_to_parse, 'get').content for element in self.get_raa_elements(page_content)[::-1]: elements.append(element) @@ -92,14 +81,8 @@ class RAAspotter_pref69(RAAspotter): 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' - ) + 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') filename = url.split('/')[-1] raa = RAAspotter.RAA(url, date, name, filename) diff --git a/RAAspotter_pref81.py b/RAAspotter_pref81.py index 41b7b11..ca4052b 100644 --- a/RAAspotter_pref81.py +++ b/RAAspotter_pref81.py @@ -12,23 +12,15 @@ class RAAspotter_pref81(RAAspotter): # Config __HOST = 'https://www.tarn.gouv.fr' __RAA_PAGE = { - 'default': f'{__HOST}/Publications/RAA-Recueil-des-Actes-' - 'Administratifs/RAA', - '2024': f'{__HOST}/Publications/RAA-Recueil-des-Actes-' - 'Administratifs/RAA/2024', - '2023': f'{__HOST}/Publications/RAA-Recueil-des-Actes-' - 'Administratifs/RAA/2023', - '2022': f'{__HOST}/Publications/RAA-Recueil-des-Actes-' - 'Administratifs/RAA/2022', - '2021': f'{__HOST}/Publications/RAA-Recueil-des-Actes-' - 'Administratifs/RAA/2021', - '2020': f'{__HOST}/Publications/RAA-Recueil-des-Actes-' - 'Administratifs/RAA/2020', - '2019': f'{__HOST}/Publications/RAA-Recueil-des-Actes-' - 'Administratifs/RAA/2019', + 'default': f'{__HOST}/Publications/RAA-Recueil-des-Actes-Administratifs/RAA', + '2024': f'{__HOST}/Publications/RAA-Recueil-des-Actes-Administratifs/RAA/2024', + '2023': f'{__HOST}/Publications/RAA-Recueil-des-Actes-Administratifs/RAA/2023', + '2022': f'{__HOST}/Publications/RAA-Recueil-des-Actes-Administratifs/RAA/2022', + '2021': f'{__HOST}/Publications/RAA-Recueil-des-Actes-Administratifs/RAA/2021', + '2020': f'{__HOST}/Publications/RAA-Recueil-des-Actes-Administratifs/RAA/2020', + '2019': f'{__HOST}/Publications/RAA-Recueil-des-Actes-Administratifs/RAA/2019', } - __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) ' \ - 'Gecko/20100101 Firefox/115.0' + __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' full_name = 'Préfecture du Tarn' short_code = 'pref81' @@ -62,9 +54,7 @@ class RAAspotter_pref81(RAAspotter): page_content = self.get_page(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', + '.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] @@ -77,10 +67,7 @@ class RAAspotter_pref81(RAAspotter): # Pour chaque mois, on cherche les pages des RAA for month_page in month_pages: year = RAAspotter.guess_date(month_page['name'], '(.*)').year - for page_to_parse in self.find_raa_card( - month_page['url'], - year - ): + for page_to_parse in self.find_raa_card(month_page['url'], year): sub_pages_to_parse.append(page_to_parse) # On ajoute aussi la page des mois à parser au cas où il y ait # eu une redirection vers un RAA @@ -98,21 +85,14 @@ class RAAspotter_pref81(RAAspotter): pages = [] card_pages = self.get_sub_pages_with_pager( 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', + '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] for card_page in card_pages: - # On filtre les pages de RAA ne correspondant pas à la période - # analysée - guessed_date = datetime.datetime.strptime( - card_page['details'].replace('Publié le ', '').strip(), - '%d/%m/%Y' - ) + # On filtre les pages de RAA ne correspondant pas à la période analysée + guessed_date = datetime.datetime.strptime(card_page['details'].replace('Publié le ', '').strip(), '%d/%m/%Y') if guessed_date >= self.not_before: pages.append(card_page['url']) return pages @@ -123,9 +103,7 @@ class RAAspotter_pref81(RAAspotter): 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' - ): + 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']}" @@ -133,14 +111,8 @@ class RAAspotter_pref81(RAAspotter): 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' - ) + 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') filename = url.split('/')[-1] raa = RAAspotter.RAA(url, date, name, filename) diff --git a/RAAspotter_pref83.py b/RAAspotter_pref83.py index 7e6d9cf..8e52369 100644 --- a/RAAspotter_pref83.py +++ b/RAAspotter_pref83.py @@ -12,21 +12,14 @@ class RAAspotter_pref83(RAAspotter): # Config __HOST = 'https://www.var.gouv.fr' __RAA_PAGE = { - '2024': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs' - '/Recueil-des-actes-administratifs-2024', - '2023': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs' - '/Recueil-des-actes-administratifs-2023', - '2022': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs' - '/Recueil-des-actes-administratifs-2022', - '2021': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs' - '/Recueil-des-actes-administratifs-2021', - '2020': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs' - '/Recueil-des-actes-administratifs-2020', - '2019': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs' - '/Recueil-des-actes-administratifs-2019' + '2024': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs/Recueil-des-actes-administratifs-2024', + '2023': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs/Recueil-des-actes-administratifs-2023', + '2022': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs/Recueil-des-actes-administratifs-2022', + '2021': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs/Recueil-des-actes-administratifs-2021', + '2020': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs/Recueil-des-actes-administratifs-2020', + '2019': f'{__HOST}/Publications/RAA-Recueil-des-actes-administratifs/Recueil-des-actes-administratifs-2019' } - __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) ' \ - 'Gecko/20100101 Firefox/115.0' + __USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' full_name = 'Préfecture du Var' short_code = 'pref83' @@ -61,9 +54,7 @@ class RAAspotter_pref83(RAAspotter): page_content = self.get_page(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', + '.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] @@ -73,7 +64,7 @@ class RAAspotter_pref83(RAAspotter): # On parse les pages contenant des RAA elements = self.get_raa_with_pager( sub_pages_to_parse[::-1], - ".fr-pagination__link.fr-pagination__link--next", + '.fr-pagination__link.fr-pagination__link--next', self.__HOST ) self.parse_raa(elements, keywords.split(',')) @@ -86,10 +77,7 @@ class RAAspotter_pref83(RAAspotter): soup = BeautifulSoup(page_content, 'html.parser') # On récupère chaque section contenant un RAA - cards = soup.select( - 'div.fr-card__body div.fr-card__content ' - 'h2.fr-card__title a.fr-card__link.menu-item-link' - ) + cards = soup.select('div.fr-card__body div.fr-card__content h2.fr-card__title a.fr-card__link.menu-item-link') for a in cards: if a.get('href') and a['href'].endswith('.pdf'): if a['href'].startswith('/'): @@ -99,10 +87,7 @@ class RAAspotter_pref83(RAAspotter): url = unquote(url) name = a.get_text().strip() - date = datetime.datetime.strptime( - a['title'].split(' - ')[-1].strip(), - '%d/%m/%Y' - ) + date = datetime.datetime.strptime(a['title'].split(' - ')[-1].strip(), '%d/%m/%Y') filename = url.split('/')[-1] raa = RAAspotter.RAA(url, date, name, filename) diff --git a/RAAspotter_pref976.py b/RAAspotter_pref976.py index 4ba5a56..ec78c39 100644 --- a/RAAspotter_pref976.py +++ b/RAAspotter_pref976.py @@ -12,23 +12,15 @@ class RAAspotter_pref976(RAAspotter): # Config __HOST = 'https://www.mayotte.gouv.fr' __RAA_PAGE = { - 'default': f'{__HOST}/Publications/Recueil-des-actes-administratifs-' - 'R.A.A', - '2024': f'{__HOST}/Publications/Recueil-des-actes-administratifs-R.A.A' - '/RAA-2024', - '2023': f'{__HOST}/Publications/Recueil-des-actes-administratifs-R.A.A' - '/RAA-2023', - '2022': f'{__HOST}/Publications/Recueil-des-actes-administratifs-R.A.A' - '/RAA-2022', - '2021': f'{__HOST}/Publications/Recueil-des-actes-administratifs-R.A.A' - '/RAA-2021', - '2020': f'{__HOST}/Publications/Recueil-des-actes-administratifs-R.A.A' - '/RAA-2020', - '2019': f'{__HOST}/Publications/Recueil-des-actes-administratifs-R.A.A' - '/RAA-2019' + 'default': f'{__HOST}/Publications/Recueil-des-actes-administratifs-R.A.A', + '2024': f'{__HOST}/Publications/Recueil-des-actes-administratifs-R.A.A/RAA-2024', + '2023': f'{__HOST}/Publications/Recueil-des-actes-administratifs-R.A.A/RAA-2023', + '2022': f'{__HOST}/Publications/Recueil-des-actes-administratifs-R.A.A/RAA-2022', + '2021': f'{__HOST}/Publications/Recueil-des-actes-administratifs-R.A.A/RAA-2021', + '2020': f'{__HOST}/Publications/Recueil-des-actes-administratifs-R.A.A/RAA-2020', + '2019': f'{__HOST}/Publications/Recueil-des-actes-administratifs-R.A.A/RAA-2019' } - __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 Mayotte' short_code = 'pref976' @@ -62,9 +54,7 @@ class RAAspotter_pref976(RAAspotter): page_content = self.get_page(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', + '.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] @@ -94,20 +84,15 @@ class RAAspotter_pref976(RAAspotter): pages = [] card_pages = self.get_sub_pages_with_pager( 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 h2.fr-card__title a.fr-card__link', + 'ul.fr-pagination__list li a.fr-pagination__link.fr-pagination__link--next', None, self.__HOST )[::-1] for card_page in card_pages: # On filtre les pages de RAA ne correspondant pas à la période # analysée - guessed_date = RAAspotter.guess_date( - card_page['name'], - 'n°[ 0-9]* du ([0-9]*(?:er)? [a-zéû]* [0-9]*)' - ) + guessed_date = RAAspotter.guess_date(card_page['name'], 'n°[ 0-9]* du ([0-9]*(?:er)? [a-zéû]* [0-9]*)') if year: guessed_date = guessed_date.replace(year=year) if guessed_date >= self.not_before: @@ -128,14 +113,8 @@ class RAAspotter_pref976(RAAspotter): 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' - ) + 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') filename = url.split('/')[-1] raa = RAAspotter.RAA(url, date, name, filename) diff --git a/cli.py b/cli.py index abded22..51bff78 100755 --- a/cli.py +++ b/cli.py @@ -9,7 +9,7 @@ from RAAspotter import RAAspotter # Config __KEYWORDS = os.getenv('KEYWORDS') or \ 'vidéoprotection,caméras,captation,aéronef' -__DATA_DIR_ROOT = os.path.dirname(os.path.abspath(__file__))+'/data/' +__DATA_DIR_ROOT = os.path.dirname(os.path.abspath(__file__)) + '/data/' __SMTP_HOSTNAME = os.getenv('SMTP_HOSTNAME') or 'localhost' __SMTP_USERNAME = os.getenv('SMTP_USERNAME') or '' __SMTP_PASSWORD = os.getenv('SMTP_PASSWORD') or '' @@ -58,8 +58,7 @@ available_prefs = [ # Début du script parser = argparse.ArgumentParser( prog='cli.py', - description='Télécharge les RAA d\'une préfecture donnée et recherche des ' - 'mots-clés' + description='Télécharge les RAA d\'une préfecture donnée et recherche des mots-clés' ) parser.add_argument( '-p', @@ -73,14 +72,12 @@ parser.add_argument( '-k', '--keywords', action='store', - help='liste des termes recherchés, séparés par une virgule (par défaut : ' - 'vidéoprotection,caméras,captation,aéronef)' + help='liste des termes recherchés, séparés par une virgule (par défaut : vidéoprotection,caméras,captation,aéronef)' ) parser.add_argument( '--not-before', action='store', - help='n\'analyse pas les RAA datant d\'avant la date indiquée, au format ' - 'YYYY-MM-DD (par défaut : 2024-01-01)' + help='n\'analyse pas les RAA datant d\'avant la date indiquée, au format YYYY-MM-DD (par défaut : 2024-01-01)' ) parser.add_argument( '--smtp-hostname', @@ -122,18 +119,14 @@ parser.add_argument( '-t', '--email-to', action='store', - help='adresses de courrier électronique destinataires des notifications ' - '(séparées par une virgule)' + help='adresses de courrier électronique destinataires des notifications (séparées par une virgule)' ) for pref in available_prefs: parser.add_argument( f'--{pref}-email-to', action='store', - help=f'adresses de courrier électronique destinataires des ' - 'notifications (séparées par une virgule) uniquement si ' - 'l\'analyse concerne {pref} (s\'ajoute à celles précisées dans ' - '--email-to)' + help=f'adresses de courrier électronique destinataires des notifications (séparées par une virgule) uniquement si l\'analyse concerne {pref} (s\'ajoute à celles précisées dans --email-to)' ) parser.add_argument( @@ -144,8 +137,7 @@ parser.add_argument( parser.add_argument( '--mastodon-instance', action='store', - help='URL de l\'instance (doit inclure "http://" ou "https://" ; par ' - 'défaut : vide)' + help='URL de l\'instance (doit inclure "http://" ou "https://" ; par défaut : vide)' ) parser.add_argument( '-v', @@ -224,12 +216,8 @@ module = importlib.import_module(f'RAAspotter_{args.pref}') raa_spotter = getattr(module, f'RAAspotter_{args.pref}')(__DATA_DIR) raa_spotter.not_before = __NOT_BEFORE -raa_spotter.configure_mailer(__SMTP_HOSTNAME, __SMTP_USERNAME, __SMTP_PASSWORD, - __SMTP_PORT, __SMTP_STARTTLS, __SMTP_SSL, - __EMAIL_FROM, __EMAIL_TO, - f'[RAAspotter] [{raa_spotter.full_name}] ' - 'Nouveaux éléments trouvés') +raa_spotter.configure_mailer(__SMTP_HOSTNAME, __SMTP_USERNAME, __SMTP_PASSWORD, __SMTP_PORT, __SMTP_STARTTLS, __SMTP_SSL, + __EMAIL_FROM, __EMAIL_TO, f'[RAAspotter] [{raa_spotter.full_name}] Nouveaux éléments trouvés') raa_spotter.configure_mastodon(__MASTODON_ACCESS_TOKEN, __MASTODON_INSTANCE, - f'[{raa_spotter.full_name}]', - f'#{raa_spotter.short_code}') + f'[{raa_spotter.full_name}]', f'#{raa_spotter.short_code}') raa_spotter.get_raa(__KEYWORDS) -- GitLab