Skip to content
Extraits de code Groupes Projets
Valider 08897538 rédigé par maettellite's avatar maettellite Validation de Bastien Le Querrec
Parcourir les fichiers

pref01: ajout de la préfecture de l'Ain


Closes !29

Co-authored-by: default avatarMättu <mtths.mndr@gmail.com>
Co-authored-by: default avatarBastien Le Querrec <blq@laquadrature.net>
parent 496fe765
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -99,6 +99,11 @@ test_ppparis:
PREF: "ppparis"
extends: .default_pref
test_pref01:
variables:
PREF: "pref01"
extends: .default_pref
test_pref2b:
variables:
PREF: "pref2b"
......
import os
import re
import datetime
from bs4 import BeautifulSoup
from urllib.parse import unquote
from Attrap import Attrap
class Attrap_pref01(Attrap):
# Config
hostname = 'https://www.ain.gouv.fr'
raa_page = f'{hostname}/Publications/Recueil-des-actes-administratifs-RAA'
user_agent = 'Mozilla/5.0 (Windows NT 10.0; rv:109.0) Gecko/20100101 Firefox/115.0'
full_name = 'Ain'
short_code = 'pref01'
timezone = 'Europe/Paris'
def __init__(self, data_dir):
super().__init__(data_dir, self.user_agent)
self.set_sleep_time(30)
# La préfecture de l'Ain classe mal ses RAA : certains mois sont listés sur la page principale, certains arrêtés ont leur propre page sans être
# dans un RAA, et certains RAA ne sont pas classés dans une sous-page. Donc pour chaque page, on cherche les sous-pages d'années, puis les
# sous-pages de mois ou d'arrêtés perdues, puis les RAA aussi...
# La première page à parser est la page racine des RAA, qui contiendra des cartes d'années, des cartes de sous-pages de mois ou d'éléments mal
# catégorisés, et peut-être même des RAA
self.page_urls_to_parse = [self.raa_page]
self.elements = []
def get_raa(self, keywords):
while not self.page_urls_to_parse == []:
page_url = self.page_urls_to_parse[-1]
page_content = self.get_page(page_url, 'get').content # On récupère le HTML de la page
self.get_year_pages(page_content) # On cherche les cartes d'années
self.get_elements_pages(page_url) # On cherche les cartes d'éléments
for element in self.get_raa_elements(page_content): # On cherche les éléments
self.elements.append(element)
self.page_urls_to_parse.remove(page_url) # On supprime la page de la liste de celles à parser
self.parse_raa(self.elements[::-1], keywords)
self.mailer()
def get_year_pages(self, page_content):
for card in self.get_sub_pages(
page_content,
'div.fr-card.fr-card--sm.fr-card--grey.fr-enlarge-link div.fr-card__body div.fr-card__content h2.fr-card__title a', # Pages d'années
self.hostname,
False
):
date = Attrap.guess_date(card['name'].strip(), '(?:Recueil|Recueils) (?:des actes administratifs)(?:[ -])*([0-9]{4})').replace(day=1, month=1)
if date.year >= self.not_before.year:
self.page_urls_to_parse.append(card['url'])
def get_elements_pages(self, page_url):
print(page_url)
for card in self.get_sub_pages_with_pager(
page_url,
'div.fr-card.fr-card--horizontal.fr-card--sm.fr-enlarge-link div.fr-card__body div.fr-card__content h2.fr-card__title a.fr-card__link', # Carte avec un élément (mois ou arrêté seul)
'ul.fr-pagination__list li a.fr-pagination__link.fr-pagination__link--next.fr-pagination__link--lg-label', # Pager
'div.fr-card.fr-card--horizontal.fr-card--sm.fr-enlarge-link div.fr-card__body div.fr-card__content div.fr-card__end p.fr-card__detail', # Détails (avec la date de publication)
self.hostname
):
date = datetime.datetime.strptime(card['details'].replace('Publié le ', '').strip(), '%d/%m/%Y')
if date >= self.not_before:
self.page_urls_to_parse.append(card['url'])
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,div a.fr-link.fr-link--download'):
if a.get('href') and a['href'].endswith('.pdf'):
if a['href'].startswith('/'):
url = f"{self.hostname}{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, timezone=self.timezone)
elements.append(raa)
return elements
make: ppparis pref2b pref03 pref04 pref05 pref06 pref09 pref10 pref13 pref25 pref31 pref33 pref34 pref35 pref38 pref39 pref42 pref44 pref59 pref62 pref63 pref64 pref65 pref66 pref69 pref73 pref75 pref80 pref81 pref83 pref87 pref91 pref92 pref93 pref94 pref976 prefidf prefpaca
make: ppparis pref01 pref2b pref03 pref04 pref05 pref06 pref09 pref10 pref13 pref25 pref31 pref33 pref34 pref35 pref38 pref39 pref42 pref44 pref59 pref62 pref63 pref64 pref65 pref66 pref69 pref73 pref75 pref80 pref81 pref83 pref87 pref91 pref92 pref93 pref94 pref976 prefidf prefpaca
ppparis:
bin/python3 cli.py ppparis
pref01:
bin/python3 cli.py pref01
pref2b:
bin/python3 cli.py pref2b
pref03:
......
......@@ -57,6 +57,7 @@ Vous pouvez également activer le safe mode en spécifiant la variable d'environ
## Administrations supportées
- Préfecture de police de Paris (identifiant : `ppparis`)
- Préfecture de l'Ain (identifiant : `pref01`)
- Préfecture de Haute-Corse (identifiant : `pref2b`)
- Préfecture de l'Allier (identifiant : `pref03`)
- Préfecture des Alpes-de-Haute-Provence (identifiant : `pref04`)
......
......@@ -45,6 +45,7 @@ __MASTODON_INSTANCE = os.getenv('MASTODON_INSTANCE')
# Liste des administrations supportées
available_administrations = [
'ppparis',
'pref01',
'pref2b',
'pref03',
'pref04',
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter