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é.
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.
PhantomJS ne supporte pas actuellement les téléchargements de fichiers. Questions pertinentes concernant les solutions de rechange:
- téléchargement de Fichier
- comment gérer la boîte de dialogue Enregistrer fichier en utilisant Selenium webdriver et PhantomJS?
- passez à
casperjs
(et vous devriez laisser python ici) - essayez avec décapité sur
xvfb
- passer à la normale non sans tête navigateurs
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)
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)