¿Cómo usar Chrome Webdriver en Selenium para descargar archivos en Python?

Basándome en las publicaciones aquí y aquí , estoy intentando usar un controlador web de Chrome en Selenio para poder descargar un archivo. Aquí está el código hasta ahora

from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--disable-extensions") chrome_options.add_experimental_option("profile.default_content_settings.popups", 0) chrome_options.add_experimental_option("download.prompt_for_download", "false") chrome_options.add_experimental_option("download.default_directory", "/tmp") driver = webdriver.Chrome(chrome_options=chrome_options) 

Pero esto solo resulta en el siguiente error:

 WebDriverException: Message: unknown error: cannot parse capability: chromeOptions from unknown error: unrecognized chrome option: download.default_directory (Driver info: chromedriver=2.24.417424 (c5c5ea873213ee72e3d0929b47482681555340c3),platform=Linux 4.10.0-37-generic x86_64) 

Entonces, ¿cómo solucionar esto? ¿Tengo que usar esta cosa ‘capacidad’? Si es así, ¿cómo exactamente?

Prueba esto. Ejecutado en windows

( Cómo controlar la descarga de archivos con enlaces Selenium Python en Chrome )

 from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.add_experimental_option("prefs", { "download.default_directory": r"C:\Users\xxx\downloads\Test", "download.prompt_for_download": False, "download.directory_upgrade": True, "safebrowsing.enabled": True }) 

De su excepción, está usando chromedriver=2.24.417424 .

¿Cuáles son las versiones de Selenium y del navegador Chrome que estás usando?

Probé el siguiente código con:

  • Selenio 3.6.0
  • Chromedriver 2,33
  • Google Chrome 62.0.3202.62 (comstackción oficial) (64 bits)

Y funciona:

 from selenium import webdriver download_dir = "/pathToDownloadDir" chrome_options = webdriver.ChromeOptions() preferences = {"download.default_directory": download_dir , "directory_upgrade": True, "safebrowsing.enabled": True } chrome_options.add_experimental_option("prefs", preferences) driver = webdriver.Chrome(chrome_options=chrome_options,executable_path=r'/pathTo/chromedriver') driver.get("urlFileToDownload"); 

Asegúrese de estar usando un navegador que sea compatible con su chromedriver (desde aquí , debe ser Chrome v52-54 ).

Algunos consejos:

  1. El cromo y el chromedriver deberían tener la misma versión.

    Normalmente, el paquete de cromo debe tener chromedriver adentro, lo puedes encontrar en el directorio de instalación. Si está utilizando ubuntu / debian, ejecute dpkg -L chromium-chromedriver .

  2. Tener una configuración de preferencias de Chrome correcta.

    como dijo Satish, usa options.add_experimental_option("prefs", ...) para configurar Selenio + Chrome. Pero a veces la configuración puede cambiar por tiempo. La mejor manera de obtener preferencias más nuevas y viables es verificarlo en el directorio de configuración de Chromium. Por ejemplo,

    • Lanzar un cromo en el escritorio de Xorg.
    • Cambiar configuraciones en el menú.
    • Dejar de cromo
    • Descubra la configuración real en ~/.config/chromium/Default/Preferences
    • Léelo, elige las opciones exactas que necesitas.

En mi caso, el código es:

 from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities options = webdriver.ChromeOptions() options.gpu = False options.headless = True options.add_experimental_option("prefs", { "download.default_directory" : "/data/books/chrome/", 'profile.default_content_setting_values.automatic_downloads': 2, }) desired = options.to_capabilities() desired['loggingPrefs'] = { 'performance': 'ALL'} driver = webdriver.Chrome(desired_capabilities=desired) 

Creo que la forma más fácil de guardar un archivo arbitrario (es decir, una imagen) utilizando WebDriver es ejecutar JavaScript que guardará el archivo. No requiere configuración en absoluto!

Uso esta biblioteca FileSaver.js para guardar un archivo con el nombre deseado con facilidad.

 from selenium import webdriver import requests FILE_SAVER_MIN_JS_URL = "https://raw.githubusercontent.com/eligrey/FileSaver.js/master/dist/FileSaver.min.js" file_saver_min_js = requests.get(FILE_SAVER_MIN_JS_URL).content chrome_options = webdriver.ChromeOptions() driver = webdriver.Chrome('/usr/local/bin/chromedriver', options=chrome_options) # Execute FileSaver.js in page's context driver.execute_script(file_saver_min_js) # Now you can use saveAs() function download_script = f''' return fetch('https://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-logo.svg?v=a010291124bf', {{ "credentials": "same-origin", "headers": {{"accept":"image/webp,image/apng,image/*,*/*;q=0.8","accept-language":"en-US,en;q=0.9"}}, "referrerPolicy": "no-referrer-when-downgrade", "body": null, "method": "GET", "mode": "cors" }} ).then(resp => {{ return resp.blob(); }}).then(blob => {{ saveAs(blob, 'stackoverflow_logo.svg'); }}); ''' driver.execute_script(download_script) # Done! Your browser has saved an SVG image!