Я использовал селен для запуска загрузки. После завершения загрузки необходимо предпринять определенные действия, есть ли простой способ узнать, когда загрузка завершена? (Я использую драйвер FireFox)
Python selenium, узнать, когда загрузка завершена?
Ответ 1
Нет никакого встроенного в selenium способа дождаться завершения загрузки.
Общая идея здесь - подождать, пока файл не появится в вашем каталоге "Загрузки".
Это может быть достигнуто путем циклического повтора проверки наличия файла:
Или, используя такие вещи, как watchdog
для контроля каталога:
Ответ 2
Я столкнулся с этой проблемой недавно. Я загружал несколько файлов одновременно, и мне нужно было создать тайм-аут, если загрузка не удалась.
Код проверяет имена файлов в некотором каталоге загрузки каждую секунду и завершается, когда они завершены или если для их завершения требуется более 20 секунд. Возвращенное время загрузки использовалось для проверки успешности загрузок или истечения времени ожидания.
import time
import os
def download_wait(path_to_downloads):
seconds = 0
dl_wait = True
while dl_wait and seconds < 20:
time.sleep(1)
dl_wait = False
for fname in os.listdir(path_to_downloads):
if fname.endswith('.crdownload'):
dl_wait = True
seconds += 1
return seconds
Я считаю, что это работает только с файлами Chrome, так как они заканчиваются расширением .crdownload. Может быть аналогичный способ проверки в других браузерах.
Редактировать: я недавно изменил способ использования этой функции для времен, когда .crdownload
не отображается как расширение. По сути, это просто ждет правильного количества файлов.
def download_wait(directory, timeout, nfiles=None):
"""
Wait for downloads to finish with a specified timeout.
Args
----
directory : str
The path to the folder where the files will be downloaded.
timeout : int
How many seconds to wait until timing out.
nfiles : int, defaults to None
If provided, also wait for the expected number of files.
"""
seconds = 0
dl_wait = True
while dl_wait and seconds < timeout:
time.sleep(1)
dl_wait = False
files = os.listdir(directory)
if nfiles and len(files) != nfiles:
dl_wait = True
for fname in files:
if fname.endswith('.crdownload'):
dl_wait = True
seconds += 1
return seconds
Ответ 3
Я знаю, что уже слишком поздно для ответа, хотя хотел бы поделиться взломом для будущих читателей.
Вы можете создать тему, скажем thread1 из основного потока, и начать загрузку здесь. Теперь создайте другой поток, скажем, thread2 и там, пусть он дождется завершения thread1, используя метод join(). Теперь вы можете продолжить выполнение после завершения загрузки.
Тем не менее, убедитесь, что вы не начинаете загрузку с помощью selenium, вместо этого извлеките ссылку с помощью selenium и используйте модуль запросов для загрузки.
Скачать с помощью модуля запросов
Например:
def downloadit():
#download code here
def after_dwn():
dwn_thread.join() #waits till thread1 has completed executing
#next chunk of code after download, goes here
dwn_thread = threading.Thread(target=downloadit)
dwn_thread.start()
metadata_thread = threading.Thread(target=after_dwn)
metadata_thread.start()
Ответ 4
В Chrome файлы, которые еще не закончили загрузку, имеют расширение .crdownload
. Если вы установите свой каталог загрузки, то можете подождать, пока файл, который вы хотите, больше не имеет этого расширения. В принципе, это не сильно отличается от ожидания существования файла (как предложенного alecxe), но по крайней мере вы можете отслеживать прогресс таким образом.
Ответ 5
x1=0
while x1==0:
count=0
li = os.listdir("directorypath")
for x1 in li:
if x1.endswith(".crdownload"):
count = count+1
if count==0:
x1=1
else:
x1=0
Это работает, если вы пытаетесь проверить, завершился ли набор файлов (более одного).
Ответ 6
Как уже было сказано, нет никакого способа проверить, завершена ли загрузка. Итак, вот вспомогательная функция, которая выполняет работу для Firefox и Chrome. Один трюк - очистить папку загрузки temp перед началом новой загрузки. Кроме того, используйте собственный путь для межплатформенного использования.
from pathlib import Path
def is_download_finished(temp_folder):
firefox_temp_file = sorted(Path(temp_folder).glob('*.part'))
chrome_temp_file = sorted(Path(temp_folder).glob('*.crdownload'))
downloaded_files = sorted(Path(temp_folder).glob('*.*'))
if (len(firefox_temp_file) == 0) and \
(len(chrome_temp_file) == 0) and \
(len(downloaded_files) >= 1):
return True
else:
return False