Je voulais récupérer toutes les images de ce site web : https://example.com/.

Pour ce faire j’ai du analysé l’architecture du site en entier.

J’ai trouvé qu’on pouvait sélectionner certaines régions ce qui me convenait bien !

J’ai fait une liste de toutes les régions en copiant-collant le code html et en scrappant uniquement les liens href.

https://example.com/collections/affiches-auvergne-rhone-alpes
https://example.com/collections/affiches-de-bretagne
https://example.com/collections/affiches-de-paca
https://example.com/collections/affiches-des-hauts-de-france
https://example.com/collections/affiches-occitanie
https://example.com/collections/affiches-de-normandie
https://example.com/collections/affiches-de-nouvelle-aquitaine
https://example.com/collections/affiches-grand-est
https://example.com/collections/affiches-de-bourgogne-franche-comte
https://example.com/collections/affiches-pays-de-la-loire

Chaque région a environ 3 pages différentes, donc j’ai ajouté le sélecteur ?page= :

...
    "https://example.com/collections/affiches-pays-de-la-loire",
...
    "https://example.com/collections/affiches-pays-de-la-loire?page=2"
...
    "https://example.com/collections/affiches-pays-de-la-loire?page=3"

Ensuite j’ai mis toutes ces URLs dans le fichier de scrapping que m’a fourni une IA :

import requests
from bs4 import BeautifulSoup

# List of pages to scrape
urls = [
    <URLs here>
]

all_links = []

for url in urls:
    print(f"Scraping: {url}")
    response = requests.get(url)
    
    # Check if request succeeded
    if response.status_code != 200:
        print(f"Failed to load {url}")
        continue
    
    soup = BeautifulSoup(response.text, "html.parser")
    
    # Find the div with the specific ID
    product_grid = soup.find("div", id="CollectionProductGrid")
    
    if not product_grid:
        print(f"No 'CollectionProductGrid' found on {url}")
        continue
    
    # Extract all <a> tags inside the div
    links = product_grid.find_all("a", href=True)
    
    for link in links:
        href = link["href"]
        # You can make this absolute if needed
        if href.startswith("/"):
            from urllib.parse import urljoin
            href = urljoin(url, href)
        all_links.append(href)

# Display results
print("\nCollected links:")
for link in all_links:
    print(link)

Ce programme va trouver tous les liens d’images sur chacune des pages données. Les quelques premiers liens ressemblent à ça :

https://example.com/files/image1.jpg?v=1729157116&width=480

https://example.com/files/image2.jpg?v=1726953900&width=480

https://example.com/files/image3.jpg?v=1729157109&width=480

Ce qui est très bien ! Il y a quelques paramètres dans l’URL comme vous pouvez voir, ça pourrait poser des problèmes mais on s’en occupera plus tard. Cependant, j’ai trouvé qu’on pouvait télécharger une photo en meilleure qualité si on spécifiait width=2048 car ça envoie l’image dans la taille la plus grande possible. Donc je vais juste remplacer width=[0-9]{3,4} avec width=2048.

cat unique_urls.txt | sed -E 's/width=[0-9]+/width=2048/g' > link-adjusted-size.txt

Voici un script pour supprimer les dupliqués :

#!/bin/bash

if [ $# -lt 1 ]; then

echo "Usage: $0 <file>"

exit 1

fi

input_file="$1"
output_file="links-adjusted-size-no-duplicates.txt"

# Remove duplicates while preserving order

awk '!seen[$0]++' "$input_file" > "$output_file"
echo "Unique URLs saved to $output_file"

Supprimons les dupliqués :

./filter-unique.sh link-adjusted-size.txt
Unique URLs saved to links-adjusted-size-no-duplicates.txt

Maintenant je réalise qu’il y a certains fichiers .png que je ne veux pas, supprimons-les également :

cat links-adjusted-size-no-duplicates.txt | grep jpg > links.txt

Et hop terminé !

Pour je ne sais quelle raison, la bouche while n’a pas fonctionné :

while read url ; do curl -O '$url' && sleep 1 ; done < link-size-duplicates-jpg.txt

Elle n’arrête pas d’afficher des erreurs à propos d’un nom de fichier mal formaté. Je vais du coup utiliser un script python pour réaliser la même tâche, fait par IA bien sûr :

import os
import requests
from urllib.parse import urlparse, unquote
from time import sleep

# Path to your file with URLs
INPUT_FILE = "link-size-duplicates-jpg.txt"
OUTPUT_DIR = "downloaded_images"

# Create output directory if not exists
os.makedirs(OUTPUT_DIR, exist_ok=True)

# Read all URLs from file
with open(INPUT_FILE, "r", encoding="utf-8") as f:
    urls = [line.strip().replace("\\", "") for line in f if line.strip()]

print(f"Found {len(urls)} URLs to process.\n")

downloaded = set()

for i, url in enumerate(urls, start=1):
    if url in downloaded:
        print(f"[{i}] Skipping duplicate: {url}")
        continue

    print(f"[{i}] Downloading: {url}")

    try:
        response = requests.get(url, stream=True, timeout=15)
        response.raise_for_status()

        # Extract filename from URL path
        path = urlparse(url).path
        filename = os.path.basename(path)
        # Remove query params like ?v=xxx
        if "?" in filename:
            filename = filename.split("?")[0]
        filename = unquote(filename)  # Decode %20 etc.
        file_path = os.path.join(OUTPUT_DIR, filename)

        # Save image
        with open(file_path, "wb") as f_out:
            for chunk in response.iter_content(8192):
                f_out.write(chunk)

        print(f"✅ Saved as: {file_path}")

        downloaded.add(url)
        sleep(1)  # polite delay between downloads

    except requests.RequestException as e:
        print(f"❌ Error downloading {url}: {e}")

print("\nAll done!")

Et ça a marché ! J’ai toutes les images bien téléchargées sur ma machine. Trop cool !