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 !