python selenium google-chrome selenium-chromedriver google-chrome-headless

python - Descargue el archivo a través de Google Chrome en modo sin cabeza



selenium google-chrome (2)

Estoy codificar en Cromedrive en modo ''normal'' y funciona bien. Cuando cambio al modo sin cabeza, no descarga el archivo. Ya probé el código que encontré en Internet, pero no funcionó.

chrome_options = Options() chrome_options.add_argument("--headless") self.driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=r''{}/chromedriver''.format(os.getcwd())) self.driver.set_window_size(1024, 768) self.driver.command_executor._commands["send_command"] = ("POST", ''/session/$sessionId/chromium/send_command'') params = {''cmd'': ''Page.setDownloadBehavior'', ''params'': {''behavior'': ''allow'', ''downloadPath'': os.getcwd()}} self.driver.execute("send_command", params)

¿Alguien tiene alguna idea sobre cómo resolver este problema? PD: No necesito usar Chomedrive necesariamente. Si funciona en otra unidad, está bien para mí.


Primero la solucion

Prerrequisitos mínimos:

Para descargar el archivo haciendo clic en el elemento con texto como Descargar datos dentro de este sitio web , puede usar la siguiente solución:

  • Bloque de código:

    from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome.options import Options options = Options() options.add_argument("--headless") options.add_argument("--window-size=1920,1080") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option(''useAutomationExtension'', False) driver = webdriver.Chrome(chrome_options=options, executable_path=r''C:/Utility/BrowserDrivers/chromedriver.exe'', service_args=["--log-path=./Logs/DubiousDan.log"]) print ("Headless Chrome Initialized") params = {''behavior'': ''allow'', ''downloadPath'': r''C:/Users/Debanjan.B/Downloads''} driver.execute_cdp_cmd(''Page.setDownloadBehavior'', params) driver.get("https://www.mockaroo.com/") driver.execute_script("scroll(0, 250)"); WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button#download"))).click() print ("Download button clicked") #driver.quit()

  • Salida de consola:

    Headless Chrome Initialized Download button clicked

  • Instantánea de descarga de archivos:

Detalles

La descarga de archivos a través de Headless Chromium fue una de las funciones más buscadas desde que se introdujo Headless Chrome .

Desde entonces, hubo diferentes soluciones publicadas por diferentes colaboradores y algunos de ellos son:

Ahora, la buena noticia es que el equipo de Chromium ha anunciado oficialmente la llegada de la funcionalidad Descargar archivo a través de Headless Chromium .

En la discusión, el modo sin cabeza no guarda las descargas de archivos que @eseckler mencionó:

Las descargas en el trabajo sin cabeza son un poco diferentes. Existe el comando Page.setDownloadBehavior Page.setDownloadBehavior para establecer una carpeta de descarga. Estamos trabajando en una forma de utilizar la intercepción de red DevTools para transmitir el archivo descargado a través de DevTools también.

Puede encontrar una discusión detallada en el número 696481: el modo sin cabeza no guarda las descargas de archivos

Finalmente, la revisión @bugdroid parece haber @bugdroid el problema para nosotros.

[ChromeDriver] Se agregó soporte para el modo sin cabeza para descargar archivos

Anteriormente, Chromedriver que se ejecuta en modo sin cabeza no descargaba correctamente los archivos debido al hecho de que escasamente analiza el archivo de preferencia que se le otorga. Los ingenieros del equipo de Chrome sin cabeza recomendaron usar "Page.setDownloadBehavior" de DevTools para solucionar esto. Esta lista de cambios implementa esta solución. Los archivos descargados están predeterminados en el directorio actual y se pueden configurar mediante download_dir al crear instancias de una instancia de chromedriver. También se agregaron pruebas para garantizar la funcionalidad de descarga adecuada.

Aquí está la revision y commit

De ChromeDriver v77.0.3865.40 (2019-08-20) notas de la versión:

Resolved issue 2454: Headless mode doesn''t save file downloads [Pri-2]

Solución

Outro

Sin embargo, los usuarios de Mac OSX esperan su pastel, ya que en Chromedriver, Chrome sin cabeza se bloquea después de enviar Page.setDownloadBehavior en MacOSX .


No creo que deba usar el navegador para descargar contenido, déjelo a los desarrolladores / evaluadores de Chrome.

Creo que debería obtener el atributo href del elemento que desea descargar y obtenerlo usando la biblioteca de solicitudes

Si su sitio requiere autenticación, puede obtener cookies de la instancia del navegador y pasarlas a las requests.Session .