Я пытаюсь использовать PhantomJS/Selenium/python-selenium для загрузки файла в файловую систему. Я могу легко перемещаться по DOM и щелкнуть, наведите курсор и т.д. Загрузка файла, однако, окажется довольно хлопотной. Я пробовал безголовый подход с Firefox и pyvirtualdisplay, но это тоже плохо работало и было невероятно медленным. Я знаю, что CasperJS позволяет загружать файлы. Кто-нибудь знает, как интегрировать CasperJS с Python или как использовать PhantomJS для загрузки файлов. Очень ценится.
Использование Selenium с Python и PhantomJS для загрузки файла в файловую систему
Ответ 1
Несмотря на то, что этот вопрос довольно старый, загрузка файлов через PhantomJS
по-прежнему является проблемой. Но мы можем использовать PhantomJS для получения ссылки для загрузки и получения всех необходимых файлов cookie, таких как токены 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
или сделать все, что захотим.
Ответ 2
В настоящее время PhantomJS не поддерживает загрузку файлов. Актуальные проблемы с обходными методами:
- Загрузка файла
- Как справиться с диалоговым окном сохранения файла с помощью Selenium webdriver и PhantomJS?
Насколько я понимаю, у вас есть как минимум 3 варианта:
- переключитесь на
casperjs
(и вы должны оставить здесь python) - попробуйте с безголовым на
xvfb
- перейти к обычным браузерам без заголовка
Вот некоторые ссылки, которые могут также помочь:
Ответ 3
Мой пример использования потребовал отправки формы для извлечения файла. Я смог выполнить это, используя функцию драйвера 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)
Ответ 4
Невозможно это сделать. Вы можете использовать другие альтернативы для загрузки таких файлов, как wget o curl.
Используйте firefox, чтобы найти правильный запрос и селен, чтобы получить значения для этого и, наконец, использовать из коробки для загрузки файла
curlCall=" curl 'http://www_sitex_org/descarga.jsf' -H '...allCurlRequest....' > file.xml"
subprocess.call(curlCall, shell=True)