Я использовал селен, чтобы начать загрузку. После завершения загрузки необходимо выполнить определенные действия. Существует ли простой способ узнать, когда загрузка завершена? (Я использую драйвер FireFox)
8 ответов
Нет встроенного в селен способа ожидания завершения загрузки.
Общая идея заключается в том, чтобы подождать, пока файл не появится в вашем каталоге «Downloads» .
Это может быть достигнуто путем многократной проверки цикла на наличие файлов:
Или, используя такие вещи, как watchdog
для мониторинга каталога:
Я знаю, что уже слишком поздно для ответа, хотя хотел бы поделиться взломом для будущих читателей.
Вы можете создать поток, скажем, 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()
В Chrome файлы, которые не закончили загрузку, имеют расширение .crdownload
. Если вы установите каталог для загрузки правильно, тогда вы можете подождать, пока файл, который вы хотите, больше не имеет этого расширения. В принципе, это мало чем отличается от ожидания существования файла (как предложено alecxe) - но, по крайней мере, вы можете следить за прогрессом таким образом.
Как уже было сказано, нет способа проверить, завершена ли загрузка. Итак, вот вспомогательная функция, которая делает работу для Firefox и Chrome. Одна хитрость - очистить папку временной загрузки перед началом новой загрузки. Кроме того, используйте native pathlib для кроссплатформенного использования.
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
Это сработало для меня:
fileends = "crdownload"
while "crdownload" in fileends:
sleep(1)
for fname in os.listdir(some_path):
print(fname)
if "crdownload" in fname:
fileends = "crdownload"
else:
fileends = "None"
Я столкнулся с этой проблемой недавно. Я загружал несколько файлов одновременно, и мне нужно было создать тайм-аут, если загрузка не удалась.
Код проверяет имена файлов в некотором каталоге загрузки каждую секунду и завершается, когда они завершены или если для их завершения требуется более 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
Проверьте наличие «неподтвержденного» ключевого слова в имени файла в каталоге загрузки:
#wait for download complete
wait = True
while(wait==True):
for fname in os.listdir('\path\to\download directory):
if ('Unconfirmed') in fname:
print('downloading files ...')
time.sleep(10)
else:
wait=False
print('finished downloading all files ...')
Как только загрузка файла завершена, она выходит из цикла while.
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
Это работает, если вы пытаетесь проверить, закончилась ли загрузка набора файлов (более одного).
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.