2014-09-10 13 views
17

Mi sono messo alle prese con l'utilizzo di PhantomJS/Selenium/python-selenium per scaricare un file nel filesystem. Sono in grado di navigare facilmente attraverso il DOM e fare clic, hover ecc. Il download di un file, tuttavia, si rivela piuttosto problematico. Ho provato un approccio headless con Firefox e pyvirtualdisplay, ma non funzionava bene ed era incredibilmente lento. So che CasperJS consente il download di file. Qualcuno sa come integrare CasperJS con Python o come utilizzare PhantomJS per scaricare i file. Molto apprezzato.Utilizzo di Selenium con Python e PhantomJS per scaricare il file sul filesystem

risposta

11

PhantomJS attualmente non supporta i download di file. questioni rilevanti con soluzioni:

Per quanto ho capito, di avere almeno 3 opzioni:

  • interruttore a casperjs (e si dovrebbe lasciare pitone qui)
  • provare con headless su xvfb
  • passare alla normale browser non-senza testa

Anche qui ci sono alcuni link che potrebbero aiutare anche:

+5

Sembra capacità di download di file da allora è stato aggiunto alla PhantomJS (compresi commenti in tal senso nel [thread che hai collegato a] (https://github.com/ariya/phantomjs/issues/10052)). Tuttavia, non sono sicuro che questo sia esposto in un modo facile da usare in selenio. –

14

Nonostante questa domanda sia piuttosto vecchia, il download dei file tramite PhantomJS rappresenta ancora un problema. Ma possiamo usare PhantomJS per ottenere il link per il download e recuperare tutti i cookie necessari come i token csrf e così via. E poi possiamo usare requests per scaricarlo in realtà: deve apparire

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) 

E ora in response.content contenuto del file vero e proprio. Possiamo poi scriverlo con open o fare quello che vogliamo.

3

Il mio caso d'uso richiedeva l'invio di un modulo per recuperare il file. Sono stato in grado di farlo utilizzando la funzione execute_async_script() del driver.

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) 
-1

Non è possibile in questo modo. Puoi usare altre alternative per scaricare file come wget o curl.

usare Firefox per trovare la richiesta giusta e selenio per ottenere i valori per questo e, infine, utilizzare fuori alla casella di scaricare il file

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