Utiliser Selenium avec Python et PhantomJS pour télécharger des fichiers vers le système de fichiers

J'ai été aux prises avec L'utilisation de PhantomJS/sélénium/python-sélénium pour télécharger un fichier dans le système de fichiers. Je suis capable de naviguer facilement à travers le DOM et de cliquer, hover etc. Télécharger un fichier s'avère toutefois assez pénible. J'ai essayé une approche sans tête avec Firefox et pyvirtualdisplay mais ça ne marchait pas bien non plus et était incroyablement lent. Je sais que CasperJS permet le téléchargement de fichiers. Personne ne sait comment intégrer CasperJS avec Python ou comment utiliser PhantomJS pour télécharger des fichiers. Très apprécié.

19
demandé sur alecxe 2014-09-10 04:49:30

4 réponses

malgré cette question est assez ancienne, le téléchargement de fichiers à travers PhantomJS est toujours un problème. Mais nous pouvons utiliser PhantomJS pour obtenir le lien de téléchargement et récupérer tous les cookies nécessaires tels que les jetons csrf et ainsi de suite. Et puis on peut utiliser requests télécharger:

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)

Et maintenant, dans response.content contenu du fichier doit apparaître. On peut ensuite écrire open ou faire ce que nous voulons.

15
répondu valignatev 2016-02-27 04:56:08

PhantomJS ne supporte pas actuellement les téléchargements de fichiers. Questions pertinentes concernant les solutions de rechange:

  • passez à casperjs (et vous devriez laisser python ici)
  • essayez avec décapité sur xvfb
  • passer à la normale non sans tête navigateurs
11
répondu alecxe 2017-05-23 12:18:17

mon cas d'utilisation a exigé une présentation de formulaire pour récupérer le fichier. J'ai été en mesure de le faire à l'aide du pilote execute_async_script() fonction.

 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)
3
répondu dnbwise 2016-12-20 16:47:52

n'Est pas possible de cette façon. Vous pouvez utiliser d'autres alternatives pour télécharger des fichiers comme wget o curl.

Utiliser firefox pour trouver la bonne demande et le sélénium pour obtenir les valeurs, et enfin l'utilisation de la boîte de télécharger le fichier

curlCall=" curl 'http://www_sitex_org/descarga.jsf' -H '...allCurlRequest....' > file.xml"
subprocess.call(curlCall, shell=True)
-1
répondu hkeyland 2017-02-28 17:14:46