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
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.
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)
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
Ä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.
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
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.
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
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.
Download_fileName [0]
ist der vollständige Pfad der heruntergeladenen Datei. Benennen Sie sie daher nach Belieben um.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.
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