Télécharger plusieurs (65) fichiers en même temps de "excel-pratique"
voir https://forum.excel-pratique.com/excel/creation-d-une-matrice-de-ponderation-196871
l'avant-dernier post contient 65 fichiers type "xlsx". Normallement en clicquant dessus, on télécharge chaque fichier, mais si on doit faire cela 65 fois ... .
Y-a-t-il une méthode pour les télécharger en 1 manipulation ?
Hello,
Pour Chrome , il y a l'extension Simple mass downloader qui doit savoir faire cela.
Ami calmant, J.P
@Jurassic Pork,
une fois qu'on a installé cet app, il faut clicquer sur chaque PJ ou peut-on choisir le premier puis CTRL+Shift et le dernier ?
Je viens de faire un essai
tu cliques sur le premier et tu restes appuyer et tu descends jusqu'au dernier. Une fois que tous les fichiers sont sélectionnés tu cliques droit et tu sélectionnes add-selection-links to list. Tu sélectionnes HTM (66) et tu cliques sur Download Now et normalement cela va te télécharger les fichiers.
Bonjour à tous,
sous firefox, il y a snap links
Crdlmt
Hello
Tu peux développer un programme, en ligne de commande, pour le faire.
L'idée est de concevoir un web scrapper de page web qui
- dans un premier temps va récupérer une page web via une simple requête GET
- dans un second temps va lire et extraire l'ensemble des liens d'une page web. Il est alors possible de filtrer le traitement pour ne récupérer que certains types de fichiers),
- pour au final parcourir dans une boucle l'ensemble des liens extraits pour exécuter une requête, et ainsi télécharger chaque fichier.
Par exemple, voila un script Python pour télécharger tous les fichiers xlsx d'une page web.
import os
import requests
from bs4 import BeautifulSoup
# URL de la page web
url = '<copier_url_ici>'
# Créer un répertoire pour stocker les fichiers téléchargés
os.makedirs('downloaded_xlsx', exist_ok=True)
# Envoyer une requête GET à la page web
response = requests.get(url)
response.raise_for_status()
# Analyser le contenu HTML de la page
soup = BeautifulSoup(response.text, 'html.parser')
# Extraire tous les liens vers des fichiers Excel (se termine avec l'extension xlsx)
links = soup.find_all('a', href=True)
xlsx_links = [link['href'] for link in links if link['href'].endswith('.xlsx')]
# Itération pour télécharger chaque fichier
for link in xlsx_links:
# Obtenir le nom de fichier
filename = link.split('/')[-1]
# Envoyer une requête GET pour télécharger le fichier
file_response = requests.get(link)
file_response.raise_for_status() # Vérifiez s'il y a des erreurs dans la requête
# Enregistrer le fichier
with open(os.path.join('downloaded_xlsx', filename), 'wb') as file:
file.write(file_response.content)
print(f'Downloaded: {filename}')
print('See you next time, space cowboy ^^.')bonjour v20100v, merci pour la reponse. J n'ai pas encore utilisé Python, cela s fait comment, le script, on le met où ?
Bonjour @BsAlv,
Il faut installer Python pour pouvoir compiler/lancer les fichiers de code .py. Ensuite un éditeur de texte/IDE pour coder correctement. Personnellement j'aime bien VSCode, je te met le lien des instructions de démarrage ici.
Si tu veux rester "full vanilla", tu peux juste installer Python, qui je crois a un mini-IDE fourni avec. Le tutoriel sur le site officiel.
Une autre alternative beaucoup utilisée est l'IDE PyCharm de la suite JetBrains, en version "Community Edition" = gratuite. Create and run your first project | PyCharm Documentation
@Saboh12617,
Cela a l'air très prometteur, je vais y travailler
Hello BsAlv,
En complément de la réponse de saboh,
Installer Python
L'installation de python peut sembler complexe au début, surtout avec les multitudes de version disponibles (Jython MicroPython, Anaconda....), du coup on ne sait plus trop quel distribution installé. Pour commencer, la version Python officiel sur le site Python.org est suffisante.
- Télécharger l'installeur python v3.13 (LTS) sur le site officiel pour ton OS.
- S'assurer que le binaire python est bien défini dans la variable d'environnement PATH.
Normalement l'installeur te demande l'option "Add Python to PATH". Et si tu as raté cette option, ce n'est pas grave, tu peux toujours allez dans "Windows > Modifier les variables d'environnement système" pour ajouter manuellement le chemin où tu as installé Python dans la variable d'env système PATH (e.g. Tu ajoutes "C:\Tools\Python311\" dans PATH si c'est ton répertoire d'installation). La variable PATH sert simplement à rendre accessible les binaires (.exe, .bat...) depuis n'importe quel chemin dans un terminal Windows. - Vérifiez l'installation, tu ouvres une console Windows (cmd.exe) et tu exécutés python --version
Comme saboh l'indique, j'aime bien utilisé la suite Jetbrains pour de nombreux écosystèmes... dont Python avec l'outil PyCharm. C'est un formidable IDE !
Configurer son environnement Python
- La première chose à faire est de créer un environnement virtuel Python (si tu utilises Jetbrains PyCharm, il le fait automatiquement pour toi à la création d'un nouveau projet) ou sinon tu peux le faire simplement avec la ligne de commande suivante. Pour le créer, tu utilise la commande
Il va créer le répertoire un sous-repertoire .venv, qui va servir à l'installation des dépendances de ton projet (un peu comme le répertoire vendor avec composer en php, ou le repertoire node_modules avec npm en Node Javascript. Bref c'est très pratique d'isoler l'installation de ces dépendances par projet (et ne pas polluer son os via une installation globale) - L'activation de l'environnement se fait par l'appel du script (batch windows)
.\.venv\Scripts\activate.bat
- Ensuite tu installes les dépendances (pour faire simple on utilise ici le gestionnaire par défaut dans Python, à savoir pip (rmq : il en existe d'autres gestionnaire de dépendances Python plus évolué comme poetry).
Pour ce downloader, il faut installer beautifulsoup4 et request.
Pour installer la librairie beautifulsoup4 utilisé dans le script, tu lances la commande :pip install beautifulsoup4
Si tu navigues dans le répertoire .\.venv\Lib\site-packages tu verras le sous-répertoire \beautifulsoup4-4.12.3.dist-info\ dans lequel la librairie a été installé.
Pour installer la librairie request, tu lances la commande:(venv)>pip install requests
Remarque, généralement on exécute la commande en une seule ligne de commande pour installer plusieurs libraires, ou encore mieux on utilise un fichier qui définit toutes les dependances (par défaut nomme requirements.txt) et s'installe avec la commande(venv)> pip install -r requirements.txt - Et finalement tu peux exécuter le programme python avec l'instruction :
python monProgramme.py
Bonus :
J'en ai profité pour faire une nouvelle version du downloader.
La précédente version filtrer uniquement les liens qui contiennent des fichiers avec l'extension xlsx... ce qui n'est pas le cas des liens sur ce forum. Cette version ci-dessous est plus "ciblé" pour extraire et filtrer les liens du forum Excel-Pratique... p
Par contre attention désolé dans le code, je n'ai pas le droit d'écrire des liens donc il faut corriger l'écriture du lien dans la règle startswith:p
import os
import requests
import re
from bs4 import BeautifulSoup
# Extraire toutes les balises liens (tag HTML <a></a>) d'une page web
def extract_all_links_from_given_page(url):
# Envoyer une requête GET à la page web à analyser
response = requests.get(url)
response.raise_for_status()
# Analyser le contenu HTML de la page
soup = BeautifulSoup(response.text, 'html.parser')
# Extraire tous les liens de la page
links = soup.find_all('a', href=True)
return links
# Filter les liens dont l'url (href) commencent par ...forum.excel-pratique.com/d/download? (on ne garde que les liens de téléchargement de fichiers du forum)
def extract_all_download_links_forum_excel_pratique(links):
links_href_filtered = [link['href'] for link in links if link['href'].startswith('liens_https_forum_excel_pratique_com/d/download?')]
return links_href_filtered
# Récuperer le nom du fichier depuis l'analyse de la réponse HTTP
def get_filename_from_response(response):
# Pour rendre les en-têtes insensible à la casse
headers = {k.lower(): v for k, v in response.headers.items()}
if 'content-disposition' in headers:
# Récuperer le nom du fichier depuis l'en-tête content-disposition dans la réponse HTTP
filename = headers['content-disposition'].split('filename=')[1].strip('"')
else:
# Si l'en-tête n'est pas présent, utiliser le dernier segment de l'URL
filename = link.split('/')[-1]
# Remplacer les caractères invalides par un underscore
filename = re.sub(r'[\\/*?:"<>|]', '_', filename)
return filename
print('\n----------------')
print('Start downloader')
print('----------------\n')
url = "https://forum.excel-pratique.com/excel/creation-d-une-matrice-de-ponderation-196871"
output_directory = 'downloaded'
print(f'Scan the web page: {url}\n')
os.makedirs(output_directory, exist_ok=True)
links = extract_all_links_from_given_page(url)
links_href_download_file_forum_excel_pratique = extract_all_download_links_forum_excel_pratique(links)
# Itération pour télécharger chaque fichier
total_files = len(links_href_download_file_forum_excel_pratique)
file_counter = 0
for link in links_href_download_file_forum_excel_pratique:
file_counter += 1
print(f'=== Try to download file {file_counter}/{total_files} ===')
print(f'> Download link: {link}')
# Envoyer la requete HTTP sur ce lien
http_response = requests.get(link)
http_response.raise_for_status()
# Informer l'utilisateur du traitement de la requete
if http_response.status_code == 200:
print("> OK (200) - The file has been downloaded.")
else:
print(f"> Error ({http_response.status_code}) - Unable to download file.")
# Récuperer le nom du fichier depuis l'analyse de la réponse HTTP
filename = get_filename_from_response(http_response)
print("> Founded filename: ", filename)
# Ecriture du fichier dans le répertoire de sortie
with open(os.path.join(output_directory, filename), 'wb') as file:
file.write(http_response.content)
print("> File saved in :", ".\\" + os.path.join(output_directory, filename))
print()
print('See you next time, space cowboy ^^.')c'est pour lundi prochain ...
Re,
Yep bon week-end !
Sur ce forum... ca serait un comble que de ne pas donner une solution en VBA.
Les fichiers téléchargés sont stockés dans le répertoire ./downloaded du chemin du classeur Excel.
Voila le code pour avoir une idée sur comment "coder" un scrapper de page web en vba,
- pour extraire des liens,
- recuperer les liens de fichiers à télécharger...
- et télécharger ses fichiers.
Sub Downloader()
' URL de la page web
Dim url As String
Dim outputDirectory As String
url = "https://forum.excel-pratique.com/excel/creation-d-une-matrice-de-ponderation-196871"
outputDirectory = ThisWorkbook.Path & "\downloaded"
' Créer le répertoire de sortie s'il n'existe pas
If Dir(outputDirectory, vbDirectory) = "" Then
MkDir outputDirectory
End If
' Extraire tous les liens de la page
Dim html As Object
Dim links As Object
Set html = CreateObject("HTMLFILE")
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", url, False
.send
html.body.innerHTML = .responseText
End With
Set links = html.getElementsByTagName("a")
' Filtrer les liens dont l'URL contient un fichier à télécharger sur le forum
Dim link As Object
Dim hrefLinksFiltered As Collection
Set hrefLinksFiltered = New Collection
For Each link In links
If InStr(1, link.href, "https://forum.excel-pratique.com/d/download?", vbTextCompare) > 0 Then
hrefLinksFiltered.Add link.href
End If
Next link
' Itération pour télécharger chaque fichier
Dim totalFiles As Integer
Dim fileCounter As Integer
totalFiles = hrefLinksFiltered.Count
fileCounter = 0
Dim hreflink As Variant
For Each hreflink In hrefLinksFiltered
fileCounter = fileCounter + 1
Debug.Print "=== Try to download file " & fileCounter & "/" & totalFiles & " ==="
Debug.Print "> Download link: " & hreflink
' Envoyer la requête HTTP avec cet url (hreflink)
Set httpResponse = CreateObject("MSXML2.XMLHTTP")
With httpResponse
.Open "GET", hreflink, False
.send
End With
' Informer l'utilisateur du traitement de la requête
If httpResponse.Status = 200 Then
Debug.Print "> OK (200) - The file has been downloaded."
Else
Debug.Print "> Error (" & httpResponse.Status & ") - Unable to download file."
End If
' Récupérer le nom du fichier depuis l'en-tête Content-Disposition (s'il existe)
filename = ""
If InStr(1, httpResponse.getAllResponseHeaders, "Content-Disposition", vbTextCompare) > 0 Then
Dim headers As String
headers = httpResponse.getAllResponseHeaders
filename = Mid(headers, InStr(headers, "filename=") + 9)
Dim positionNewline As Integer
positionNewline = InStr(filename, vbCrLf)
filename = Left(filename, positionNewline - 1)
Else
filename = "download_file_" & fileCounter
End If
Debug.Print "> Filename extracted from HTTP headers: " & filename
' Écriture du fichier dans le répertoire de sortie
Open outputDirectory & "\" & filename For Binary As #1
Put #1, , httpResponse.responseBody
Close #1
Debug.Print "> File saved in: " & outputDirectory & "\" & filename
Debug.Print
Next hreflink
End Subre,
amaai, supér
