Web scrapping avec Python et BS4.
Lorsque je travaille sur un site, il m'arrive souvent de devoir récupérer du contenu web. Pour cela, j'aime utiliser Python, car il permet de créer rapidement des fonctionnalités puissantes.
Dans cet article, j'expose la création d'un script pour récupérer une page web, explorer son DOM à la recherche de fichiers PDF, et les télécharger automatiquement.
C'est parti !
La création du script
Chargement des dépendances
Première nous avons d'importer nos dépendances : requests
pour les requêtes HTTP, BeautifulSoup
pour le scrap de pages web, et éventuellement slugify
pour normaliser des chaines de caractères mais ce dernier n'est pas pré-requis.
import requests
from bs4 import BeautifulSoup
from slugify import slugify
Création de la logique
Le script est assez concis,
URL de la page à analyser
domain = 'https://www.monsite.com'
queryString = "/unepage"
url = f"{domain}{queryString}" #création d'un f-string pour concaténer domaine + query string
Envoyer une requête GET à la page
try:
response = requests.get(url)
response.raise_for_status() # Vérifie que la requête s'est bien passée sinon on lève une exception
except requests.RequestException as e:
print(f"Erreur lors de la requête : {e}")
exit(1)
Analyser le contenu de la page
C'est grâce à cette libraire que nous allons parser le document retourné par requests
.
BeautifulSoup
prend en argument un contenu, response.content
et un parser, ici html.parser
, qui est spécialisé dans l'analyse de document html.
soup = BeautifulSoup(response.content, 'html.parser')
Trouver tous les éléments contenant des liens vers des fichiers PDF
lien_documents = soup.find_all('a')
if not lien_documents:
print("Aucun lien trouvé sur la page.")
exit(1)
Créer un répertoire pour les fichiers PDF si nécessaire
os.makedirs('pdfs', exist_ok=True)
Compter les fichiers PDF téléchargés et créer un fichier de rapport
count = 0 # j'utilise un compteur pour numéroter les pdf trouvés
rapport = []
for link in lien_documents:
if link.has_attr('href') and link['href'].endswith('.pdf'):
try:
# Téléchargement du fichier
pdfUrl = f"{domain}/{link['href']}"
responseDl = requests.get(pdfUrl)
responseDl.raise_for_status() # Vérifie que le téléchargement s'est bien passé
# Créer un nom de fichier propre
linkTitle = link.text.strip() or f"document_{count+1}"
linkSlug = slugify(linkTitle)
filename = f"pdfs/{count + 1}-{linkSlug}.pdf"
# Sauvegarder le contenu du fichier PDF
with open(filename, 'wb') as f:
f.write(responseDl.content)
# Ajouter au rapport
rapport.append({'Titre': linkTitle, 'URL': pdf_url, 'Nom de fichier': filename})
count += 1
except requests.RequestException as e:
print(f"Erreur lors du téléchargement du fichier PDF {link.get('href')}: {e}")
if count == 0:
print("Aucun fichier PDF trouvé.")
exit(1)
Écrire le rapport dans un fichier texte (cela peut être aussi un csv)
with open('pdfs/rapport_telechargement.txt', 'w', encoding='utf-8') as rapport_file:
for item in rapport:
rapport_file.write(f"Titre: {item['Titre']}\nURL: {item['URL']}\nNom de fichier: {item['Nom de fichier']}\n\n")
C'est tout !
Ce script présente de manière succincte la librairie BeautifulSoup
, sa capacité à permettre le scrapping en très peu de ligne en fait un tool très puissant et très rapide à mettre en place. J'espère que cela vous donnera des idées pour créer vos propres scripts.