tag scraping name examples example español code python selenium selenium-webdriver download phantomjs

scraping - Uso de Selenium con Python y PhantomJS para descargar archivos al sistema de archivos



web scraping python español (4)

Mi caso de uso requería un envío de formulario para recuperar el archivo. Pude lograr esto usando la función execute_async_script() del controlador.

js = '''''' var callback = arguments[0]; var theForm = document.forms[''theFormId'']; data = new FormData(); data.append(''eventTarget'', "'''''' + target + ''''''"); // this is the id of the file clicked data.append(''otherFormField'', theForm.otherFormField.value); var xhr = new XMLHttpRequest(); xhr.open(''POST'', theForm.action, true); '''''' for cookie in driver.get_cookies(): js += '' xhr.setRequestHeader("'' + cookie[''name''] + ''", "'' + cookie[''value''] + ''"); '' js += '''''' xhr.onload = function () { callback(this.responseText); }; xhr.send(data); '''''' driver.set_script_timeout(30) file = driver.execute_async_script(js)

He estado lidiando con el uso de PhantomJS / Selenium / python-selenium para descargar un archivo al sistema de archivos. Soy capaz de navegar fácilmente a través del DOM y hacer clic, desplazarme, etc. Sin embargo, la descarga de un archivo está demostrando ser bastante problemática. He intentado un enfoque sin cabeza con Firefox y pyvirtualdisplay pero tampoco funcionó bien y fue increíblemente lento. Sé que CasperJS permite la descarga de archivos. ¿Alguien sabe cómo integrar CasperJS con Python o cómo utilizar PhantomJS para descargar archivos? Muy apreciado.


No es posible de esa manera. Puedes usar otras alternativas para descargar archivos como wget o curl.

Use firefox para encontrar la solicitud correcta y el selenio para obtener los valores para eso y finalmente use la caja para descargar el archivo

curlCall=" curl ''http://www_sitex_org/descarga.jsf'' -H ''...allCurlRequest....'' > file.xml" subprocess.call(curlCall, shell=True)


PhantomJS actualmente no admite descargas de archivos. Problemas relevantes con las soluciones provisionales:

Por lo que entiendo, tienes al menos 3 opciones:

  • cambia a casperjs (y deberías dejar Python aquí)
  • prueba con headless en xvfb
  • cambiar a los navegadores normales sin cabeza

Aquí también hay algunos enlaces que pueden ayudar también:


A pesar de que esta pregunta es bastante antigua, la descarga de archivos a través de PhantomJS sigue siendo un problema. Pero podemos usar PhantomJS para obtener el enlace de descarga y obtener todas las cookies necesarias, como los tokens csrf, etc. Y luego podemos usar requests para descargarlo en realidad:

import requests from selenium import webdriver driver = webdriver.PhantomJS() driver.get(''page_with_download_link'') download_link = driver.find_element_by_id(''download_link'') session = requests.Session() cookies = driver.get_cookies() for cookie in cookies: session.cookies.set(cookie[''name''], cookie[''value'']) response = session.get(download_link)

Y ahora en response.content debe aparecer el contenido del archivo real. A continuación podemos escribirlo en open o hacer lo que queramos.