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

utilise requests pour télécharger les PDF, attend l'affichage du contenu au lieu d'un sleep

Les PDF sont téléchargés à partir de la session obtenue par le
navigateur. Cela permet de pouvoir éteindre le navigateur une fois la
session obtenue, et d'aller plus vite (car avec moins de ressources)
dans le téléchargement des documents.
parent 53d89109
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -6,8 +6,13 @@ from bs4 import BeautifulSoup ...@@ -6,8 +6,13 @@ from bs4 import BeautifulSoup
import argparse import argparse
from urllib.parse import unquote from urllib.parse import unquote
import logging import logging
import requests
from selenium import webdriver from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
from pyvirtualdisplay import Display from pyvirtualdisplay import Display
from pdfminer.high_level import extract_text from pdfminer.high_level import extract_text
...@@ -16,7 +21,6 @@ from pdfminer.high_level import extract_text ...@@ -16,7 +21,6 @@ from pdfminer.high_level import extract_text
__RAA_PAGE = 'https://www.prefecturedepolice.interieur.gouv.fr/actualites-et-presse/arretes/accueil-arretes' __RAA_PAGE = 'https://www.prefecturedepolice.interieur.gouv.fr/actualites-et-presse/arretes/accueil-arretes'
__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'
__headless_mode = True __headless_mode = True
__WAITING_TIME = int(os.getenv('WAITING_TIME') or 5)
__LIST = os.getenv('LIST') or 'vidéoprotection,caméras,captation,aéronef' __LIST = os.getenv('LIST') or 'vidéoprotection,caméras,captation,aéronef'
__DATA_DIR = os.path.dirname(os.path.abspath(__file__))+'/data/ppparis/' __DATA_DIR = os.path.dirname(os.path.abspath(__file__))+'/data/ppparis/'
...@@ -30,16 +34,24 @@ def print_output(data): ...@@ -30,16 +34,24 @@ def print_output(data):
f.write(data+"\n") f.write(data+"\n")
f.close() f.close()
# On charge l'URL avec la liste des fichiers
def get_html(url): def get_html(url):
browser.get(url) browser.get(url)
time.sleep(int(__WAITING_TIME*10))
page_content = browser.page_source
return page_content # On attend que le navigateur ait passé les tests anti-robots et que le contenu s'affiche
element = WebDriverWait(browser, 120).until(expected_conditions.presence_of_element_located((By.ID, "block-decree-list-block")))
def download_file(url): return browser.page_source
browser.get(url)
time.sleep(__WAITING_TIME) def download_file(url, dest):
try:
os.makedirs(os.path.dirname(dest), exist_ok=True)
file = session.get(url)
f = open(dest,'wb')
f.write(file.content);
f.close()
except Exception as exc:
logging.warning(f'ATTENTION: Impossible de télécharger le fichier {url}: {exc}')
def parse_pdf(filename, name, date): def parse_pdf(filename, name, date):
if not os.path.isfile(__DATA_DIR+filename): if not os.path.isfile(__DATA_DIR+filename):
...@@ -64,7 +76,6 @@ def parse_pdf(filename, name, date): ...@@ -64,7 +76,6 @@ def parse_pdf(filename, name, date):
# Début du script # Début du script
parser = argparse.ArgumentParser(prog='ppparis.py', description='Télécharge les RAA de la Préfecture de police de Paris et recherche des mots-clés') parser = argparse.ArgumentParser(prog='ppparis.py', description='Télécharge les RAA de la Préfecture de police de Paris et recherche des mots-clés')
parser.add_argument('-n', '--noheadless', action='store_true', help='ne lance pas le navigateur en mode headless (pratique pour débugguer ou en dehors d\'une CI)') parser.add_argument('-n', '--noheadless', action='store_true', help='ne lance pas le navigateur en mode headless (pratique pour débugguer ou en dehors d\'une CI)')
parser.add_argument('-w', '--waiting-time', type=int, action='store', help='délai (en secondes) d\'attente de chargement d\'une page, la durée du premier chargement étant cette valeur multipliée par 10 (par défaut : 5)')
parser.add_argument('-l', '--list', action='store', 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('-l', '--list', action='store', 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('-v', action='store_true', help='relève le niveau de verbosité à INFO') parser.add_argument('-v', action='store_true', help='relève le niveau de verbosité à INFO')
parser.add_argument('-vv', action='store_true', help='relève le niveau de verbosité à DEBUG') parser.add_argument('-vv', action='store_true', help='relève le niveau de verbosité à DEBUG')
...@@ -82,11 +93,6 @@ if args.noheadless: ...@@ -82,11 +93,6 @@ if args.noheadless:
if not __headless_mode: if not __headless_mode:
logging.debug('Mode noheadless') logging.debug('Mode noheadless')
if args.waiting_time:
__WAITING_TIME = args.waiting_time
logging.debug(f'WAITING_TIME: {__WAITING_TIME}')
if args.list: if args.list:
__LIST = args.list __LIST = args.list
...@@ -123,6 +129,17 @@ browser = webdriver.Chrome(options=webdriver_options) ...@@ -123,6 +129,17 @@ browser = webdriver.Chrome(options=webdriver_options)
# Téléchargement des RAA # Téléchargement des RAA
page_content = get_html(__RAA_PAGE) page_content = get_html(__RAA_PAGE)
# On récupère les cookies du navigateur pour les réutiliser lors du téléchargement des PDF
session = requests.Session()
for cookie in browser.get_cookies():
session.cookies.set(cookie['name'], cookie['value'])
session.headers.update({'User-Agent': __USER_AGENT})
# On arrête le navigateur
browser.quit()
if __headless_mode:
display.stop()
# On charge le parser # On charge le parser
soup = BeautifulSoup(page_content, 'html.parser') soup = BeautifulSoup(page_content, 'html.parser')
...@@ -142,11 +159,7 @@ for a in soup.find_all('a', href=True): ...@@ -142,11 +159,7 @@ for a in soup.find_all('a', href=True):
# Si le fichier n'a pas été téléchargé, on le télécharge et on le parse # Si le fichier n'a pas été téléchargé, on le télécharge et on le parse
if not os.path.isfile(__DATA_DIR+filename): if not os.path.isfile(__DATA_DIR+filename):
logging.info(f'Nouveau fichier : {name} ({date}). URL : {url}') logging.info(f'Nouveau fichier : {name} ({date}). URL : {url}')
try: download_file(url, __DATA_DIR+filename)
download_file(url)
except Exception:
logging.warning('ATTENTION: Impossible de télécharger le fichier '+url)
cmd = ['ocrmypdf', '-l', 'eng+fra', '--output-type', 'pdfa', '--redo-ocr', __DATA_DIR+filename, __DATA_DIR+filename] cmd = ['ocrmypdf', '-l', 'eng+fra', '--output-type', 'pdfa', '--redo-ocr', __DATA_DIR+filename, __DATA_DIR+filename]
logging.debug(f'Lancement de ocrmypdf: {cmd}') logging.debug(f'Lancement de ocrmypdf: {cmd}')
...@@ -157,8 +170,3 @@ for a in soup.find_all('a', href=True): ...@@ -157,8 +170,3 @@ for a in soup.find_all('a', href=True):
logging.warning('ATTENTION : Impossible d\'OCRiser le document', exc.returncode, exc.output) logging.warning('ATTENTION : Impossible d\'OCRiser le document', exc.returncode, exc.output)
parse_pdf(filename, name, date) parse_pdf(filename, name, date)
# On arrête le navigateur
browser.quit()
if __headless_mode:
display.stop()
...@@ -2,3 +2,4 @@ beautifulsoup4 ...@@ -2,3 +2,4 @@ beautifulsoup4
selenium selenium
pyvirtualdisplay pyvirtualdisplay
pdfminer.six pdfminer.six
requests
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