Боря се с използването на PhantomJS/Selenium/python-selenium за изтегляне на файл във файловата система. Мога лесно да навигирам в DOM и да щракам, да задържа курсора на мишката и т.н. Изтеглянето на файл обаче се оказва доста обезпокоително. Опитах безусловен подход с Firefox и pyvirtualdisplay, но това също не работеше добре и беше невероятно бавно. Знам, че CasperJS позволява изтегляне на файлове. Някой знае ли как да интегрира CasperJS с Python или как да използва PhantomJS за изтегляне на файлове. Оценявам го.
Използване на Selenium с Python и PhantomJS за изтегляне на файл във файловата система
Отговори (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
или да направим каквото си поискаме.
В момента PhantomJS не поддържа изтегляне на файлове. Съответни проблеми със заобиколни решения:
- Изтегляне на файл
- Как да се справя с диалоговия прозорец за запазване на файл с помощта на Selenium webdriver и PhantomJS?
Доколкото разбрах, имаш поне 3 варианта:
- превключете към
casperjs
(и трябва да оставите python тук) - пробвай с headless на
xvfb
- преминете към нормални браузъри без глава
Ето и някои връзки, които също могат да помогнат:
- Selenium Headless автоматизирано тестване в Ubuntu
- XWindows за Headless Selenium (с допълнителни връзки вътре)
- Как да стартирате браузъри (chrome, IE и firefox) в режим без глава?
- Урок: Как да използвате Headless Firefox за скрапиране в Linux
Моят случай на използване изискваше изпращане на формуляр за извличане на файла. Успях да постигна това с помощта на функцията 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)
Не е възможно по този начин. Можете да използвате други алтернативи за изтегляне на файлове като 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)