wake-up-neo.net

Wie verwende ich den Chrome Web-Treiber in Selenium, um Dateien in Python herunterzuladen?

Basierend auf den Beiträgen hier und hier versuche ich, einen Chrom-Web-Treiber in Selenium zu verwenden, um eine Datei herunterladen zu können. Hier ist der Code soweit

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)

Dies allein führt jedoch zu folgendem Fehler:

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)

Wie kann ich das beheben? Muss ich diese Fähigkeitsfunktion verwenden? Wenn ja, wie genau?

8
Alex

Versuche dies. Unter Windows ausgeführt

( So steuern Sie den Download von Dateien mit Selenium Python-Bindungen in 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
})
14
Satish

Ich denke, dass der einfachste Weg, eine beliebige Datei (d. H. Ein Bild) mit WebDriver zu speichern, darin besteht, JavaScript auszuführen, das die Datei speichert. Überhaupt keine Konfiguration erforderlich!

Ich benutze diese Bibliothek FileSaver.js , um eine Datei mit dem gewünschten Namen mit Leichtigkeit zu speichern.

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

Aus Ihrer Ausnahme verwenden Sie chromedriver=2.24.417424.

Welche Versionen von Selenium und Chrome verwenden Sie?

Ich habe folgenden Code ausprobiert mit:

  • Selen 3.6.0
  • chromdriver 2.33
  • Google Chrome 62.0.3202.62 (Official Build) (64-Bit)

Und es funktioniert:

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");

Stellen Sie sicher, dass Sie einen Browser verwenden, der von Ihrem Chromedriver unterstützt wird (von hier sollte Chrome v52-54 sein).

0
Davide Patti

Einige Hinweise:

  1. Chrom und Chromantrieb sollten dieselbe Version haben.

    In der Regel sollte das Chrom-Paket einen Chrom-Treiber enthalten. Sie finden ihn im Installationsverzeichnis. Wenn Sie ubuntu/debian verwenden, führen Sie dpkg -L chromium-chromedriver aus.

  2. Habe eine korrekte Chrome-Prefereinstellung.

    wie Satish sagte, verwenden Sie options.add_experimental_option("prefs", ...), um Selenium + Chrome zu konfigurieren. Aber manchmal ändert sich die Konfiguration mit der Zeit. Die beste Möglichkeit, die neuesten und funktionsfähigen Einstellungen zu erhalten, besteht darin, sie im Chrom-Konfigurationsverzeichnis zu überprüfen. Zum Beispiel, 

    • Starten Sie ein Chrom auf dem Xorg-Desktop
    • Ändern Sie die Einstellungen im Menü
    • Chrom verlassen
    • Finden Sie die tatsächlichen Einstellungen in ~/.config/chromium/Default/Preferences heraus.
    • Lesen Sie es, wählen Sie die genauen Optionen aus, die Sie benötigen.

In meinem Fall lautet der Code:

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)
0
talebook