87 lines
3.3 KiB
Python
87 lines
3.3 KiB
Python
import os
|
|
import requests
|
|
from bs4 import BeautifulSoup
|
|
from urllib.parse import urljoin
|
|
|
|
def telecharger_images(url, dossier_sortie="images"):
|
|
# Créer le dossier de sortie s'il n'existe pas
|
|
if not os.path.exists(dossier_sortie):
|
|
os.makedirs(dossier_sortie)
|
|
|
|
# Récupérer le contenu de la page web
|
|
reponse = requests.get(url)
|
|
if reponse.status_code != 200:
|
|
print(f"Erreur : Impossible de récupérer la page {url}")
|
|
return
|
|
|
|
# Analyser le contenu HTML
|
|
soup = BeautifulSoup(reponse.content, 'html.parser')
|
|
images = soup.find_all('img')
|
|
|
|
# Télécharger chaque image
|
|
for i, image in enumerate(images):
|
|
src = image.get('src')
|
|
if not src:
|
|
continue
|
|
|
|
# Construire l'URL absolue de l'image
|
|
url_image = urljoin(url, src)
|
|
|
|
try:
|
|
# Télécharger l'image
|
|
reponse_image = requests.get(url_image, stream=True)
|
|
if reponse_image.status_code == 200:
|
|
# Deviner le nom de fichier
|
|
nom_base = None
|
|
extension = ".jpg"
|
|
|
|
# 1. Essayer d'extraire le nom depuis l'URL
|
|
chemin_url = src.split('?')[0] # Retirer les paramètres de requête
|
|
nom_url = os.path.basename(chemin_url)
|
|
if nom_url and '.' in nom_url:
|
|
nom_base, extension = os.path.splitext(nom_url)
|
|
|
|
# 2. Essayer l'attribut alt
|
|
if not nom_base or nom_base.startswith('image_'):
|
|
alt = image.get('alt', '').strip()
|
|
if alt:
|
|
# Nettoyer le texte alt pour en faire un nom de fichier valide
|
|
nom_base = "".join(c for c in alt if c.isalnum() or c in (' ', '-', '_')).strip()
|
|
nom_base = nom_base.replace(' ', '_')
|
|
|
|
# 3. Essayer l'attribut title
|
|
if not nom_base or nom_base.startswith('image_'):
|
|
title = image.get('title', '').strip()
|
|
if title:
|
|
nom_base = "".join(c for c in title if c.isalnum() or c in (' ', '-', '_')).strip()
|
|
nom_base = nom_base.replace(' ', '_')
|
|
|
|
# 4. Fallback sur un nom générique
|
|
if not nom_base:
|
|
nom_base = f"image_{i}"
|
|
|
|
# Limiter la longueur du nom
|
|
nom_base = nom_base[:100]
|
|
nom_fichier = os.path.join(dossier_sortie, f"{nom_base}{extension}")
|
|
|
|
# Gérer les doublons
|
|
compteur = 1
|
|
nom_fichier_original = nom_fichier
|
|
while os.path.exists(nom_fichier):
|
|
nom_fichier = os.path.join(dossier_sortie, f"{nom_base}_{compteur}{extension}")
|
|
compteur += 1
|
|
|
|
# Sauvegarder l'image
|
|
with open(nom_fichier, 'wb') as fichier:
|
|
for chunk in reponse_image.iter_content(1024):
|
|
fichier.write(chunk)
|
|
print(f"Image téléchargée : {nom_fichier}")
|
|
else:
|
|
print(f"Erreur : Impossible de télécharger {url_image}")
|
|
except Exception as e:
|
|
print(f"Erreur lors du téléchargement de {url_image} : {e}")
|
|
|
|
# Exemple d'utilisation
|
|
url = "https://www.7tarot.fr/carte/arcanes-mineurs.htm"
|
|
telecharger_images(url)
|