No se pueden almacenar los archivos descargados en sus carpetas correspondientes

He escrito un script en python en combinación con selenium para descargar algunos archivos de documentos (que terminan con .doc) desde una página web. La razón por la que no deseo utilizar las requests o el módulo urllib para descargar los archivos es porque el sitio web con el que estoy trabajando actualmente no tiene ninguna URL verdadera conectada a cada archivo. Ellos son javascript encriptados. Sin embargo, he elegido un enlace dentro de mi script para imitar el mismo.

Lo que hace mi guión en este momento:

  1. Crear una carpeta maestra en el escritorio.
  2. Cree subcarpetas dentro de la carpeta maestra tomando el nombre de los archivos que se descargarán
  3. Descargue los archivos que inician, haga clic en sus enlaces y coloque los archivos en la carpeta maestra. (this is what I need rectified)

¿Cómo puedo modificar mi script para descargar los archivos iniciando el clic en sus enlaces y colocar los archivos descargados en sus carpetas correspondientes?

Este es mi bash hasta ahora:

 import os import time from selenium import webdriver link ='https://www.online-convert.com/file-format/doc' dirf = os.path.expanduser('~') desk_location = dirf + r'\Desktop\file_folder' if not os.path.exists(desk_location):os.mkdir(desk_location) def download_files(): driver.get(link) for item in driver.find_elements_by_css_selector("a[href$='.doc']")[:2]: filename = item.get_attribute("href").split("/")[-1] #creating new folder in accordance with filename to store the downloaded file in thier concerning folder folder_name = item.get_attribute("href").split("/")[-1].split(".")[0] #set the new location of the folders to be created new_location = os.path.join(desk_location,folder_name) if not os.path.exists(new_location):os.mkdir(new_location) #set the location of the folders the downloaded files will be within file_location = os.path.join(new_location,filename) item.click() time_to_wait = 10 time_counter = 0 try: while not os.path.exists(file_location): time.sleep(1) time_counter += 1 if time_counter > time_to_wait:break except Exception:pass if __name__ == '__main__': chromeOptions = webdriver.ChromeOptions() prefs = {'download.default_directory' : desk_location, 'profile.default_content_setting_values.automatic_downloads': 1 } chromeOptions.add_experimental_option('prefs', prefs) driver = webdriver.Chrome(chrome_options=chromeOptions) download_files() 

La siguiente imagen representa cómo se almacenan actualmente los archivos descargados (the files are outside of their concerning folders) :

introduzca la descripción de la imagen aquí

Acabo de agregar el cambio de nombre del archivo para moverlo. Así que funcionará tal como lo tiene, pero una vez que descarga el archivo, lo moverá a la ruta correcta:

os.rename(desk_location + '\\' + filename, file_location)

Código Completo:

 import os import time from selenium import webdriver link ='https://www.online-convert.com/file-format/doc' dirf = os.path.expanduser('~') desk_location = dirf + r'\Desktop\file_folder' if not os.path.exists(desk_location): os.mkdir(desk_location) def download_files(): driver.get(link) for item in driver.find_elements_by_css_selector("a[href$='.doc']")[:2]: filename = item.get_attribute("href").split("/")[-1] #creating new folder in accordance with filename to store the downloaded file in thier concerning folder folder_name = item.get_attribute("href").split("/")[-1].split(".")[0] #set the new location of the folders to be created new_location = os.path.join(desk_location,folder_name) if not os.path.exists(new_location): os.mkdir(new_location) #set the location of the folders the downloaded files will be within file_location = os.path.join(new_location,filename) item.click() time_to_wait = 10 time_counter = 0 try: while not os.path.exists(file_location): time.sleep(1) time_counter += 1 if time_counter > time_to_wait:break os.rename(desk_location + '\\' + filename, file_location) except Exception:pass if __name__ == '__main__': chromeOptions = webdriver.ChromeOptions() prefs = {'download.default_directory' : desk_location, 'profile.default_content_setting_values.automatic_downloads': 1 } chromeOptions.add_experimental_option('prefs', prefs) driver = webdriver.Chrome(chrome_options=chromeOptions) download_files() 

Use este código al declarar el objeto Controlador (Esto es para Java, Python también tendrá una forma similar de lograrlo). Esto descargará el archivo a la ubicación especificada cada vez.

  //Create preference object HashMap chromePrefs = new HashMap(); //Set Download path chromePrefs.put("download.default_directory","C:\\Reports\\AutomaionDownloads"); chromePrefs.put("download.directory_upgrade", true); ChromeOptions options = new ChromeOptions(); options.setExperimentalOption("prefs", chromePrefs); //Call the Chrome Driver WebDriver driver = new ChromeDriver(options); 

Use la biblioteca pathlib en Python 3 o la biblioteca pathlib2 para Python 2 para manejar las rutas. Te da una forma orientada a objetos para trabajar con archivos y directorios. También tiene PurePath objeto PurePath , que puede trabajar con rutas sin siquiera tocar el sistema de archivos.