Хочу разработать софт, который будет скачивать файлы по ссылке в облаке Mega, проверять что это за файл (видео или картинка) и сортировать по соответствующим папкам.
Сортировку кое-как (но я думаю, что это очень плохо) реализовал, а вот со скачиванием не могу разобраться.
Хотел сделать через библиотеку requests, но там, так скажем, идентификатор директории, которую я хочу скачать - случайный набор символов (хэш-функция?) которая с каждым запросом меняется. Поэтому я не смог реализовать через requests (хотя очень хотелось!).
Пришлось, опять же, в виду малого опыта, обратиться к selenium, но даже там у меня возникли проблемы...
Смог дойти до нужной кнопки на скачивание zip-архива, но как сказать selenium`у ждать, пока файл не скачается?
В противном случае, он сразу закрывает окно, а ставить time.sleep - мягко говоря, нерационально.
Части кода отдельно, пока не пойму как реализовать первую - со второй не свяжу. Там надо будет делать через os проверку на добавление последних файлах в 'Загрузки', разархивировать ее и т.д., но концепция, я думаю, понятна.
import time
import os
import shutil
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
### Часть 1
"""Добываем папку с файлами по ссылке """
###
options = webdriver.ChromeOptions()
options.add_argument("user-agent=Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0")
options.add_argument('--disable-blink-features=AutomationControlled')
driver = webdriver.Chrome(
executable_path=r'C:\Users\Lenovo PC\Desktop\mega_project\chromedriver.exe',
options=options
)
driver.implicitly_wait(20)
link = 'https://mega.nz/folder/guRwWAKB#ws2Yma9ZLni7AueouzgZkg'
try:
driver.get(link)
folder = WebDriverWait(driver, 15).until(
EC.element_to_be_clickable((By.CLASS_NAME, 'nw-fm-tree-folder'))
)
ActionChains(driver).context_click(folder).perform()
download_button = driver.find_element(By.CSS_SELECTOR, '.dropdown-item.download-item.contains-submenu.sprite-fm-mono-after.icon-arrow-right-after')
ActionChains(driver).move_to_element(download_button).perform()
zip_button = driver.find_element(By.CSS_SELECTOR, '.dropdown.body.submenu.download.active i.sprite-fm-mono.icon-download-zip')
zip_button.click()
# ???
except:
pass
### Часть 2
"""Парсим папку"""
###
# Путь до папки, которую будем парсить
path = r'C:\Users\Lenovo PC\Desktop\Тест'
# Путь до папки, в которую будем сохранять
path_to_save = r'C:\Users\Lenovo PC\Desktop\result'
# Форматы видео и картинок, по которым будет происходить сортировка
video_formats = ['.mp3', '.mp4', '.mov']
image_formats = ['.png', '.jpeg', '.jpg', '.heic']
def create_folders(path):
'''Создает поддиректории в path_to_save, если их еще нет и возвращает пути до поддиректорий'''
video_path = path+'\\video'
image_path = path+'\\image'
if not os.path.isdir(video_path):
os.mkdir(video_path)
if not os.path.isdir(image_path):
os.mkdir(image_path)
return video_path, image_path
def path_search(path, video_path, image_path, level=1):
'''Парсит указанную папку'''
print(f'Level: {level} | Content: {os.listdir(path)}')
for i in os.listdir(path):
'''Проходится по всем элементам в директории'''
if os.path.isdir(path+'\\'+i):
'''Если элемент-поддиректория, функция вызывается рекурсивно для данной поддиректории'''
print(f'Спускаемся', path+'\\' + i)
path_search(path+'\\'+ i, video_path, image_path, level+1)
elif os.path.isfile(path+'\\'+i):
'''Проверяет что за файл видео или картинка и смотрит, есть ли уже этот файл в папке назначения'''
if any(filter(lambda x: i.endswith(x), video_formats)) and not os.path.exists(video_path + '\\' + i):
shutil.move(path + '\\' + i, video_path)
print(f'Файл {i} перемещен в {video_path}')
elif any(filter(lambda x: i.endswith(x), image_formats)) and not os.path.exists(image_path + '\\' + i):
shutil.move(path + '\\' + i, image_path)
print(f'Файл {i} перемещен в {image_path}')
video_path, image_path = create_folders(path_to_save)
path_search(path, video_path, image_path)