Използване на Selenium с Python и PhantomJS за изтегляне на файл във файловата система

Боря се с използването на PhantomJS/Selenium/python-selenium за изтегляне на файл във файловата система. Мога лесно да навигирам в DOM и да щракам, да задържа курсора на мишката и т.н. Изтеглянето на файл обаче се оказва доста обезпокоително. Опитах безусловен подход с Firefox и pyvirtualdisplay, но това също не работеше добре и беше невероятно бавно. Знам, че CasperJS позволява изтегляне на файлове. Някой знае ли как да интегрира CasperJS с Python или как да използва PhantomJS за изтегляне на файлове. Оценявам го.


person Encinoman818    schedule 10.09.2014    source източник


Отговори (4)


Въпреки че този въпрос е доста стар, изтеглянето на файлове през PhantomJS все още е проблем. Но можем да използваме PhantomJS, за да получим връзка за изтегляне и да извлечем всички необходими бисквитки, като csrf токени и т.н. И тогава можем да използваме requests, за да го изтеглим всъщност:

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)

И сега в response.content трябва да се появи действителното съдържание на файла. След това можем да го напишем с open или да направим каквото си поискаме.

person valignatev    schedule 27.02.2016

В момента PhantomJS не поддържа изтегляне на файлове. Съответни проблеми със заобиколни решения:

Доколкото разбрах, имаш поне 3 варианта:

  • превключете към casperjs (и трябва да оставите python тук)
  • пробвай с headless на xvfb
  • преминете към нормални браузъри без глава

Ето и някои връзки, които също могат да помогнат:

person alecxe    schedule 10.09.2014
comment
Изглежда възможността за изтегляне на файлове оттогава е добавена към PhantomJS (включително коментари в този смисъл в нишката, която сте свързали до). Не съм сигурен обаче, че това е изложено по лесен за използване начин в Selenium. - person John Y; 24.06.2015

Моят случай на използване изискваше изпращане на формуляр за извличане на файла. Успях да постигна това с помощта на функцията execute_async_script() на драйвера.

 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)
person dnbwise    schedule 20.12.2016

Не е възможно по този начин. Можете да използвате други алтернативи за изтегляне на файлове като wget o curl.

Използвайте firefox, за да намерите правилната заявка и selenium, за да получите стойностите за това и накрая използвайте out of the box, за да изтеглите файла

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