web-dev-qa-db-ja.com

PythonおよびPhantomJSでSeleniumを使用してファイルをファイルシステムにダウンロードする

私はPhantomJS/Selenium/python-Seleniumを使用してファイルシステムにファイルをダウンロードすることに取り組んできました。 DOMを簡単にナビゲートしてクリック、ホバーなどを行うことができます。ただし、ファイルのダウンロードはかなり面倒です。私はFirefoxとpyvirtualdisplayでヘッドレスアプローチを試しましたが、どちらもうまく機能せず、信じられないほど遅くなりました。 CasperJSがファイルのダウンロードを許可していることを知っています。 CasperJSとPython=を統合する方法や、PhantomJSを使用してファイルをダウンロードする方法を知っている人はいますか。

20
Encinoman818

この質問はかなり古いですが、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でそれを書くか、好きなようにできます。

18
valignatev

PhantomJSは現在ファイルのダウンロードをサポートしていません。回避策に関連する問題:

私が理解している限り、少なくとも3つのオプションがあります。

  • casperjsに切り替えます(python here)のままにしてください)
  • xvfbをヘッドレスで試してください
  • 通常の非ヘッドレスブラウザーに切り替える

ここにも役立つかもしれないいくつかのリンクがあります:

11
alecxe

私のユースケースでは、ファイルを取得するためにフォームを送信する必要がありました。ドライバーの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)
3
dnbwise