Attente de téléchargement dynamique Python Selenium

introduction

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

Spécifications de téléchargement de Chrome

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.

Créer un dossier de téléchargement temporaire

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)

* Attention pour les délimiteurs de chemin

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

Spécifier le dossier de téléchargement Chrome

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

Commentaire

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.

Surveillance d'extension

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

Achevée

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.

en conclusion

Merci pour votre visite.

Il y a un meilleur moyen. Tel Si vous avez des suggestions, je vous serais reconnaissant de bien vouloir commenter.

référence

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

Attente de téléchargement dynamique Python Selenium
Télécharger Python
[Python / Selenium] XPath
Typage dynamique de Python
Écraser le fichier de téléchargement pour python selenium Chrome
Téléchargement parallèle avec Python
ScreenShot avec Selenium (édition Python)
Grattage avec du sélénium [Python]
python sélénium chromedriver beautifulsoup
Comment télécharger des fichiers depuis Selenium of Python dans Chrome
Grattage au sélénium en Python
Grattage avec Selenium + Python Partie 1
Python: travailler avec Firefox avec du sélénium
Grattage avec du sélénium en Python
Commencez à Selenium en utilisant python
Selenium WebDriver + Firefox49 (provisoire) (Python)
Web scraping avec Selenium (Python)
Grattage avec Selenium + Python Partie 2
[Python + Selenium] Conseils pour le grattage
Télécharger le fichier csv avec python
Défiez Python3 et Selenium Webdriver
Voulez-vous attendre un usage général avec Python Selenium?
Téléchargement de fichiers implémenté avec Python + Bottle
Scraping avec Selenium en Python (Basic)
Proxy dynamique avec python, ruby, PHP
Grattage avec Python, Selenium et Chromedriver
Téléchargez des fichiers Google Drive en Python
Ecrire le code de test du sélénium en python
Sélénium et python pour ouvrir Google
Générer un badge d'affichage du nombre de téléchargements de la bibliothèque Python