Lors du téléchargement d'un fichier à l'aide de Selenium, vous devez envisager d'attendre qu'il se termine. Je pense qu'il existe les erreurs et problèmes courants suivants.
Donc ・ ** Le traitement ultérieur commencera dès que le téléchargement sera terminé ** ・ ** Le temps d'attente peut être réglé par incréments de 1 seconde ** ・ ** La gestion des erreurs au moment de l'expiration est également possible ** J'ai essayé de faire un tel processus de veille.
Environnement: Windows10, Python3.8.3, Selenium3.141.0 Navigateur: GoogleChrome ChromeDriver83.0.4103.39
Puisque nous utilisons les spécifications de Google Chrome (au 14 juillet 2020) pour implémenter cette fonction. Les spécifications du début à la fin du téléchargement de Chrome sont décrites.
Il a de telles spécifications.
Donc ** l'extension du fichier téléchargé est ".Crdownload": Téléchargement Autre que ".crdownload": téléchargement terminé ** Puisqu'il peut être jugé que, nous surveillerons l'existence de l'extension ".crdownload" et attendrons.
Lorsque Chrome est démarré avec Selenium, la destination de téléchargement est le dossier «C: \ Users \ username \ Downloads» s'il s'agit de Windows. Si vous utilisez le dossier par défaut tel quel, les fichiers téléchargés dans le passé sont inclus, etc. Comme il est difficile de surveiller l'extension, créez un dossier de téléchargement temporaire pour stocker uniquement les fichiers à télécharger cette fois.
Créez un dossier temporaire dans le dossier du projet contenant ce fichier Python en tant que dossier de travail.
python
import os
#Obtenez le répertoire actuel
current_dir = os.getcwd()
#Paramètres du chemin du dossier de téléchargement temporaire
tmp_download_dir = f'{current_dir}\\tmpDownload'
#Créer un dossier temporaire
os.mkdir(tmp_download_dir)
Lorsque vous spécifiez un dossier de téléchargement dans Chrome sous Windows, spécifiez le délimiteur avec une barre oblique inverse "" au lieu d'une barre oblique "/".
Dans cet article, le délimiteur de chemin est échappé avec deux barres obliques inverses "\\
".
[Pour les débutants] Comportement inattendu si "" est inclus lors de la définition du chemin en Python
Remplacez la destination de téléchargement par le dossier de téléchargement temporaire créé dans la section précédente.
python
from selenium import webdriver
#
options = webdriver.ChromeOptions()
prefs = {'download.default_directory' : tmp_download_dir }
options.add_experimental_option('prefs',prefs)
#
driver_path = 'webdriver\\chromedriver.exe'
#
driver = webdriver.Chrome(executable_path = driver_path, chrome_options = options)
Modifier la destination de téléchargement dans les paramètres de l'option Chrome Démarrez Chrome en appliquant l'option de configuration du chemin du pilote. Désormais, au démarrage de Chrome, le dossier de téléchargement est défini et enregistré dans le dossier de téléchargement temporaire. Attendez la fin du téléchargement Après avoir démarré le téléchargement avec Selenium, définissez le délai d'attente et attendez la fin.
python
from selenium import webdriver
import os
import sys
import glob
import time
#Télécharger commencer le traitement avec Selenium(Cliquez sur le lien de téléchargement, etc.)
#Délai d'attente(Secondes)Réglage
timeout_second = 10
#Attendez l'heure spécifiée
for i in range(timeout_second + 1):
#Obtenir la liste des fichiers
download_fileName = glob.glob(f'{tmp_download_dir}\\*.*')
#Si le fichier existe
if download_fileName:
#Extraction d'extensions
extension = os.path.splitext(download_fileName[0])
#L'extension est'.crdownload'Pas de téléchargement complet en attente de sortie
if '.crdownload' not in extension[1] : break
#Même si vous attendez l'heure spécifiée.Erreur si les fichiers autres que crdownload ne peuvent pas être confirmés
if i >= timeout_second:
# ==Traitement des erreurs décrit ici==
#Terminer le traitement
driver.quit()
#Supprimer le dossier temporaire
shutil.rmtree(tmp_download_dir)
sys.exit()
#Attends une seconde
time.sleep(1)
#Le traitement suivant une fois le téléchargement terminé, tel que le stockage dans le dossier de téléchargement normal
En gros, il boucle pendant un nombre spécifié de secondes. ** "Vérifiez si le téléchargement est terminé, quittez la boucle d'attente si elle est terminée, attendez 1 seconde si elle n'est pas terminée" ** Je fais.
Pour quitter la boucle d'attente immédiatement après la fin du téléchargement Par exemple, définissez les secondes du délai d'expiration sur "10 secondes", et le téléchargement est en fait terminé après "3 secondes". Dans ce cas, vous pouvez procéder au traitement suivant une fois le téléchargement terminé "3-4 secondes" après le démarrage du téléchargement.
Si l'achèvement ne peut pas être confirmé même après le nombre de secondes spécifié, le traitement des erreurs démarre sans quitter la boucle.
Pour surveiller l'extension, obtenez d'abord la liste des fichiers dans le dossier temporaire avec glob.glob.
#Obtenir la liste des fichiers
download_fileName = glob.glob(f'{tmp_download_dir}\\*.*')
La liste suivante sera renvoyée en fonction de l'état du téléchargement.
■ ** Si le téléchargement n'a pas commencé même après avoir cliqué sur le bouton de téléchargement ** Le fichier n'existe pas dans le dossier: ** \ [](liste vide) **
■ ** Téléchargement ** test.csv.crdownload généré: ** [test.csv.crdownload] **
■ ** Téléchargement terminé ** Supprimer ".cr download": ** [test.csv] **
Juger cette liste, ** Lorsque la liste n'est pas vide (le fichier existe) et que l'extension n'est pas ".crdownload" ** J'essaie de sortir de la boucle d'attente lorsque le téléchargement est terminé.
Os.path.splitext est utilisé comme processus pour extraire uniquement l'extension.
#Extraction d'extensions
extension = os.path.splitext(download_fileName[0])
Lorsque le nom du fichier est " test.csv.crdownload
"
Dans l'extension [0] ** Nom de fichier avant l'extension [test.csv] **
Extension [1] ** Extension [.crdownload] **
Lorsque le nom du fichier est " test.csv
"
Dans l'extension [0] ** Nom de fichier avant l'extension [test] **
Extension [1] ** Extension [.csv] **
Est saisi.
Il est déterminé si l'extension [1] avec l'extension est `` .crdownload ''.
#L'extension est.Quittez le processus de fin de téléchargement qui n'est pas crdownload
if '.crdownload' not in extension[1] : break
Le processus ci-dessus est résumé, ajusté et déplacé du dossier de téléchargement temporaire vers le dossier de téléchargement normal pour terminer. Changez simplement le temps d'attente lors de son utilisation!
python
from selenium import webdriver
import os
import sys
import glob
import shutil
import time
#Obtenez le répertoire actuel
current_dir = os.getcwd()
#Paramètres du chemin du dossier de téléchargement temporaire
tmp_download_dir = f'{current_dir}\\tmpDownload'
#Supprimer le dossier temporaire s'il existe(Le précédent peut rester)
if os.path.isdir(tmp_download_dir):
shutil.rmtree(tmp_download_dir)
#Créer un dossier de téléchargement temporaire
os.mkdir(tmp_download_dir)
#Modifier la destination de téléchargement dans les paramètres des options de Chrome
options = webdriver.ChromeOptions()
prefs = {'download.default_directory' : tmp_download_dir }
options.add_experimental_option('prefs',prefs)
#Paramètre du chemin du pilote
driver_path = 'webdriver\\chromedriver.exe'
#Appliquer les options et lancer Chrome
driver = webdriver.Chrome(executable_path = driver_path, chrome_options = options)
# ===Transition d'écran===
# driver.get('https://xxxxxxx.co.jp/')
#Cliquez sur le lien pour commencer le téléchargement
# driver.find_element_by_xpath('//*[@id="download"]').click()
#Délai d'attente(Secondes)Réglage
timeout_second = 10
#Attendez l'heure spécifiée
for i in range(timeout_second + 1):
#Obtenir la liste des fichiers
download_fileName = glob.glob(f'{tmp_download_dir}\\*.*')
#Si le fichier existe
if download_fileName:
#Extraction d'extensions
extension = os.path.splitext(download_fileName[0])
#L'extension est'.crdownload'Pas de téléchargement complet en attente de sortie
if '.crdownload' not in extension[1] : break
#Même si vous attendez l'heure spécifiée.Erreur si les fichiers autres que crdownload ne peuvent pas être confirmés
if i >= timeout_second:
# ==Traitement des erreurs décrit ici==
#Terminer le traitement
driver.quit()
#Supprimer le dossier temporaire
shutil.rmtree(tmp_download_dir)
sys.exit()
#Attends une seconde
time.sleep(1)
# ===Post-traitement après la fin du téléchargement===
#Fermer Chrome
driver.quit()
#Stocker dans le dossier de téléchargement principal
shutil.move(download_fileName[0], f'{current_dir}\\Download')
#Supprimer le dossier temporaire
shutil.rmtree(tmp_download_dir)
Cependant, si vous déplacez le fichier avec le même nom vers le dossier de téléchargement d'origine tel qu'il est, une erreur se produira, vous devez donc le recréer en fonction de la situation.
Download_fileName [0]
est le chemin complet du fichier téléchargé, veuillez donc le renommer comme vous le souhaitez.Merci pour votre visite.
Il y a un meilleur moyen. Tel Si vous avez des suggestions, je vous serais reconnaissant de bien vouloir commenter.
Fonctionnement automatique complet de Chrome avec Python + Selenium Définissez le dossier de téléchargement par défaut pour le pilote Chrome de Selenium Obtenez la liste des fichiers dans un dossier avec Python Obtenir le nom du fichier / le nom du dossier / l'extension à partir de la chaîne de chemin en Python et combiner
Recommended Posts