私はPhantomJS/Selenium/python-Seleniumを使用してファイルシステムにファイルをダウンロードすることに取り組んできました。 DOMを簡単にナビゲートしてクリック、ホバーなどを行うことができます。ただし、ファイルのダウンロードはかなり面倒です。私はFirefoxとpyvirtualdisplayでヘッドレスアプローチを試しましたが、どちらもうまく機能せず、信じられないほど遅くなりました。 CasperJSがファイルのダウンロードを許可していることを知っています。 CasperJSとPython=を統合する方法や、PhantomJSを使用してファイルをダウンロードする方法を知っている人はいますか。
この質問はかなり古いですが、PhantomJS
を介したファイルのダウンロードは依然として問題です。しかし、PhantomJSを使用してダウンロードリンクを取得し、csrfトークンなどの必要なすべてのcookieをフェッチできます。そして、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は現在ファイルのダウンロードをサポートしていません。回避策に関連する問題:
私が理解している限り、少なくとも3つのオプションがあります。
casperjs
に切り替えます(python here)のままにしてください)xvfb
をヘッドレスで試してくださいここにも役立つかもしれないいくつかのリンクがあります:
私のユースケースでは、ファイルを取得するためにフォームを送信する必要がありました。ドライバーの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)