Web scrapping avec Python et BS4.

Web scrapping avec Python et BS4.

Date de publication : 20/08/2024

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.

Vos commentaires
Aucun commentaire