Подтвердить что ты не робот

Использование Selenium с Python и PhantomJS для загрузки файла в файловую систему

Я пытаюсь использовать PhantomJS/Selenium/python-selenium для загрузки файла в файловую систему. Я могу легко перемещаться по DOM и щелкнуть, наведите курсор и т.д. Загрузка файла, однако, окажется довольно хлопотной. Я пробовал безголовый подход с Firefox и pyvirtualdisplay, но это тоже плохо работало и было невероятно медленным. Я знаю, что CasperJS позволяет загружать файлы. Кто-нибудь знает, как интегрировать CasperJS с Python или как использовать PhantomJS для загрузки файлов. Очень ценится.

4b9b3361

Ответ 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 не поддерживает загрузку файлов. Актуальные проблемы с обходными методами:

Насколько я понимаю, у вас есть как минимум 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)