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