【问题标题】:How can I download something with Selenium and Chrome?如何使用 Selenium 和 Chrome 下载内容?
【发布时间】:2017-08-18 04:19:05
【问题描述】:

作为第一步,我尝试设置默认下载文件夹。

我尝试了 5 个选项,但都没有成功:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Selenium example for downloading a webpage."""

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import os
import time


def main():
    """Download an opened PDF page."""
    browser = get_browser()
    url = "https://martin-thoma.com/pdf/cv-curriculum-vitae.pdf"
    browser.get(url)  # Open a PDF page
    # el = browser.find_element_by_id("plugin")
    time.sleep(5)
    ActionChains(browser).send_keys(Keys.CONTROL, "s").perform()
    print(browser.current_url)
    time.sleep(60)  # Keep the browser open for 60s


def get_browser():
    """Get the browser (a "driver")."""
    # find the path with 'which chromedriver'
    path_to_chromedriver = ('/home/moose/GitHub/algorithms/scraping/'
                            'venv/bin/chromedriver')
    download_dir = "/home/moose/selenium-download/"
    print("Is directory: {}".format(os.path.isdir(download_dir)))

    fail = 6
    options = None
    desired_caps = None
    if fail == 1:
        # Fail (1)
        os.environ['XDG_DOWNLOAD_DIR'] = download_dir
    elif fail == 2:
        # Fail (2)
        options = webdriver.ChromeOptions()
        options.add_argument("download.default_directory={}"
                             .format(download_dir))
    elif fail == 3:
        # Fail (3)
        options = webdriver.ChromeOptions()
        prefs = {"download.default_directory": download_dir}
        options.add_experimental_option("prefs", prefs)
    elif fail == 4:
        # Fail (4)
        desired_caps = {'prefs':
                        {'download': {'default_directory': download_dir,
                                      'directory_upgrade': "true",
                                      'extensions_to_open': ""}}}
    elif fail == 5:
        # Fail (5)
        desired_caps = {'prefs':
                        {'download.default_directory': download_dir}}
    elif fail == 6:
        # Fail (6)
        desired_caps = {'prefs':
                        {'download': {'default_directory': download_dir,
                                      'directory_upgrade': True,
                                      'extensions_to_open': ""}}}

    browser = webdriver.Chrome(executable_path=path_to_chromedriver,
                               chrome_options=options,
                               desired_capabilities=desired_caps)
    return browser


if __name__ == '__main__':
    main()

我知道有更简单的方法可以通过 URL 下载 PDF。但是,我的实际用例要复杂得多,下载是由 javascript 生成的点击链接触发的,该链接背后的 3 步登录过程完全使用 JavaScript 完成。

所以这个问题有两个方面:

  1. 如何使用 Selenium 和 Chrome 更改默认下载目录(在 Ubuntu 16.04 上)?
  2. 如何下载打开的 PDF? (我尝试了一个动作链,但它不起作用)

我有Google Chrome Version 59.0.3071.115 (Official Build) (64-bit),通过 pip 安装程序下载。

【问题讨论】:

    标签: python google-chrome selenium download


    【解决方案1】:

    首先你需要

    from selenium.webdriver.chrome.options import Options

    并将get_browser() 中的整个 if 块和浏览器初始化更改为:

    chrome_options = Options()
    chrome_options.add_experimental_option('prefs', {
        "plugins.plugins_list": [{"enabled":False,"name":"Chrome PDF Viewer"}],
        "download": {
            "prompt_for_download": False,
            "default_directory"  : download_dir
        }
    })
    
    browser = webdriver.Chrome(path_to_chromedriver, chrome_options=chrome_options)
    

    (我使用的是 Windows,但应该没有任何区别。)

    【讨论】:

    • 在没有看到您的代码/实际用例的情况下很难说出问题所在。 pdf 是否与插件一起加载(即它没有嵌入,您会看到通常的下载、缩放等图标)?您是否一步登录并打开pdf(我正在考虑当您单击您无权访问的内容并弹出一个...错误...弹出的场景)?你必须使用chrome驱动程序吗?也许你可以使用火狐。同样的技巧也适用(显然设置偏好的方式有点不同)并且可能会解决您的问题。
    • (1) 我看到了通常的下载/缩放图标。 (2) 我刚刚意识到它在另一台机器上是“Chromium 版本 60.0.3112.78”。我会解决的。
    • 但是当我将chrome_options.add_argument("--headless")添加到chrome时它也不起作用:-(
    • 我不知道为什么它不起作用,所以让我们看看一些 hack。如果您将pdf打印成pdf怎么办?您可以添加参数以打印到 pdf 并隐藏即将打印的页面的预览,尽管您必须处理保存提示。
    猜你喜欢
    • 2020-07-16
    • 2018-01-19
    • 2019-05-28
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多