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:
- Versión del cliente Selenium : Selenium v3.141.59
- Versión de Chrome : Chrome v77.0
- Versión de ChromeDriver : ChromeDriver v77.0
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
- Actualiza ChromeDriver al último nivel de ChromeDriver v77.0 .
- Actualiza Chrome a Chrome Versión 77.0 nivel. (según las notas de la versión de ChromeDriver v76.0 )
-
Nota : Chrome v77.0 aún no se ha GAED / empujado para su lanzamiento, por lo que hasta entonces puede descargar e instalar una compilación de desarrollo y probar desde:
- Canario cromado
- Última compilación del canal de desarrollo
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 .