Python Selenium Dynamic Download warten

Einführung

Wenn Sie eine Datei mit Selenium herunterladen, müssen Sie darauf warten, dass sie abgeschlossen ist. Ich denke, es gibt die folgenden häufigen Fehler und Probleme.

Deshalb ・ ** Die nachfolgende Verarbeitung beginnt, sobald der Download abgeschlossen ist ** ・ ** Wartezeit kann in Schritten von 1 Sekunde eingestellt werden ** ・ ** Fehlerbehandlung bei Timeout ist ebenfalls möglich ** Ich habe versucht, einen solchen Standby-Prozess durchzuführen.

Umgebung: Windows10, Python3.8.3, Selenium3.141.0 Browser: GoogleChrome ChromeDriver83.0.4103.39

Chrome-Download-Spezifikationen

Da wir die Google Chrome-Spezifikationen (Stand 14. Juli 2020) verwenden, um diese Funktion zu implementieren. Die Spezifikationen vom Start bis zum Abschluss des Chrome-Downloads werden beschrieben.

Es hat solche Spezifikationen.

Also ** ist die Erweiterung der heruntergeladenen Datei ".Crdownload": Herunterladen Andere als ".crdownload": Download abgeschlossen ** Da dies beurteilt werden kann, werden wir das Vorhandensein der Erweiterung ".crdownload" überwachen und warten.

Erstellen eines temporären Download-Ordners

Wenn Chrome mit Selenium gestartet wird, ist das Download-Ziel der Ordner "C: \ Benutzer \ Benutzername \ Downloads", wenn es sich um Windows handelt. Wenn Sie den Standardordner unverändert verwenden, werden in der Vergangenheit heruntergeladene Dateien usw. eingeschlossen. Da es schwierig ist, die Erweiterung zu überwachen, erstellen Sie einen temporären Download-Ordner, in dem nur die Dateien gespeichert werden, die dieses Mal heruntergeladen werden sollen.

Erstellen Sie einen temporären Ordner im Projektordner, der diese Python-Datei enthält, als Arbeitsordner.

python


import os

#Holen Sie sich das aktuelle Verzeichnis
current_dir = os.getcwd()

#Einstellungen für den temporären Download-Ordnerpfad
tmp_download_dir = f'{current_dir}\\tmpDownload'

#Erstellen eines temporären Ordners
os.mkdir(tmp_download_dir)

* Vorsicht bei Pfadbegrenzern

Wenn Sie einen Download-Ordner in Chrome unter Windows angeben, geben Sie das Trennzeichen mit einem "" Backslash anstelle eines "/" Schrägstrichs an. In diesem Artikel wird der Pfadbegrenzer mit zwei umgekehrten Schrägstrichen "\\" maskiert. [Für Anfänger] Unerwartetes Verhalten, wenn beim Festlegen des Pfads in Python "" enthalten ist

Geben Sie den Chrome-Download-Ordner an

Ändern Sie das Download-Ziel in den temporären Download-Ordner, der im vorherigen Abschnitt erstellt wurde. Verwenden Sie die Chrome-Option, um Änderungen vorzunehmen.

python


from selenium import webdriver

#Ändern Sie das Download-Ziel in den Chrome-Optionseinstellungen
options = webdriver.ChromeOptions()
prefs = {'download.default_directory' : tmp_download_dir }
options.add_experimental_option('prefs',prefs)

#Einstellung des Treiberpfads
driver_path = 'webdriver\\chromedriver.exe'

#Wenden Sie Optionen an und starten Sie Chrome
driver = webdriver.Chrome(executable_path = driver_path, chrome_options = options)

Wenn Chrome gestartet wird, wird der Download-Ordner festgelegt und im temporären Download-Ordner gespeichert.

Warten Sie, bis der Download abgeschlossen ist

Nachdem Sie den Download mit Selenium gestartet haben, stellen Sie die Wartezeit ein und warten Sie, bis der Download abgeschlossen ist.

python


from selenium import webdriver

import os
import sys
import glob
import time

#Download Starten Sie die Verarbeitung mit Selen(Klicken Sie auf den Download-Link usw.)

#Wartezeit(Sekunden)Aufbau
timeout_second = 10

#Warten Sie auf die angegebene Zeit
for i in range(timeout_second + 1):
    #Dateiliste abrufen
    download_fileName = glob.glob(f'{tmp_download_dir}\\*.*')
    
    #Wenn die Datei existiert
    if download_fileName:
        #Extraktion von Erweiterungen
        extension = os.path.splitext(download_fileName[0])

        #Die Erweiterung ist'.crdownload'Nicht herunterladen komplettes Beenden warten
        if '.crdownload' not in extension[1] : break

    #Auch wenn Sie auf die angegebene Zeit warten.Fehler, wenn andere Dateien als crdownload nicht bestätigt werden können
    if i >= timeout_second:
        # ==Fehlerbehandlung hier beschrieben==
        #Verarbeitung beenden
        driver.quit()
        #Temporären Ordner löschen
        shutil.rmtree(tmp_download_dir)
        sys.exit()

    #Warte mal eine Sekunde
    time.sleep(1)

#Die folgende Verarbeitung nach Abschluss des Downloads, z. B. Speichern im normalen Download-Ordner

Kommentar

Grob gesagt wird eine Schleife für eine bestimmte Anzahl von Sekunden ausgeführt. ** "Überprüfen Sie, ob der Download abgeschlossen ist, verlassen Sie die Warteschleife, wenn er abgeschlossen ist, und warten Sie 1 Sekunde, wenn er nicht abgeschlossen ist" ** Ich mache.

So beenden Sie die Warteschleife sofort nach Abschluss des Downloads Stellen Sie beispielsweise die Zeitüberschreitungssekunden auf "10 Sekunden" ein, und der Download ist nach "3 Sekunden" tatsächlich abgeschlossen. In diesem Fall können Sie "3-4 Sekunden" nach dem Start des Downloads mit der nachfolgenden Verarbeitung fortfahren, nachdem der Download abgeschlossen ist.

Wenn der Abschluss auch nach der angegebenen Anzahl von Sekunden nicht bestätigt werden kann, wird die Fehlerverarbeitung gestartet, ohne die Schleife zu verlassen.

Erweiterungsüberwachung

Um die Erweiterung zu überwachen, rufen Sie zuerst die Liste der Dateien im temporären Ordner mit glob.glob ab.

#Dateiliste abrufen
download_fileName = glob.glob(f'{tmp_download_dir}\\*.*')

Die folgende Liste wird abhängig vom Download-Status zurückgegeben.

■ ** Wenn der Download auch nach dem Klicken auf den Download-Button noch nicht gestartet wurde ** Datei existiert nicht im Ordner: ** \ [](leere Liste) **

■ ** Herunterladen ** test.csv.crdownload generiert: ** [test.csv.crdownload] **

■ ** Download abgeschlossen ** Entfernen Sie ".cr download": ** [test.csv] **

Diese Liste zu beurteilen, ** Wenn die Liste nicht leer ist (die Datei existiert) und die Erweiterung nicht ".crdownload" ist ** Ich versuche, aus der Warteschleife herauszukommen, wenn der Download abgeschlossen ist.

Os.path.splitext wird als Prozess verwendet, um nur die Erweiterung zu extrahieren.

#Extraktion von Erweiterungen
extension = os.path.splitext(download_fileName[0])

Wenn der Dateiname " test.csv.crdownload "lautet In Erweiterung [0] ** Dateiname vor Erweiterung [test.csv] ** Erweiterung [1] ** Erweiterung [.crdownload] **

Wenn der Dateiname " test.csv "ist In Erweiterung [0] ** Dateiname vor Erweiterung [Test] ** Erweiterung [1] ** Erweiterung [.csv] ** Wird eingegeben.

Es wird bestimmt, ob die Erweiterung [1] mit der Erweiterung ".crdownload" ist.

#Die Erweiterung ist.Beenden Sie den Download-Abschlussprozess, bei dem es sich nicht um einen Download handelt
if '.crdownload' not in extension[1] : break

Komplett

Der obige Vorgang wird zusammengefasst, angepasst und zum Abschluss aus dem temporären Download-Ordner in den regulären Download-Ordner verschoben. Ändern Sie einfach die Wartezeit, wenn Sie es verwenden!

python


from selenium import webdriver

import os
import sys
import glob
import shutil
import time

#Holen Sie sich das aktuelle Verzeichnis
current_dir = os.getcwd()

#Einstellungen für den temporären Download-Ordnerpfad
tmp_download_dir = f'{current_dir}\\tmpDownload'

#Löschen Sie den temporären Ordner, falls vorhanden(Der vorherige kann bleiben)
if os.path.isdir(tmp_download_dir):
    shutil.rmtree(tmp_download_dir)

#Erstellen eines temporären Download-Ordners
os.mkdir(tmp_download_dir)

#Ändern Sie das Download-Ziel in den Chrome-Optionseinstellungen
options = webdriver.ChromeOptions()
prefs = {'download.default_directory' : tmp_download_dir }
options.add_experimental_option('prefs',prefs)

#Einstellung des Treiberpfads
driver_path = 'webdriver\\chromedriver.exe'

#Wenden Sie Optionen an und starten Sie Chrome
driver = webdriver.Chrome(executable_path = driver_path, chrome_options = options)

# ===Bildschirmübergang===
# driver.get('https://xxxxxxx.co.jp/')

#Klicken Sie auf den Link, um den Download zu starten
# driver.find_element_by_xpath('//*[@id="download"]').click()

#Wartezeit(Sekunden)Aufbau
timeout_second = 10

#Warten Sie auf die angegebene Zeit
for i in range(timeout_second + 1):
    #Dateiliste abrufen
    download_fileName = glob.glob(f'{tmp_download_dir}\\*.*')

    #Wenn die Datei existiert
    if download_fileName:
        #Extraktion von Erweiterungen
        extension = os.path.splitext(download_fileName[0])

        #Die Erweiterung ist'.crdownload'Nicht herunterladen komplettes Beenden warten
        if '.crdownload' not in extension[1] : break

    #Auch wenn Sie auf die angegebene Zeit warten.Fehler, wenn andere Dateien als crdownload nicht bestätigt werden können
    if i >= timeout_second:
        # ==Fehlerbehandlung hier beschrieben==
        #Verarbeitung beenden
        driver.quit()
        #Temporären Ordner löschen
        shutil.rmtree(tmp_download_dir)
        sys.exit()

    #Warte mal eine Sekunde
    time.sleep(1)

# ===Nachbearbeitung nach Abschluss des Downloads===
#Schließen Sie Chrome
driver.quit()

#Im primären Download-Ordner speichern
shutil.move(download_fileName[0], f'{current_dir}\\Download')

#Temporären Ordner löschen
shutil.rmtree(tmp_download_dir)

Wenn Sie jedoch die Datei mit demselben Namen in den ursprünglichen Download-Ordner verschieben, tritt ein Fehler auf, sodass Sie sie je nach Situation neu erstellen müssen.

abschließend

Danke für Ihren Besuch.

Es gibt einen besseren Weg. Eine solche Wenn Sie Vorschläge haben, würde ich mich freuen, wenn Sie einen Kommentar abgeben könnten.

Referenz

Vollständiger automatischer Betrieb von Chrome mit Python + Selen Legen Sie den Standard-Download-Ordner für den Chrome-Treiber von Selenium fest Liste der Dateien in einem Ordner mit Python abrufen Dateiname / Ordnername / -erweiterung aus der Pfadzeichenfolge in Python abrufen und kombinieren

Recommended Posts

Python Selenium Dynamic Download warten
Laden Sie Python herunter
[Python / Selen] XPath
Dynamische Eingabe von Python
Download-Datei für Python Selen Chrome überschreiben
Paralleler Download mit Python
Screenshot mit Selen (Python Edition)
Schaben mit Selen [Python]
Python Selen Chromedriver schöne Suppe
So laden Sie Dateien von Selenium of Python in Chrome herunter
Schaben mit Selen in Python
Schaben mit Selen + Python Teil 1
Python: Arbeiten mit Firefox mit Selen
Scraping mit Selen in Python
Starten Sie mit Python zu Selen
Selen WebDriver + Firefox49 (vorläufig) (Python)
Web Scraping mit Selenium (Python)
Schaben mit Selen + Python Teil 2
[Python + Selen] Tipps zum Scraping
Laden Sie die CSV-Datei mit Python herunter
Fordern Sie Python3 und Selenium Webdriver heraus
Möchten Sie mit Python Selenium auf allgemeine Zwecke warten?
Implementierter Dateidownload mit Python + Bottle
Scraping mit Selen in Python (Basic)
Dynamischer Proxy mit Python, Ruby, PHP
Scraping mit Python, Selen und Chromedriver
Laden Sie Google Drive-Dateien in Python herunter
Schreiben Sie Selentestcode in Python
Selen und Python zum Öffnen von Google
Generieren Sie das Display-Abzeichen für die Download-Anzahl der Python-Bibliotheken