web-dev-qa-db-ja.com

Seleniumでchrome webdriverを使用してPythonでファイルをダウンロードするには?

投稿に基づいて here および here chromeファイルをダウンロードできるようにSeleniumのwebdriverを使用しようとしています。これまでのコード

from Selenium import webdriver
from Selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--disable-extensions")
chrome_options.add_experimental_option("profile.default_content_settings.popups", 0)
chrome_options.add_experimental_option("download.Prompt_for_download", "false")
chrome_options.add_experimental_option("download.default_directory", "/tmp")

driver = webdriver.Chrome(chrome_options=chrome_options)

ただし、これだけでも次のエラーが発生します。

WebDriverException: Message: unknown error: cannot parse capability: chromeOptions
from unknown error: unrecognized chrome option: download.default_directory
  (Driver info: chromedriver=2.24.417424 (c5c5ea873213ee72e3d0929b47482681555340c3),platform=Linux 4.10.0-37-generic x86_64)

それでこれを修正する方法は?この「機能」を使用する必要がありますか?もしそうなら、どのように正確に?

13
Alex

これを試して。 Windowsで実行

Seleniumでファイルのダウンロードを制御する方法Python Chromeのバインディング

from Selenium import webdriver
from Selenium.webdriver.chrome.options import Options

options = Options()
options.add_experimental_option("prefs", {
  "download.default_directory": r"C:\Users\xxx\downloads\Test",
  "download.Prompt_for_download": False,
  "download.directory_upgrade": True,
  "safebrowsing.enabled": True
})
16
Satish

WebDriverを使用して任意のファイル(画像)を保存する最も簡単な方法は、ファイルを保存するJavaScriptを実行することだと思います。設定は一切必要ありません!

このライブラリ FileSaver.js を使用して、目的の名前でファイルを簡単に保存します。

from Selenium import webdriver
import requests

FILE_SAVER_MIN_JS_URL = "https://raw.githubusercontent.com/eligrey/FileSaver.js/master/dist/FileSaver.min.js"

file_saver_min_js = requests.get(FILE_SAVER_MIN_JS_URL).content

chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome('/usr/local/bin/chromedriver', options=chrome_options)

# Execute FileSaver.js in page's context
driver.execute_script(file_saver_min_js)

# Now you can use saveAs() function
download_script = f'''
    return fetch('https://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-logo.svg?v=a010291124bf',
        {{
            "credentials": "same-Origin",
            "headers": {{"accept":"image/webp,image/apng,image/*,*/*;q=0.8","accept-language":"en-US,en;q=0.9"}},
            "referrerPolicy": "no-referrer-when-downgrade",
            "body": null,
            "method": "GET",
            "mode": "cors"
        }}
    ).then(resp => {{
        return resp.blob();
    }}).then(blob => {{
        saveAs(blob, 'stackoverflow_logo.svg');
    }});
    '''

driver.execute_script(download_script)
# Done! Your browser has saved an SVG image!
2
Andrey Semakin

いくつかのヒント:

  1. クロムとクロムドライバーは同じバージョンである必要があります。

    通常、chromeパッケージにはchromedriverが含まれている必要があります。インストールディレクトリで見つけることができます。 ubuntu/debianを使用している場合は、_dpkg -L chromium-chromedriver_を実行します。

  2. 正しいChrome設定の構成

    satishが言ったように、options.add_experimental_option("prefs", ...)を使用してSelenium + chromeを設定します。ただし、構成は時間とともに変更される場合があります。 最新で実行可能な設定を取得するための適切な方法は、chrome config dirで確認することです。たとえば、

    • XorgデスクトップでChromiumを起動する
    • メニューの設定を変更する
    • クロムを終了
    • _~/.config/chromium/Default/Preferences_の実際の設定を確認してください
    • 読んで、必要なオプションを選択してください。

私の場合、コードは次のとおりです。

_from Selenium import webdriver
from Selenium.webdriver.common.desired_capabilities import DesiredCapabilities

options = webdriver.ChromeOptions()
options.gpu = False
options.headless = True
options.add_experimental_option("prefs", {
    "download.default_directory" : "/data/books/chrome/",
    'profile.default_content_setting_values.automatic_downloads': 2,
    })

desired = options.to_capabilities()
desired['loggingPrefs'] = { 'performance': 'ALL'}
driver = webdriver.Chrome(desired_capabilities=desired)
_
2
talebook

例外から、chromedriver=2.24.417424を使用しています。

使用しているSeleniumとChromeブラウザのバージョンは何ですか?

私は次のコードを試しました:

  • セレン3.6.0
  • chromedriver 2.33
  • Google Chrome 62.0.3202.62(公式ビルド)(64ビット)

そしてそれは動作します:

from Selenium import webdriver

download_dir = "/pathToDownloadDir"
chrome_options = webdriver.ChromeOptions()
preferences = {"download.default_directory": download_dir ,
               "directory_upgrade": True,
               "safebrowsing.enabled": True }
chrome_options.add_experimental_option("prefs", preferences)
driver = webdriver.Chrome(chrome_options=chrome_options,executable_path=r'/pathTo/chromedriver')

driver.get("urlFileToDownload");

Chromedriverでサポートされているブラウザを使用していることを確認してください( here から、Chrome v52-54である必要があります)。

0
Davide Patti